mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: connect sdk step 1 (#8042)
This commit is contained in:
		
							parent
							
								
									6030900b40
								
							
						
					
					
						commit
						82f9783fe6
					
				
							
								
								
									
										234
									
								
								frontend/src/component/onboarding/ConnectSDKDialog.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								frontend/src/component/onboarding/ConnectSDKDialog.tsx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,234 @@ | |||||||
|  | import { | ||||||
|  |     Box, | ||||||
|  |     Button, | ||||||
|  |     Dialog, | ||||||
|  |     styled, | ||||||
|  |     type Theme, | ||||||
|  |     Typography, | ||||||
|  | } from '@mui/material'; | ||||||
|  | import { SingleSelectConfigButton } from '../common/DialogFormTemplate/ConfigButtons/SingleSelectConfigButton'; | ||||||
|  | import EnvironmentsIcon from '@mui/icons-material/CloudCircle'; | ||||||
|  | import { useEffect, useState } from 'react'; | ||||||
|  | import { ProjectIcon } from 'component/common/ProjectIcon/ProjectIcon'; | ||||||
|  | import CodeIcon from '@mui/icons-material/Code'; | ||||||
|  | 
 | ||||||
|  | interface IConnectSDKDialogProps { | ||||||
|  |     open: boolean; | ||||||
|  |     onClose: () => void; | ||||||
|  |     project: string; | ||||||
|  |     environments: string[]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ConceptsDefinitions = styled('div')(({ theme }) => ({ | ||||||
|  |     backgroundColor: theme.palette.background.sidebar, | ||||||
|  |     padding: theme.spacing(8), | ||||||
|  |     flexBasis: '30%', | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const IconStyle = ({ theme }: { theme: Theme }) => ({ | ||||||
|  |     color: theme.palette.primary.contrastText, | ||||||
|  |     fontSize: theme.fontSizes.smallBody, | ||||||
|  |     marginTop: theme.spacing(0.5), | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const StyledProjectIcon = styled(ProjectIcon)(IconStyle); | ||||||
|  | const StyledEnvironmentsIcon = styled(EnvironmentsIcon)(IconStyle); | ||||||
|  | const StyledCodeIcon = styled(CodeIcon)(IconStyle); | ||||||
|  | 
 | ||||||
|  | const ConceptItem = styled('div')(({ theme }) => ({ | ||||||
|  |     display: 'flex', | ||||||
|  |     gap: theme.spacing(1.5), | ||||||
|  |     alignItems: 'flex-start', | ||||||
|  |     marginTop: theme.spacing(3), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const ConceptSummary = styled('div')(({ theme }) => ({ | ||||||
|  |     color: theme.palette.primary.contrastText, | ||||||
|  |     fontSize: theme.fontSizes.smallBody, | ||||||
|  |     fontWeight: theme.fontWeight.bold, | ||||||
|  |     marginBottom: theme.spacing(2), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const ConceptDetails = styled('p')(({ theme }) => ({ | ||||||
|  |     color: theme.palette.primary.contrastText, | ||||||
|  |     fontSize: theme.fontSizes.smallerBody, | ||||||
|  |     marginBottom: theme.spacing(2), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const APIKeyGeneration = styled('div')(({ theme }) => ({ | ||||||
|  |     backgroundColor: theme.palette.background.paper, | ||||||
|  |     display: 'flex', | ||||||
|  |     flexDirection: 'column', | ||||||
|  |     flexBasis: '70%', | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const SpacedContainer = styled('div')(({ theme }) => ({ | ||||||
|  |     padding: theme.spacing(5, 8, 3, 8), | ||||||
|  |     display: 'flex', | ||||||
|  |     flexDirection: 'column', | ||||||
|  |     gap: theme.spacing(3), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const StyledDialog = styled(Dialog)(({ theme }) => ({ | ||||||
|  |     '& .MuiDialog-paper': { | ||||||
|  |         borderRadius: theme.shape.borderRadiusLarge, | ||||||
|  |         maxWidth: theme.spacing(170), | ||||||
|  |         width: '100%', | ||||||
|  |         backgroundColor: 'transparent', | ||||||
|  |     }, | ||||||
|  |     padding: 0, | ||||||
|  |     '& .MuiPaper-root > section': { | ||||||
|  |         overflowX: 'hidden', | ||||||
|  |     }, | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const SectionHeader = styled('div')(({ theme }) => ({ | ||||||
|  |     fontWeight: theme.fontWeight.bold, | ||||||
|  |     marginBottom: theme.spacing(1), | ||||||
|  |     fontSize: theme.fontSizes.bodySize, | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const SectionDescription = styled('p')(({ theme }) => ({ | ||||||
|  |     color: theme.palette.text.secondary, | ||||||
|  |     fontSize: theme.fontSizes.smallBody, | ||||||
|  |     marginBottom: theme.spacing(2), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const NextStepSection = styled('div')(({ theme }) => ({ | ||||||
|  |     marginTop: 'auto', | ||||||
|  |     borderTop: `1px solid ${theme.palette.divider}}`, | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | const NextStepSectionSpacedContainer = styled('div')(({ theme }) => ({ | ||||||
|  |     display: 'flex', | ||||||
|  |     justifyContent: 'space-between', | ||||||
|  |     alignItems: 'center', | ||||||
|  |     padding: theme.spacing(3, 8, 3, 8), | ||||||
|  | })); | ||||||
|  | 
 | ||||||
|  | export const ConnectSDKDialog = ({ | ||||||
|  |     open, | ||||||
|  |     onClose, | ||||||
|  |     environments, | ||||||
|  | }: IConnectSDKDialogProps) => { | ||||||
|  |     const [environment, setEnvironment] = useState(''); | ||||||
|  |     const longestEnv = Math.max( | ||||||
|  |         ...environments.map((environment) => environment.length), | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     useEffect(() => { | ||||||
|  |         if (environments.length > 0) { | ||||||
|  |             setEnvironment(environments[0]); | ||||||
|  |         } | ||||||
|  |     }, [JSON.stringify(environments)]); | ||||||
|  | 
 | ||||||
|  |     return ( | ||||||
|  |         <StyledDialog open={open} onClose={onClose}> | ||||||
|  |             <Box sx={{ display: 'flex' }}> | ||||||
|  |                 <APIKeyGeneration> | ||||||
|  |                     <SpacedContainer> | ||||||
|  |                         <Typography variant='h2'> | ||||||
|  |                             Connect an SDK to Unleash | ||||||
|  |                         </Typography> | ||||||
|  |                         <Box> | ||||||
|  |                             <SectionHeader>Environment</SectionHeader> | ||||||
|  |                             <SectionDescription> | ||||||
|  |                                 The environment SDK will connect to in order to | ||||||
|  |                                 retrieve configuration. | ||||||
|  |                             </SectionDescription> | ||||||
|  |                             {environments.length > 0 ? ( | ||||||
|  |                                 <SingleSelectConfigButton | ||||||
|  |                                     tooltip={{ header: '' }} | ||||||
|  |                                     description='Select the environment where API key will be created' | ||||||
|  |                                     options={environments.map( | ||||||
|  |                                         (environment) => ({ | ||||||
|  |                                             label: environment, | ||||||
|  |                                             value: environment, | ||||||
|  |                                         }), | ||||||
|  |                                     )} | ||||||
|  |                                     onChange={(value: any) => { | ||||||
|  |                                         setEnvironment(value); | ||||||
|  |                                     }} | ||||||
|  |                                     button={{ | ||||||
|  |                                         label: environment, | ||||||
|  |                                         icon: <EnvironmentsIcon />, | ||||||
|  |                                         labelWidth: `${longestEnv + 5}ch`, | ||||||
|  |                                     }} | ||||||
|  |                                     search={{ | ||||||
|  |                                         label: 'Filter project mode options', | ||||||
|  |                                         placeholder: 'Select project mode', | ||||||
|  |                                     }} | ||||||
|  |                                 /> | ||||||
|  |                             ) : null} | ||||||
|  |                         </Box> | ||||||
|  | 
 | ||||||
|  |                         <Box sx={{ mt: 3 }}> | ||||||
|  |                             <SectionHeader>API Key</SectionHeader> | ||||||
|  |                             <SectionDescription> | ||||||
|  |                                 You currently have no active API keys for this | ||||||
|  |                                 project/environment combination. You'll need to | ||||||
|  |                                 generate and API key in order to proceed with | ||||||
|  |                                 connecting your SDK. | ||||||
|  |                             </SectionDescription> | ||||||
|  |                             <Button variant='contained'> | ||||||
|  |                                 Generate API Key | ||||||
|  |                             </Button> | ||||||
|  |                         </Box> | ||||||
|  |                     </SpacedContainer> | ||||||
|  | 
 | ||||||
|  |                     <NextStepSection> | ||||||
|  |                         <NextStepSectionSpacedContainer> | ||||||
|  |                             <Box> | ||||||
|  |                                 <b>Next:</b> Choose SDK and connect | ||||||
|  |                             </Box> | ||||||
|  |                             <Button variant='contained'>Next</Button> | ||||||
|  |                         </NextStepSectionSpacedContainer> | ||||||
|  |                     </NextStepSection> | ||||||
|  |                 </APIKeyGeneration> | ||||||
|  |                 <ConceptsDefinitions> | ||||||
|  |                     <ConceptItem> | ||||||
|  |                         <StyledProjectIcon /> | ||||||
|  |                         <Box> | ||||||
|  |                             <ConceptSummary> | ||||||
|  |                                 Flags live in projects | ||||||
|  |                             </ConceptSummary> | ||||||
|  |                             <ConceptDetails> | ||||||
|  |                                 Projects are containers for feature flags. When | ||||||
|  |                                 you create a feature flag it will belong to the | ||||||
|  |                                 project you create it in. | ||||||
|  |                             </ConceptDetails> | ||||||
|  |                         </Box> | ||||||
|  |                     </ConceptItem> | ||||||
|  |                     <ConceptItem> | ||||||
|  |                         <StyledEnvironmentsIcon /> | ||||||
|  |                         <Box> | ||||||
|  |                             <ConceptSummary> | ||||||
|  |                                 Flags have configuration in environments | ||||||
|  |                             </ConceptSummary> | ||||||
|  |                             <ConceptDetails> | ||||||
|  |                                 In Unleash you can have multiple environments. | ||||||
|  |                                 Each feature flag will have different | ||||||
|  |                                 configuration in every environment. | ||||||
|  |                             </ConceptDetails> | ||||||
|  |                         </Box> | ||||||
|  |                     </ConceptItem> | ||||||
|  |                     <ConceptItem> | ||||||
|  |                         <StyledCodeIcon /> | ||||||
|  |                         <Box> | ||||||
|  |                             <ConceptSummary> | ||||||
|  |                                 SDKs connect to Unleash to retrieve | ||||||
|  |                                 configuration | ||||||
|  |                             </ConceptSummary> | ||||||
|  |                             <ConceptDetails> | ||||||
|  |                                 When you connect an SDK to Unleash it will use | ||||||
|  |                                 the API key to deduce which feature flags to | ||||||
|  |                                 retrieve and from which environment to retrieve | ||||||
|  |                                 configuration. | ||||||
|  |                             </ConceptDetails> | ||||||
|  |                         </Box> | ||||||
|  |                     </ConceptItem> | ||||||
|  |                 </ConceptsDefinitions> | ||||||
|  |             </Box> | ||||||
|  |         </StyledDialog> | ||||||
|  |     ); | ||||||
|  | }; | ||||||
| @ -42,6 +42,7 @@ import { AvatarCell } from './AvatarCell'; | |||||||
| import { ProjectOnboarding } from './ProjectOnboarding/ProjectOnboarding'; | import { ProjectOnboarding } from './ProjectOnboarding/ProjectOnboarding'; | ||||||
| import { useUiFlag } from 'hooks/useUiFlag'; | import { useUiFlag } from 'hooks/useUiFlag'; | ||||||
| import { styled } from '@mui/material'; | import { styled } from '@mui/material'; | ||||||
|  | import { ConnectSDKDialog } from '../../../onboarding/ConnectSDKDialog'; | ||||||
| 
 | 
 | ||||||
| interface IPaginatedProjectFeatureTogglesProps { | interface IPaginatedProjectFeatureTogglesProps { | ||||||
|     environments: string[]; |     environments: string[]; | ||||||
| @ -489,6 +490,13 @@ export const ProjectFeatureToggles = ({ | |||||||
|                     {rowActionsDialogs} |                     {rowActionsDialogs} | ||||||
| 
 | 
 | ||||||
|                     {featureToggleModals} |                     {featureToggleModals} | ||||||
|  | 
 | ||||||
|  |                     <ConnectSDKDialog | ||||||
|  |                         open={false} | ||||||
|  |                         onClose={() => {}} | ||||||
|  |                         project={projectId} | ||||||
|  |                         environments={environments} | ||||||
|  |                     /> | ||||||
|                 </div> |                 </div> | ||||||
|             </PageContent> |             </PageContent> | ||||||
|             <BatchSelectionActionsBar count={selectedData.length}> |             <BatchSelectionActionsBar count={selectedData.length}> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user