import { zodResolver } from '@hookform/resolvers/zod'; import { useLingui } from '@lingui/react/macro'; import { Trans } from '@lingui/react/macro'; import { createCallable } from 'react-call'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import type { TNumberFieldMeta } from '@documenso/lib/types/field-meta'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; import { numberFormatValues } from '@documenso/ui/primitives/document-flow/field-items-advanced-settings/constants'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; export type SignFieldNumberDialogProps = { fieldMeta: TNumberFieldMeta; }; export const SignFieldNumberDialog = createCallable( ({ call, fieldMeta }) => { const { t } = useLingui(); // Needs to be inside dialog for translation purposes. const createNumberFieldSchema = (fieldMeta: TNumberFieldMeta) => { const { numberFormat, minValue, maxValue } = fieldMeta; if (numberFormat) { const foundRegex = numberFormatValues.find((item) => item.value === numberFormat)?.regex; if (foundRegex) { return z.string().refine( (value) => { return foundRegex.test(value.toString()); }, { message: t`Number needs to be formatted as ${numberFormat}`, }, ); } } // Not gong to work with min/max numbers + number format // Since currently doesn't work in V1 going to ignore for now. return z.string().superRefine((value, ctx) => { const isValidNumber = /^[0-9,.]+$/.test(value.toString()); if (!isValidNumber) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: t`Please enter a valid number`, }); return; } if (typeof minValue === 'number' && parseFloat(value) < minValue) { ctx.addIssue({ code: z.ZodIssueCode.too_small, minimum: minValue, inclusive: true, type: 'number', }); return; } if (typeof maxValue === 'number' && parseFloat(value) > maxValue) { ctx.addIssue({ code: z.ZodIssueCode.too_big, maximum: maxValue, inclusive: true, type: 'number', }); return; } }); }; const ZSignFieldNumberFormSchema = z.object({ number: createNumberFieldSchema(fieldMeta), }); const form = useForm>({ resolver: zodResolver(ZSignFieldNumberFormSchema), defaultValues: { number: undefined, }, }); return ( (!value ? call.end(null) : null)}> Sign Number Field Insert a value into the number field
call.end(data.number))}>
( {fieldMeta.label && {fieldMeta.label}} )} />
); }, );