import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useFieldArray, useForm } from 'react-hook-form'; import toast from 'react-hot-toast'; import { useOutletContext, useParams } from 'react-router-dom'; import { Typography, Collapse, Card, Button, Checkbox, Chip, } from '@material-tailwind/react'; import AddEnvironmentVariableRow from './AddEnvironmentVariableRow'; import DisplayEnvironmentVariables from './DisplayEnvironmentVariables'; import { EnvironmentVariable, Environments, ProjectsOutletContext, } from '../../../../types/project'; import HorizontalLine from '../../../HorizontalLine'; export type EnvironmentVariablesFormValues = { variables: { key: string; value: string; }[]; environment: { development: boolean; preview: boolean; production: boolean; }; }; export const EnvironmentVariablesTabPanel = () => { const { id } = useParams(); const { projects } = useOutletContext(); const currentProject = useMemo(() => { return projects.find((project) => { return project.id === id; }); }, [id, projects]); const { handleSubmit, register, control, reset, formState: { isSubmitSuccessful, errors }, } = useForm({ defaultValues: { variables: [{ key: '', value: '' }], environment: { development: false, preview: false, production: false, }, }, }); const [createNewVariable, setCreateNewVariable] = useState(false); const { fields, append, remove } = useFieldArray({ name: 'variables', control, rules: { required: 'Add at least 1 environment variables', }, }); useEffect(() => { if (isSubmitSuccessful) { reset(); } }, [isSubmitSuccessful, reset]); const getEnvironmentVariable = useCallback((environment: Environments) => { return ( currentProject?.environmentVariables as EnvironmentVariable[] ).filter((item) => item.environments.includes(environment)); }, []); const isFieldEmpty = useMemo(() => { if (errors.variables) { return fields.some((_, index) => { if ( errors.variables![index]?.value?.type === 'required' || errors.variables![index]?.key?.type === 'required' ) { return true; } }); } return false; }, [fields, errors.variables]); return ( <> Environment variables A new deployment is required for your changes to take effect.
setCreateNewVariable((cur) => !cur)} > + Create new variable
{ toast.success( data.variables.length > 1 ? `${data.variables.length} variables added` : `Variable added`, ); reset(); })} > {fields.map((field, index) => { return ( remove(index)} isDeleteDisabled={fields.length === 1} /> ); })}
{isFieldEmpty && ( )}
); };