import { useFlashKey } from '@/util/useFlash' import { hostname } from '@/util/validation' import { zodResolver } from '@hookform/resolvers/zod' import { FormProvider, useForm } from 'react-hook-form' import { useTranslation } from 'react-i18next' import { z } from 'zod' import createNode from '@/api/admin/nodes/createNode' import useNodesSWR from '@/api/admin/nodes/useNodesSWR' import FlashMessageRender from '@/components/elements/FlashMessageRenderer' import MessageBox from '@/components/elements/MessageBox' import Modal from '@/components/elements/Modal' import CheckboxForm from '@/components/elements/forms/CheckboxForm' import TextInputForm from '@/components/elements/forms/TextInputForm' import LocationsSelectForm from '@/components/admin/nodes/LocationsSelectForm' interface Props { open: boolean onClose: () => void } const CreateNodeModal = ({ open, onClose }: Props) => { const { clearFlashes, clearAndAddHttpError } = useFlashKey( 'admin.nodes.index.create' ) const { mutate } = useNodesSWR({ page: 1, query: '' }) const { t: tStrings } = useTranslation('strings') const { t } = useTranslation('admin.nodes.index') const schema = z.object({ name: z.string().min(1).max(191), locationId: z.preprocess(Number, z.number()), cluster: z.string().min(1).max(191), verifyTls: z.boolean(), tokenId: z.string().min(1).max(191), secret: z.string().min(1).max(191), fqdn: hostname().min(1).max(191), port: z.preprocess(Number, z.number().int().min(1).max(65535)), memory: z.preprocess(Number, z.number().int().min(0)), memoryOverallocate: z.preprocess(Number, z.number().int().min(0)), disk: z.preprocess(Number, z.number().int().min(0)), diskOverallocate: z.preprocess(Number, z.number().int().min(0)), vmStorage: z.string().min(1).max(191), backupStorage: z.string().min(1).max(191), isoStorage: z.string().min(1).max(191), network: z.string().min(1).max(191), }) const form = useForm({ resolver: zodResolver(schema), defaultValues: { name: '', locationId: '0', cluster: '', verifyTls: true, tokenId: '', secret: '', fqdn: '', port: '8006', memory: '0', memoryOverallocate: '0', disk: '0', diskOverallocate: '0', vmStorage: '', backupStorage: '', isoStorage: '', network: '', }, }) const handleClose = () => { clearFlashes() form.reset() onClose() } const submit = async (_data: any) => { const { memory, disk, ...data } = _data as z.infer clearFlashes() try { const node = await createNode({ memory: memory * 1048576, disk: disk * 1048576, ...data, }) mutate(data => { if (!data) return data return { ...data, items: [node, ...data.items], } }, false) handleClose() } catch (error) { clearAndAddHttpError(error as Error) } } return ( {t('create_modal.title')}
{t('creds_warning')}
{tStrings('cancel')} {tStrings('create')}
) } export default CreateNodeModal