mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: welcome dialog with unleash concepts (#8199)
This commit is contained in:
		
							parent
							
								
									e3a8dafe6d
								
							
						
					
					
						commit
						375395bba7
					
				
							
								
								
									
										
											BIN
										
									
								
								frontend/src/assets/img/onboardingConcepts.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								frontend/src/assets/img/onboardingConcepts.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 137 KiB  | 
@ -165,7 +165,7 @@ export const PrimaryNavigationList: FC<{
 | 
				
			|||||||
            {personalDashboardUIEnabled ? (
 | 
					            {personalDashboardUIEnabled ? (
 | 
				
			||||||
                <DynamicListItem
 | 
					                <DynamicListItem
 | 
				
			||||||
                    href='/personal'
 | 
					                    href='/personal'
 | 
				
			||||||
                    text='Personal Dahsboard'
 | 
					                    text='Personal Dashboard'
 | 
				
			||||||
                    onClick={() => onClick('/personal')}
 | 
					                    onClick={() => onClick('/personal')}
 | 
				
			||||||
                    selected={activeItem === '/personal'}
 | 
					                    selected={activeItem === '/personal'}
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,8 @@ import LinkIcon from '@mui/icons-material/Link';
 | 
				
			|||||||
import { Badge } from '../common/Badge/Badge';
 | 
					import { Badge } from '../common/Badge/Badge';
 | 
				
			||||||
import { ConnectSDK, CreateFlag } from './ConnectSDK';
 | 
					import { ConnectSDK, CreateFlag } from './ConnectSDK';
 | 
				
			||||||
import { PlaceholderFlagMetricsChart } from './FlagMetricsChart';
 | 
					import { PlaceholderFlagMetricsChart } from './FlagMetricsChart';
 | 
				
			||||||
 | 
					import { WelcomeDialog } from './WelcomeDialog';
 | 
				
			||||||
 | 
					import { useLocalStorageState } from 'hooks/useLocalStorageState';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ScreenExplanation = styled(Typography)(({ theme }) => ({
 | 
					const ScreenExplanation = styled(Typography)(({ theme }) => ({
 | 
				
			||||||
    marginTop: theme.spacing(1),
 | 
					    marginTop: theme.spacing(1),
 | 
				
			||||||
@ -139,6 +141,10 @@ export const PersonalDashboard = () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const { projects, activeProject, setActiveProject } = useProjects();
 | 
					    const { projects, activeProject, setActiveProject } = useProjects();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const [welcomeDialog, setWelcomeDialog] = useLocalStorageState<
 | 
				
			||||||
 | 
					        'seen' | 'not_seen'
 | 
				
			||||||
 | 
					    >('welcome-dialog:v1', 'not_seen');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
            <Typography component='h2' variant='h2'>
 | 
					            <Typography component='h2' variant='h2'>
 | 
				
			||||||
@ -247,6 +253,10 @@ export const PersonalDashboard = () => {
 | 
				
			|||||||
                    <PlaceholderFlagMetricsChart />
 | 
					                    <PlaceholderFlagMetricsChart />
 | 
				
			||||||
                </SpacedGridItem>
 | 
					                </SpacedGridItem>
 | 
				
			||||||
            </ContentGrid>
 | 
					            </ContentGrid>
 | 
				
			||||||
 | 
					            <WelcomeDialog
 | 
				
			||||||
 | 
					                open={welcomeDialog !== 'seen'}
 | 
				
			||||||
 | 
					                onClose={() => setWelcomeDialog('seen')}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										110
									
								
								frontend/src/component/personalDashboard/WelcomeDialog.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								frontend/src/component/personalDashboard/WelcomeDialog.tsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,110 @@
 | 
				
			|||||||
 | 
					import { Box, Button, Dialog, styled, Typography } from '@mui/material';
 | 
				
			||||||
 | 
					import type { FC } from 'react';
 | 
				
			||||||
 | 
					import { ReactComponent as UnleashLogo } from 'assets/img/logoDarkWithText.svg';
 | 
				
			||||||
 | 
					import { ReactComponent as UnleashLogoWhite } from 'assets/img/logoWithWhiteText.svg';
 | 
				
			||||||
 | 
					import { ThemeMode } from '../common/ThemeMode/ThemeMode';
 | 
				
			||||||
 | 
					import onboardingConcepts from 'assets/img/onboardingConcepts.png';
 | 
				
			||||||
 | 
					import { ScreenReaderOnly } from '../common/ScreenReaderOnly/ScreenReaderOnly';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const StyledDialog = styled(Dialog)(({ theme }) => ({
 | 
				
			||||||
 | 
					    '& .MuiDialog-paper': {
 | 
				
			||||||
 | 
					        borderRadius: theme.shape.borderRadiusLarge,
 | 
				
			||||||
 | 
					        maxWidth: theme.spacing(140),
 | 
				
			||||||
 | 
					        width: '100%',
 | 
				
			||||||
 | 
					        backgroundColor: 'transparent',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    padding: 0,
 | 
				
			||||||
 | 
					    '& .MuiPaper-root > section': {
 | 
				
			||||||
 | 
					        overflowX: 'hidden',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const StyledUnleashLogoWhite = styled(UnleashLogoWhite)({ width: '150px' });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const StyledUnleashLogo = styled(UnleashLogo)({ width: '150px' });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ContentWrapper = styled(Box)(({ theme }) => ({
 | 
				
			||||||
 | 
					    display: 'flex',
 | 
				
			||||||
 | 
					    gap: theme.spacing(4),
 | 
				
			||||||
 | 
					    flexDirection: 'column',
 | 
				
			||||||
 | 
					    padding: theme.spacing(4, 12),
 | 
				
			||||||
 | 
					    alignItems: 'center',
 | 
				
			||||||
 | 
					    backgroundColor: theme.palette.background.paper,
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const WelcomeLine = styled(Box)({
 | 
				
			||||||
 | 
					    display: 'flex',
 | 
				
			||||||
 | 
					    alignItems: 'center',
 | 
				
			||||||
 | 
					    justifyContent: 'center',
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const StyledImg = styled('img')({
 | 
				
			||||||
 | 
					    width: '100%',
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IWelcomeDialogProps {
 | 
				
			||||||
 | 
					    open: boolean;
 | 
				
			||||||
 | 
					    onClose: () => void;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const WelcomeDialog: FC<IWelcomeDialogProps> = ({ open, onClose }) => {
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <StyledDialog open={open} onClose={onClose}>
 | 
				
			||||||
 | 
					            <ContentWrapper>
 | 
				
			||||||
 | 
					                <WelcomeLine>
 | 
				
			||||||
 | 
					                    <Typography variant='h2'>Welcome to</Typography>
 | 
				
			||||||
 | 
					                    <ThemeMode
 | 
				
			||||||
 | 
					                        darkmode={<StyledUnleashLogoWhite />}
 | 
				
			||||||
 | 
					                        lightmode={<StyledUnleashLogo />}
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
 | 
					                </WelcomeLine>
 | 
				
			||||||
 | 
					                <Box>
 | 
				
			||||||
 | 
					                    Here are the concepts you{' '}
 | 
				
			||||||
 | 
					                    <Typography
 | 
				
			||||||
 | 
					                        component='span'
 | 
				
			||||||
 | 
					                        color='primary'
 | 
				
			||||||
 | 
					                        fontWeight='bold'
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                        must understand
 | 
				
			||||||
 | 
					                    </Typography>{' '}
 | 
				
			||||||
 | 
					                    in order to work effectively with Unleash
 | 
				
			||||||
 | 
					                </Box>
 | 
				
			||||||
 | 
					                <StyledImg src={onboardingConcepts} />
 | 
				
			||||||
 | 
					                <ScreenReaderOnly>
 | 
				
			||||||
 | 
					                    <h2>Environments</h2>
 | 
				
			||||||
 | 
					                    <p>
 | 
				
			||||||
 | 
					                        Unleash comes with two global environments. Once you
 | 
				
			||||||
 | 
					                        create a feature flag it will exist in all environments,
 | 
				
			||||||
 | 
					                        but it will hold different configuration per
 | 
				
			||||||
 | 
					                        environment.
 | 
				
			||||||
 | 
					                    </p>
 | 
				
			||||||
 | 
					                    <h2>Projects</h2>
 | 
				
			||||||
 | 
					                    <p>
 | 
				
			||||||
 | 
					                        Feature flags live in projects. When SDKs connect to
 | 
				
			||||||
 | 
					                        Unleash they use an environment /project combination in
 | 
				
			||||||
 | 
					                        order to retrieve the correct configuration. You can
 | 
				
			||||||
 | 
					                        also use projects to control access level for feature
 | 
				
			||||||
 | 
					                        flags.
 | 
				
			||||||
 | 
					                    </p>
 | 
				
			||||||
 | 
					                    <h2>Feature flags</h2>
 | 
				
			||||||
 | 
					                    <p>
 | 
				
			||||||
 | 
					                        Flags live in projects and across all configured
 | 
				
			||||||
 | 
					                        environments. Each flag will have separate configuration
 | 
				
			||||||
 | 
					                        in each environment enabled for the project that they
 | 
				
			||||||
 | 
					                        live in.
 | 
				
			||||||
 | 
					                    </p>
 | 
				
			||||||
 | 
					                    <h2>Activation strategy</h2>
 | 
				
			||||||
 | 
					                    <p>
 | 
				
			||||||
 | 
					                        Activation strategies are rulesets that decide whether
 | 
				
			||||||
 | 
					                        or not a feature flag should be enabled in a specific
 | 
				
			||||||
 | 
					                        environment. You can configure as many rulesets as you
 | 
				
			||||||
 | 
					                        want per environment.
 | 
				
			||||||
 | 
					                    </p>
 | 
				
			||||||
 | 
					                </ScreenReaderOnly>
 | 
				
			||||||
 | 
					                <Button variant='contained' onClick={onClose}>
 | 
				
			||||||
 | 
					                    Got it, let's get started
 | 
				
			||||||
 | 
					                </Button>
 | 
				
			||||||
 | 
					            </ContentWrapper>
 | 
				
			||||||
 | 
					        </StyledDialog>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user