mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: feedback skeleton ui (#5727)
This adds component, which will allow to draw feedback component based on incoming data.
This commit is contained in:
		
							parent
							
								
									1dadd23594
								
							
						
					
					
						commit
						9d8487ad6e
					
				| @ -84,7 +84,7 @@ export const FilterDateItem: FC<IFilterDateItemProps> = ({ | |||||||
|                         const formattedValue = selectedDate |                         const formattedValue = selectedDate | ||||||
|                             ? format(selectedDate, 'yyyy-MM-dd') |                             ? format(selectedDate, 'yyyy-MM-dd') | ||||||
|                             : ''; |                             : ''; | ||||||
|                         onChange({ operator, values: [formattedValue] ?? [] }); |                         onChange({ operator, values: [formattedValue] }); | ||||||
|                     }} |                     }} | ||||||
|                 /> |                 /> | ||||||
|             </Box> |             </Box> | ||||||
|  | |||||||
							
								
								
									
										90
									
								
								frontend/src/component/feedbackNew/FeedbackComponent.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								frontend/src/component/feedbackNew/FeedbackComponent.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | |||||||
|  | import { Box, styled } from '@mui/material'; | ||||||
|  | import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; | ||||||
|  | import { useFeedback } from './useFeedback'; | ||||||
|  | 
 | ||||||
