import * as React from 'react';
import { Box, Flex, SimpleGrid, useDisclosure, useToast } from '@chakra-ui/react';
import axios from 'axios';
import { Formik, FormikProps } from 'formik';
import { useTranslation } from 'react-i18next';
import * as Yup from 'yup';
import RolesInput from './RolesInput';
import ScriptFileInput from './ScripFile';
import ScriptUploadField from './UploadField';
import { CreateButton } from 'components/Buttons/CreateButton';
import { SaveButton } from 'components/Buttons/SaveButton';
import { NumberField } from 'components/Form/Fields/NumberField';
import { SelectField } from 'components/Form/Fields/SelectField';
import { StringField } from 'components/Form/Fields/StringField';
import { ToggleField } from 'components/Form/Fields/ToggleField';
import { ConfirmCloseAlertModal } from 'components/Modals/ConfirmCloseAlert';
import { Modal } from 'components/Modals/Modal';
import { useAuth } from 'contexts/AuthProvider';
import { Script, useCreateScript } from 'hooks/Network/Scripts';
import { useFormModal } from 'hooks/useFormModal';
import { useFormRef } from 'hooks/useFormRef';
export const ScriptSchema = (t: (str: string) => string, defaultAuthor?: string) =>
Yup.object()
.shape({
name: Yup.string().required(t('form.required')),
description: Yup.string(),
deferred: Yup.boolean().required(t('form.required')),
author: Yup.string().required(t('form.required')),
type: Yup.string().required(t('form.required')),
content: Yup.string().required(t('form.required')),
timeout: Yup.number().when('deferred', {
is: false,
then: Yup.number()
.required(t('form.required'))
.moreThan(10)
.lessThan(5 * 60), // 5 mins
}),
version: Yup.string().min(1, t('form.required')).max(15, '15 chars. limit').required(t('form.required')),
uri: Yup.string(),
defaultUploadDestination: Yup.string(),
})
.default({
name: '',
description: '',
content: '',
author: defaultAuthor,
deferred: false,
timeout: 30,
type: 'shell',
version: '1.0.0',
restricted: ['root'],
});
type Props = {
onIdSelect: (newId: string) => void;
};
const CreateScriptButton = ({ onIdSelect }: Props) => {
const { t } = useTranslation();
const toast = useToast();
const { user } = useAuth();
const modalProps = useDisclosure();
const create = useCreateScript();
const { form, formRef } = useFormRef();
const { isConfirmOpen, closeConfirm, closeModal, closeCancelAndForm } = useFormModal({
isDirty: form?.dirty,
onModalClose: modalProps.onClose,
});
const isDisabled = false;
return (
<>
}
>
enableReinitialize
innerRef={formRef as React.Ref>}
initialValues={ScriptSchema(t, user?.email).cast()}
validationSchema={ScriptSchema(t, user?.email)}
onSubmit={(data, { setSubmitting, resetForm }) => {
create.mutateAsync(
{ ...data, author: user?.email },
{
onSuccess: (response) => {
toast({
id: `script-create-success`,
title: t('common.success'),
description: t('script.create_success'),
status: 'success',
duration: 5000,
isClosable: true,
position: 'top-right',
});
setSubmitting(false);
resetForm();
modalProps.onClose();
onIdSelect(response.id);
},
onError: (e) => {
setSubmitting(false);
if (axios.isAxiosError(e))
toast({
id: `script-create-error`,
title: t('common.error'),
description: e?.response?.data?.ErrorDescription,
status: 'error',
duration: 5000,
isClosable: true,
position: 'top-right',
});
},
},
);
}}
>
{(props: { setFieldValue: (k: string, v: unknown) => void; values: Script }) => (
{
if (v) {
props.setFieldValue('timeout', undefined);
} else {
props.setFieldValue('timeout', 30);
}
}}
isDisabled={isDisabled}
/>
{!props.values.deferred && (
)}
)}
>
);
};
export default CreateScriptButton;