import React, { useEffect, useRef } from 'react'; import toast from 'react-hot-toast'; import { useFormik } from 'formik'; import * as Yup from 'yup'; import { useDispatch, useSelector } from 'react-redux'; import Portal from 'components/Portal'; import Modal from 'components/Modal'; import { addGlobalEnvironment } from 'providers/ReduxStore/slices/global-environments'; import { validateName, validateNameError } from 'utils/common/regex'; const CreateEnvironment = ({ onClose }) => { const globalEnvs = useSelector((state) => state?.globalEnvironments?.globalEnvironments); const validateEnvironmentName = (name) => { const trimmedName = name?.toLowerCase().trim(); return globalEnvs.every((env) => env?.name?.toLowerCase().trim() !== trimmedName); }; const dispatch = useDispatch(); const inputRef = useRef(); const formik = useFormik({ enableReinitialize: true, initialValues: { name: '' }, validationSchema: Yup.object({ name: Yup.string() .min(1, 'Must be at least 1 character') .max(255, 'Must be 255 characters or less') .test('is-valid-filename', function(value) { const isValid = validateName(value); return isValid ? true : this.createError({ message: validateNameError(value) }); }) .required('Name is required') .test('duplicate-name', 'Global Environment already exists', validateEnvironmentName) }), onSubmit: (values) => { dispatch(addGlobalEnvironment({ name: values.name })) .then(() => { toast.success('Global environment created!'); onClose(); }) .catch(() => toast.error('An error occurred while creating the environment')); } }); useEffect(() => { if (inputRef && inputRef.current) { inputRef.current.focus(); } }, [inputRef]); const onSubmit = () => { formik.handleSubmit(); }; return (
e.preventDefault()}>
{formik.touched.name && formik.errors.name ? (
{formik.errors.name}
) : null}
); }; export default CreateEnvironment;