1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-04-01 01:18:10 +02:00
unleash.unleash/frontend/src/component/releases/ReleasePlanTemplate/CreateReleasePlanTemplate.tsx

110 lines
3.6 KiB
TypeScript

import { usePageTitle } from 'hooks/usePageTitle';
import { Button, styled } from '@mui/material';
import { TemplateForm } from './TemplateForm/TemplateForm';
import { useTemplateForm } from '../hooks/useTemplateForm';
import { CreateButton } from 'component/common/CreateButton/CreateButton';
import { RELEASE_PLAN_TEMPLATE_CREATE } from '@server/types/permissions';
import { useNavigate } from 'react-router-dom';
import { GO_BACK } from 'constants/navigate';
import useReleasePlanTemplatesApi from 'hooks/api/actions/useReleasePlanTemplatesApi/useReleasePlanTemplatesApi';
import { scrollToTop } from 'component/common/util';
import useToast from 'hooks/useToast';
import { formatUnknownError } from 'utils/formatUnknownError';
import { useUiFlag } from 'hooks/useUiFlag';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
const StyledButtonContainer = styled('div')(() => ({
marginTop: 'auto',
display: 'flex',
justifyContent: 'flex-end',
}));
const StyledCancelButton = styled(Button)(({ theme }) => ({
marginLeft: theme.spacing(3),
}));
export const CreateReleasePlanTemplate = () => {
const { uiConfig, isEnterprise } = useUiConfig();
const releasePlansEnabled = useUiFlag('releasePlans');
const { setToastApiError, setToastData } = useToast();
const navigate = useNavigate();
const { createReleasePlanTemplate } = useReleasePlanTemplatesApi();
usePageTitle('Create release plan template');
const {
name,
setName,
description,
setDescription,
milestones,
setMilestones,
errors,
clearErrors,
validate,
getTemplatePayload,
} = useTemplateForm();
const handleCancel = () => {
navigate(GO_BACK);
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
clearErrors();
const isValid = validate();
if (isValid) {
try {
const template = await createReleasePlanTemplate(
getTemplatePayload(),
);
scrollToTop();
setToastData({
type: 'success',
text: 'Release plan template created',
});
navigate('/release-management');
} catch (error: unknown) {
setToastApiError(formatUnknownError(error));
}
}
};
const formatApiCode = () => `curl --location --request POST '${
uiConfig.unleashUrl
}/api/admin/release-plan-templates' \\
--header 'Authorization: INSERT_API_KEY' \\
--header 'Content-Type: application/json' \\
--data-raw '${JSON.stringify(getTemplatePayload(), undefined, 2)}'`;
if (!releasePlansEnabled || !isEnterprise()) {
return null;
}
return (
<TemplateForm
name={name}
setName={setName}
description={description}
setDescription={setDescription}
milestones={milestones}
setMilestones={setMilestones}
errors={errors}
clearErrors={clearErrors}
formTitle='Create release plan template'
formatApiCode={formatApiCode}
handleSubmit={handleSubmit}
>
<StyledButtonContainer>
<CreateButton
name='template'
permission={RELEASE_PLAN_TEMPLATE_CREATE}
>
Save template
</CreateButton>
<StyledCancelButton onClick={handleCancel}>
Cancel
</StyledCancelButton>
</StyledButtonContainer>
</TemplateForm>
);
};