|  | export const StyledContainer = styled('div')(({ theme }) => ({ | ||||||
|  |     position: 'fixed', | ||||||
|  |     top: 0, | ||||||
|  |     right: 0, | ||||||
|  |     width: '496px', | ||||||
|  |     height: '100vh', | ||||||
|  |     opacity: 1, | ||||||
|  |     backgroundColor: theme.palette.primary.main, | ||||||
|  |     zIndex: theme.zIndex.sticky, | ||||||
|  | 
 | ||||||
|  |     '&::before': { | ||||||
|  |         content: '""', | ||||||
|  |         position: 'fixed', | ||||||
|  |         top: 0, | ||||||
|  |         right: '496px', | ||||||
|  |         width: '100vw', | ||||||
|  |         height: '100vh', | ||||||
|  |         backgroundColor: 'rgba(32, 32, 33, 0.40)', | ||||||
|  |     }, | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const StyledContent = styled('div')(({ theme }) => ({ | ||||||
|  |     display: 'flex', | ||||||
|  |     padding: theme.spacing(6), | ||||||
|  |     flexDirection: 'column', | ||||||
|  |     height: '100vh', | ||||||
|  |     justifyContent: 'center', | ||||||
|  |     alignItems: 'center', | ||||||
|  |     gap: theme.spacing(8.5), | ||||||
|  |     alignSelf: 'stretch', | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const StyledTitle = styled(Box)(({ theme }) => ({ | ||||||
|  |     color: '#fff', | ||||||
|  |     fontSize: theme.spacing(3), | ||||||
|  |     fontWeight: 400, | ||||||
|  |     lineHeight: theme.spacing(2.5), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const StyledForm = styled(Box)(({ theme }) => ({ | ||||||
|  |     display: 'flex', | ||||||
|  |     width: '400px', | ||||||
|  |     padding: theme.spacing(3), | ||||||
|  |     flexDirection: 'column', | ||||||
|  |     gap: theme.spacing(3), | ||||||
|  |     alignItems: 'flex-start', | ||||||
|  |     border: `1px solid ${theme.palette.divider}`, | ||||||
|  |     borderRadius: theme.spacing(1.5), | ||||||
|  |     borderColor: 'rgba(0, 0, 0, 0.12)', | ||||||
|  |     backgroundColor: '#fff', | ||||||
|  |     boxShadow: '0px 4px 4px 0px rgba(0, 0, 0, 0.12)', | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const FormTitle = styled(Box)(({ theme }) => ({ | ||||||
|  |     color: theme.palette.text.primary, | ||||||
|  |     fontSize: theme.spacing(2), | ||||||
|  |     lineHeight: theme.spacing(2.75), | ||||||
|  |     fontWeight: theme.typography.fontWeightBold, | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const FeedbackComponent = () => { | ||||||
|  |     const { feedbackData, showFeedback, closeFeedback } = useFeedback(); | ||||||
|  | 
 | ||||||
|  |     if (!feedbackData) return null; | ||||||
|  | 
 | ||||||
|  |     return ( | ||||||
|  |         <ConditionallyRender | ||||||
|  |             condition={showFeedback} | ||||||
|  |             show={ | ||||||
|  |                 <StyledContainer> | ||||||
|  |                     <StyledContent> | ||||||
|  |                         <StyledTitle>Help us to improve Unleash</StyledTitle> | ||||||
|  |                         <StyledForm> | ||||||
|  |                             <FormTitle> | ||||||
|  |                                 How easy wasy it to configure the strategy? | ||||||
|  |                             </FormTitle> | ||||||
|  |                         </StyledForm> | ||||||
|  |                     </StyledContent> | ||||||
|  |                     <button type='button' onClick={closeFeedback}> | ||||||
|  |                         Close Feedback | ||||||
|  |                     </button> | ||||||
|  |                 </StyledContainer> | ||||||
|  |             } | ||||||
|  |         /> | ||||||
|  |     ); | ||||||
|  | }; | ||||||
							
								
								
									
										34
									
								
								frontend/src/component/feedbackNew/FeedbackContext.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								frontend/src/component/feedbackNew/FeedbackContext.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | import { createContext } from 'react'; | ||||||
|  | import { ProvideFeedbackSchema } from '../../openapi'; | ||||||
|  | 
 | ||||||
|  | interface IFeedbackContext { | ||||||
|  |     feedbackData: ProvideFeedbackSchema; | ||||||
|  |     openFeedback: (data: ProvideFeedbackSchema) => void; | ||||||
|  |     closeFeedback: () => void; | ||||||
|  |     showFeedback: boolean; | ||||||
|  |     setShowFeedback: (visible: boolean) => void; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const DEFAULT_FEEDBACK_DATA = { | ||||||
|  |     category: 'general', | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const setShowFeedback = () => { | ||||||
|  |     throw new Error('setShowFeedback called outside FeedbackContext'); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const openFeedback = () => { | ||||||
|  |     throw new Error('openFeedback called outside FeedbackContext'); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const closeFeedback = () => { | ||||||
|  |     throw new Error('closeFeedback called outside FeedbackContext'); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export const FeedbackContext = createContext<IFeedbackContext>({ | ||||||
|  |     feedbackData: DEFAULT_FEEDBACK_DATA, | ||||||
|  |     showFeedback: true, | ||||||
|  |     setShowFeedback: setShowFeedback, | ||||||
|  |     openFeedback: openFeedback, | ||||||
|  |     closeFeedback: closeFeedback, | ||||||
|  | }); | ||||||
							
								
								
									
										36
									
								
								frontend/src/component/feedbackNew/FeedbackProvider.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								frontend/src/component/feedbackNew/FeedbackProvider.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | import { FeedbackComponent } from './FeedbackComponent'; | ||||||
|  | import { DEFAULT_FEEDBACK_DATA, FeedbackContext } from './FeedbackContext'; | ||||||
|  | import { FC, useState } from 'react'; | ||||||
|  | import { ProvideFeedbackSchema } from '../../openapi'; | ||||||
|  | 
 | ||||||
|  | export const FeedbackProvider: FC = ({ children }) => { | ||||||
|  |     const [feedbackData, setFeedbackData] = useState<ProvideFeedbackSchema>( | ||||||
|  |         DEFAULT_FEEDBACK_DATA, | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     const [showFeedback, setShowFeedback] = useState(false); | ||||||
|  |     const openFeedback = (data: ProvideFeedbackSchema) => { | ||||||
|  |         setFeedbackData(data); | ||||||
|  |         setShowFeedback(true); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     const closeFeedback = () => { | ||||||
|  |         setFeedbackData(DEFAULT_FEEDBACK_DATA); | ||||||
|  |         setShowFeedback(false); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     return ( | ||||||
|  |         <FeedbackContext.Provider | ||||||
|  |             value={{ | ||||||
|  |                 feedbackData, | ||||||
|  |                 openFeedback, | ||||||
|  |                 closeFeedback, | ||||||
|  |                 showFeedback, | ||||||
|  |                 setShowFeedback, | ||||||
|  |             }} | ||||||
|  |         > | ||||||
|  |             {children} | ||||||
|  |             <FeedbackComponent /> | ||||||
|  |         </FeedbackContext.Provider> | ||||||
|  |     ); | ||||||
|  | }; | ||||||
							
								
								
									
										10
									
								
								frontend/src/component/feedbackNew/useFeedback.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								frontend/src/component/feedbackNew/useFeedback.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | import { FeedbackContext } from './FeedbackContext'; | ||||||
|  | import { useContext } from 'react'; | ||||||
|  | 
 | ||||||
|  | export const useFeedback = () => { | ||||||
|  |     const context = useContext(FeedbackContext); | ||||||
|  |     if (!context) { | ||||||
|  |         throw new Error('useFeedback must be used within a FeedbackProvider'); | ||||||
|  |     } | ||||||
|  |     return context; | ||||||
|  | }; | ||||||
| @ -16,6 +16,7 @@ import { AnnouncerProvider } from 'component/common/Announcer/AnnouncerProvider/ | |||||||
| import { InstanceStatus } from 'component/common/InstanceStatus/InstanceStatus'; | import { InstanceStatus } from 'component/common/InstanceStatus/InstanceStatus'; | ||||||
| import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer'; | import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer'; | ||||||
| import { StickyProvider } from 'component/common/Sticky/StickyProvider'; | import { StickyProvider } from 'component/common/Sticky/StickyProvider'; | ||||||
|  | import { FeedbackProvider } from './component/feedbackNew/FeedbackProvider'; | ||||||
| 
 | 
 | ||||||
| window.global ||= window; | window.global ||= window; | ||||||
| 
 | 
 | ||||||
| @ -26,14 +27,16 @@ ReactDOM.render( | |||||||
|                 <QueryParamProvider adapter={ReactRouter6Adapter}> |                 <QueryParamProvider adapter={ReactRouter6Adapter}> | ||||||
|                     <ThemeProvider> |                     <ThemeProvider> | ||||||
|                         <AnnouncerProvider> |                         <AnnouncerProvider> | ||||||
|                             <FeedbackCESProvider> |                             <FeedbackProvider> | ||||||
|                                 <StickyProvider> |                                 <FeedbackCESProvider> | ||||||
|                                     <InstanceStatus> |                                     <StickyProvider> | ||||||
|                                         <ScrollTop /> |                                         <InstanceStatus> | ||||||
|                                         <App /> |                                             <ScrollTop /> | ||||||
|                                     </InstanceStatus> |                                             <App /> | ||||||
|                                 </StickyProvider> |                                         </InstanceStatus> | ||||||
|                             </FeedbackCESProvider> |                                     </StickyProvider> | ||||||
|  |                                 </FeedbackCESProvider> | ||||||
|  |                             </FeedbackProvider> | ||||||
|                         </AnnouncerProvider> |                         </AnnouncerProvider> | ||||||
|                     </ThemeProvider> |                     </ThemeProvider> | ||||||
|                 </QueryParamProvider> |                 </QueryParamProvider> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user