1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-11-10 01:19:53 +01:00
unleash.unleash/frontend/src/component/changeRequest/ChangeRequestSidebar/ChangeRequestSidebar.tsx
2022-12-13 09:17:17 +01:00

166 lines
5.1 KiB
TypeScript

import { FC, VFC } from 'react';
import { Box, Button, styled, Typography, useTheme } from '@mui/material';
import { DynamicSidebarModal } from 'component/common/SidebarModal/SidebarModal';
import { PageContent } from 'component/common/PageContent/PageContent';
import { PageHeader } from 'component/common/PageHeader/PageHeader';
import { CheckCircle } from '@mui/icons-material';
import { ChangeRequest } from '../ChangeRequest/ChangeRequest';
import { usePendingChangeRequests } from 'hooks/api/getters/usePendingChangeRequests/usePendingChangeRequests';
import { useChangeRequestApi } from 'hooks/api/actions/useChangeRequestApi/useChangeRequestApi';
import useToast from 'hooks/useToast';
import { formatUnknownError } from 'utils/formatUnknownError';
import { EnvironmentChangeRequest } from './EnvironmentChangeRequest/EnvironmentChangeRequest';
import { ReviewChangesHeader } from './ReviewChangesHeader/ReviewChangesHeader';
interface IChangeRequestSidebarProps {
open: boolean;
project: string;
onClose: () => void;
}
const StyledPageContent = styled(PageContent)(({ theme }) => ({
height: '100vh',
overflow: 'auto',
minWidth: '50vw',
padding: theme.spacing(6),
[theme.breakpoints.down('md')]: {
padding: theme.spacing(4, 2),
},
'& .header': {
padding: theme.spacing(0, 0, 2, 0),
},
'& .body': {
padding: theme.spacing(3, 0, 0, 0),
},
borderRadius: `${theme.spacing(1.5, 0, 0, 1.5)} !important`,
}));
const BackButton = styled(Button)(({ theme }) => ({
marginTop: theme.spacing(2),
marginLeft: 'auto',
}));
export const StyledSuccessIcon = styled(CheckCircle)(({ theme }) => ({
color: theme.palette.success.main,
height: '32px',
width: '32px',
marginRight: theme.spacing(1),
}));
export const StyledFlexAlignCenterBox = styled(Box)(() => ({
marginLeft: 'auto',
display: 'flex',
alignItems: 'center',
}));
export const Separator = () => (
<Typography
component="span"
sx={{
marginLeft: 1.5,
marginRight: 1.5,
color: 'dividerAlternative',
}}
>
|
</Typography>
);
export const UpdateCount: FC<{ count: number }> = ({ count }) => (
<Box>
<Typography component="span" variant="body1" color="text.secondary">
Updates:{' '}
</Typography>
<Typography
component="span"
sx={{
fontWeight: 'bold',
}}
>
{count} {count === 1 ? 'feature toggle' : 'feature toggles'}
</Typography>
</Box>
);
export const ChangeRequestSidebar: VFC<IChangeRequestSidebarProps> = ({
open,
project,
onClose,
}) => {
const {
data,
loading,
refetch: refetchChangeRequest,
} = usePendingChangeRequests(project);
const { changeState, discardDraft } = useChangeRequestApi();
const { setToastApiError } = useToast();
const onReview = async (draftId: number) => {
try {
await changeState(project, draftId, { state: 'In review' });
refetchChangeRequest();
} catch (error: unknown) {
setToastApiError(formatUnknownError(error));
}
};
const onDiscard = async (draftId: number) => {
try {
await discardDraft(project, draftId);
refetchChangeRequest();
} catch (error: unknown) {
setToastApiError(formatUnknownError(error));
}
};
if (!loading && !data) {
return (
<DynamicSidebarModal
open={open}
onClose={onClose}
label="Review changes"
>
<StyledPageContent
disableBorder={true}
header={
<PageHeader titleElement="Review your changes"></PageHeader>
}
>
There are no changes to review.
{/* FIXME: empty state */}
<BackButton onClick={onClose}>Close</BackButton>
</StyledPageContent>
</DynamicSidebarModal>
);
}
return (
<DynamicSidebarModal
open={open}
onClose={onClose}
label="Review changes"
>
<StyledPageContent
disableBorder={true}
header={<ReviewChangesHeader />}
>
{data?.map(environmentChangeRequest => (
<EnvironmentChangeRequest
key={environmentChangeRequest.id}
environmentChangeRequest={environmentChangeRequest}
onClose={onClose}
onReview={onReview}
onDiscard={onDiscard}
>
<ChangeRequest
changeRequest={environmentChangeRequest}
onNavigate={onClose}
onRefetch={refetchChangeRequest}
/>
</EnvironmentChangeRequest>
))}
</StyledPageContent>
</DynamicSidebarModal>
);
};