import { type FC, Fragment, useMemo, useState, type VFC } from 'react';
import { Box, Button, styled, Typography } from '@mui/material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { ChangeRequestSidebar } from 'component/changeRequest/ChangeRequestSidebar/ChangeRequestSidebar';
import { usePendingChangeRequests } from 'hooks/api/getters/usePendingChangeRequests/usePendingChangeRequests';
import type { ChangeRequestType } from 'component/changeRequest/changeRequest.types';
import { changesCount } from 'component/changeRequest/changesCount';
import { Sticky } from 'component/common/Sticky/Sticky';
import { useUiFlag } from 'hooks/useUiFlag';
interface IDraftBannerProps {
project: string;
}
const StyledDraftBannerContentWrapper = styled(Box)(({ theme }) => ({
display: 'flex',
alignItems: 'center',
padding: theme.spacing(1, 0),
}));
const OldStyledDraftBanner = styled(Box)(({ theme }) => ({
maxWidth: '1512px',
paddingLeft: theme.spacing(2),
paddingRight: theme.spacing(2),
marginLeft: 'auto',
marginRight: 'auto',
[theme.breakpoints.down(1024)]: {
width: '100%',
marginLeft: 0,
marginRight: 0,
},
[theme.breakpoints.down('sm')]: {
minWidth: '100%',
},
}));
const StyledDraftBanner = styled(Box)(({ theme }) => ({
width: '100%',
paddingLeft: theme.spacing(3),
paddingRight: theme.spacing(9),
marginLeft: 'auto',
marginRight: 'auto',
[theme.breakpoints.down('lg')]: {
marginLeft: 0,
marginRight: 0,
paddingLeft: theme.spacing(2),
paddingRight: theme.spacing(2),
},
[theme.breakpoints.down('sm')]: {
minWidth: '100%',
},
}));
const DraftBannerContent: FC<{
changeRequests: ChangeRequestType[];
onClick: () => void;
}> = ({ changeRequests, onClick }) => {
const sidebarNavigationEnabled = useUiFlag('navigationSidebar');
const environments = changeRequests.map(({ environment }) => environment);
const allChangesCount = changeRequests.reduce(
(acc, curr) => acc + changesCount(curr),
0,
);
const showOneLongExplanation =
changeRequests.length === 1 &&
['Draft', 'In review', 'Approved'].includes(changeRequests[0].state);
const explanation = showOneLongExplanation
? {
Draft: ' that need to be reviewed',
'In review': ' that are in review',
Approved:
' that are approved. Adding more changes will clear the approvals and require a new review',
}[changeRequests[0].state as 'Draft' | 'In review' | 'Approved']
: '';
const Banner = sidebarNavigationEnabled
? StyledDraftBanner
: OldStyledDraftBanner;
return (
Change request mode – You have changes{' '}
in{' '}
{environments.map((env, i) =>
i === 0 ? (
{env}
) : (
{i === environments.length - 1
? ' and '
: ', '}
{env}
),
)}
>
}
/>
{explanation}.
);
};
const StickyBanner = styled(Sticky)(({ theme }) => ({
borderTop: `1px solid ${theme.palette.warning.border}`,
borderBottom: `1px solid ${theme.palette.warning.border}`,
color: theme.palette.warning.contrastText,
backgroundColor: theme.palette.warning.light,
zIndex: 250,
}));
export const DraftBanner: VFC = ({ project }) => {
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
const { data, loading } = usePendingChangeRequests(project);
const unfinishedChangeRequests = useMemo(
() =>
data?.filter((changeRequest) =>
['Draft', 'In review', 'Approved'].includes(
changeRequest.state,
),
),
[data],
);
if ((!loading && !data) || data?.length === 0) {
return null;
}
return (
{
setIsSidebarOpen(true);
}}
/>
}
/>
{
setIsSidebarOpen(false);
}}
/>
);
};