import { zodResolver } from '@hookform/resolvers/zod'; import { msg } from '@lingui/core/macro'; import { Plural, Trans } from '@lingui/react/macro'; import { createCallable } from 'react-call'; import { useForm, useWatch } from 'react-hook-form'; import { match } from 'ts-pattern'; import { z } from 'zod'; import { validateCheckboxLength } from '@documenso/lib/advanced-fields-validation/validate-checkbox'; import { type TCheckboxFieldMeta } from '@documenso/lib/types/field-meta'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; import { Form, FormControl, FormField, FormItem } from '@documenso/ui/primitives/form/form'; export type SignFieldCheckboxDialogProps = { fieldMeta: TCheckboxFieldMeta; validationRule: '>=' | '=' | '<='; validationLength: number; preselectedIndices: number[]; }; export const SignFieldCheckboxDialog = createCallable< SignFieldCheckboxDialogProps, number[] | null >(({ call, fieldMeta, validationRule, validationLength, preselectedIndices }) => { const ZSignFieldCheckboxFormSchema = z .object({ values: z.array( z.object({ checked: z.boolean(), value: z.string(), }), ), }) .superRefine((data, ctx) => { // Allow unselecting all options if the field is not required even if // validation is not met. if (!fieldMeta.required && data.values.every((value) => !value.checked)) { return; } const numberOfSelectedValues = data.values.filter((value) => value.checked).length; const isValid = validateCheckboxLength( numberOfSelectedValues, validationRule, validationLength, ); if (!isValid) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: msg`Validation failed`.id, }); } }); const form = useForm>({ resolver: zodResolver(ZSignFieldCheckboxFormSchema), defaultValues: { values: (fieldMeta.values || []).map((value, index) => ({ checked: preselectedIndices.includes(index) || false, value: value.value, })), }, }); const formValues = useWatch({ control: form.control, }); return ( (!value ? call.end(null) : null)}> Sign Checkbox Field 0, })} > {match(validationRule) .with('>=', () => ( )) .with('=', () => ( )) .with('<=', () => ( )) .exhaustive()}
call.end( data.values .map((value, i) => (value.checked ? i : null)) .filter((value) => value !== null), ), )} >
    {(formValues.values || []).map((value, index) => (
  • (
    { field.onChange({ ...field.value, checked, }); }} />
    )} />
  • ))}
); });