misc_pterodactyl-panel/resources/scripts/components/admin/nests/NewEggContainer.tsx

120 lines
4.2 KiB
TypeScript
Raw Permalink Normal View History

import type { FormikHelpers } from 'formik';
import { Form, Formik } from 'formik';
import { useRef } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import tw from 'twin.macro';
import { object } from 'yup';
import createEgg from '@/api/admin/eggs/createEgg';
import AdminContentBlock from '@/components/admin/AdminContentBlock';
2023-01-12 19:12:06 +00:00
import type { EggProcessContainerRef } from '@/components/admin/nests/eggs/EggSettingsContainer';
import {
EggImageContainer,
EggInformationContainer,
EggLifecycleContainer,
EggProcessContainer,
EggStartupContainer,
} from '@/components/admin/nests/eggs/EggSettingsContainer';
import { Button } from '@/components/elements/button';
import FlashMessageRender from '@/components/FlashMessageRender';
import useFlash from '@/plugins/useFlash';
interface Values {
name: string;
description: string;
startup: string;
dockerImages: string;
configStop: string;
configStartup: string;
configFiles: string;
}
export default () => {
const navigate = useNavigate();
const params = useParams<{ nestId: string }>();
const { clearFlashes, clearAndAddHttpError } = useFlash();
const ref = useRef<EggProcessContainerRef>();
const submit = async (values: Values, { setSubmitting }: FormikHelpers<Values>) => {
clearFlashes('egg:create');
const nestId = Number(params.nestId);
values.configStartup = (await ref.current?.getStartupConfiguration()) || '';
values.configFiles = (await ref.current?.getFilesConfiguration()) || '';
const dockerImages: Record<string, string> = {};
values.dockerImages.split('\n').forEach(v => {
dockerImages[v] = v;
});
createEgg({
...values,
dockerImages,
nestId,
})
.then(egg => navigate(`/admin/nests/${nestId}/eggs/${egg.id}`))
.catch(error => {
console.error(error);
clearAndAddHttpError({ key: 'egg:create', error });
})
.then(() => setSubmitting(false));
};
return (
<AdminContentBlock title={'New Egg'}>
<div css={tw`w-full flex flex-row items-center mb-8`}>
<div css={tw`flex flex-col flex-shrink`} style={{ minWidth: '0' }}>
<h2 css={tw`text-2xl text-neutral-50 font-header font-medium`}>New Egg</h2>
<p css={tw`text-base text-neutral-400 whitespace-nowrap overflow-ellipsis overflow-hidden`}>
Add a new egg to the panel.
</p>
</div>
</div>
<FlashMessageRender key={'egg:create'} css={tw`mb-4`} />
<Formik
onSubmit={submit}
initialValues={{
name: '',
description: '',
startup: '',
dockerImages: '',
configStop: '',
configStartup: '{}',
configFiles: '{}',
}}
validationSchema={object().shape({})}
>
{({ isSubmitting, isValid }) => (
<Form>
<div css={tw`grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 mb-6`}>
<EggInformationContainer />
</div>
<EggStartupContainer css={tw`mb-6`} />
<div css={tw`grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 mb-6`}>
<EggImageContainer />
<EggLifecycleContainer />
</div>
<EggProcessContainer ref={ref} css={tw`mb-6`} />
<div css={tw`bg-neutral-700 rounded shadow-md py-2 px-6 mb-16`}>
<div css={tw`flex flex-row`}>
<Button type="submit" css={tw`ml-auto`} disabled={isSubmitting || !isValid}>
Create
</Button>
</div>
</div>
</Form>
)}
</Formik>
</AdminContentBlock>
);
};