mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-25 00:07:47 +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