import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useFieldArray, useForm } from 'react-hook-form'; import toast from 'react-hot-toast'; import { useParams } from 'react-router-dom'; import { Typography, Collapse, Card, Button, Checkbox, Chip, } from '@material-tailwind/react'; import { Environment, EnvironmentVariable } from 'gql-client'; import AddEnvironmentVariableRow from './AddEnvironmentVariableRow'; import DisplayEnvironmentVariables from './DisplayEnvironmentVariables'; import HorizontalLine from '../../../HorizontalLine'; import { useGQLClient } from '../../../../context/GQLClientContext'; export type EnvironmentVariablesFormValues = { variables: { key: string; value: string; }[]; environment: { development: boolean; preview: boolean; production: boolean; }; }; export const EnvironmentVariablesTabPanel = () => { const { id } = useParams(); const client = useGQLClient(); const [environmentVariables, setEnvironmentVariables] = useState< EnvironmentVariable[] >([]); 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, id]); const getEnvironmentVariable = useCallback( (environment: Environment) => { return environmentVariables.filter((item) => item.environments.includes(environment), ); }, [environmentVariables, id], ); 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, id]); const fetchEnvironmentVariables = useCallback( async (id: string | undefined) => { if (id) { const { environmentVariables } = await client.getEnvironmentVariables(id); setEnvironmentVariables(environmentVariables); } }, [], ); useEffect(() => { fetchEnvironmentVariables(id); }, [id]); const createEnvironmentVariablesHandler = useCallback( async (createFormData: EnvironmentVariablesFormValues) => { const environmentVariables = createFormData.variables.map((variable) => { return { key: variable.key, value: variable.value, environments: Object.entries(createFormData.environment) .filter(([, value]) => value === true) .map(([key]) => key.charAt(0).toUpperCase() + key.slice(1)), }; }); const { addEnvironmentVariables: isEnvironmentVariablesAdded } = await client.addEnvironmentVariables(id!, environmentVariables); if (isEnvironmentVariablesAdded) { reset(); setCreateNewVariable((cur) => !cur); fetchEnvironmentVariables(id); toast.success( createFormData.variables.length > 1 ? `${createFormData.variables.length} variables added` : `Variable added`, ); } else { toast.error('Environment variables not added'); } }, [id, client], ); return ( <> Environment variables A new deployment is required for your changes to take effect.
setCreateNewVariable((cur) => !cur)} > + Create new variable
{fields.map((field, index) => { return ( remove(index)} isDeleteDisabled={fields.length === 1} /> ); })}
{isFieldEmpty && ( )}
); };