'use client'; import { useEffect, useState } from 'react'; import { Trans } from '@lingui/macro'; import { ChevronDown, ChevronUp, Trash } from 'lucide-react'; import { validateRadioField } from '@documenso/lib/advanced-fields-validation/validate-radio'; import { type TRadioFieldMeta as RadioFieldMeta } from '@documenso/lib/types/field-meta'; import { Button } from '@documenso/ui/primitives/button'; import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { Switch } from '@documenso/ui/primitives/switch'; export type RadioFieldAdvancedSettingsProps = { fieldState: RadioFieldMeta; handleFieldChange: ( key: keyof RadioFieldMeta, value: string | { checked: boolean; value: string }[] | boolean, ) => void; handleErrors: (errors: string[]) => void; }; export const RadioFieldAdvancedSettings = ({ fieldState, handleFieldChange, handleErrors, }: RadioFieldAdvancedSettingsProps) => { const [showValidation, setShowValidation] = useState(false); const [values, setValues] = useState( fieldState.values ?? [{ id: 1, checked: false, value: 'Default value' }], ); const [readOnly, setReadOnly] = useState(fieldState.readOnly ?? false); const [required, setRequired] = useState(fieldState.required ?? false); const addValue = () => { const newId = values.length > 0 ? Math.max(...values.map((val) => val.id)) + 1 : 1; const newValue = { id: newId, checked: false, value: '' }; const updatedValues = [...values, newValue]; setValues(updatedValues); handleFieldChange('values', updatedValues); }; const removeValue = (id: number) => { if (values.length === 1) return; const newValues = values.filter((val) => val.id !== id); setValues(newValues); handleFieldChange('values', newValues); }; const handleCheckedChange = (checked: boolean, id: number) => { const newValues = values.map((val) => { if (val.id === id) { return { ...val, checked: Boolean(checked) }; } else { return { ...val, checked: false }; } }); setValues(newValues); handleFieldChange('values', newValues); }; const handleToggleChange = (field: keyof RadioFieldMeta, value: string | boolean) => { const readOnly = field === 'readOnly' ? Boolean(value) : Boolean(fieldState.readOnly); const required = field === 'required' ? Boolean(value) : Boolean(fieldState.required); setReadOnly(readOnly); setRequired(required); const errors = validateRadioField(String(value), { readOnly, required, values }); handleErrors(errors); handleFieldChange(field, value); }; const handleInputChange = (value: string, id: number) => { const newValues = values.map((val) => { if (val.id === id) { return { ...val, value }; } return val; }); setValues(newValues); handleFieldChange('values', newValues); return newValues; }; useEffect(() => { setValues(fieldState.values ?? [{ id: 1, checked: false, value: 'Default value' }]); }, [fieldState.values]); useEffect(() => { const errors = validateRadioField(undefined, { readOnly, required, values }); handleErrors(errors); }, [values]); return (
handleToggleChange('required', checked)} />
handleToggleChange('readOnly', checked)} />
{showValidation && (
{values.map((value) => (
handleCheckedChange(Boolean(checked), value.id)} /> handleInputChange(e.target.value, value.id)} />
))}
)}
); };