'use client'; import React, { useId } from 'react'; import { AnimatePresence, motion } from 'framer-motion'; import { Plus, Trash } from 'lucide-react'; import { nanoid } from 'nanoid'; import { Controller, useFieldArray, useForm } from 'react-hook-form'; import { Document, Field, Recipient, SendStatus } from '@documenso/prisma/client'; import { Button } from '@documenso/ui/primitives/button'; import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { TAddSignersFormSchema } from './add-signers.types'; import { DocumentFlowFormContainer, DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, DocumentFlowFormContainerStep, } from './document-flow-root'; export type AddSignersFormProps = { recipients: Recipient[]; fields: Field[]; document: Document; onContinue?: () => void; onGoBack?: () => void; onSubmit: (_data: TAddSignersFormSchema) => void; }; export const AddSignersFormPartial = ({ recipients, fields: _fields, onGoBack, onSubmit, }: AddSignersFormProps) => { const { toast } = useToast(); const initialId = useId(); const { control, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ defaultValues: { signers: recipients.length > 0 ? recipients.map((recipient) => ({ nativeId: recipient.id, formId: String(recipient.id), name: recipient.name, email: recipient.email, })) : [ { formId: initialId, name: '', email: '', }, ], }, }); const { append: appendSigner, fields: signers, remove: removeSigner, } = useFieldArray({ control, name: 'signers', }); const hasBeenSentToRecipientId = (id?: number) => { if (!id) { return false; } return recipients.some( (recipient) => recipient.id === id && recipient.sendStatus === SendStatus.SENT, ); }; const onAddSigner = () => { appendSigner({ formId: nanoid(12), name: '', email: '', }); }; const onRemoveSigner = (index: number) => { const signer = signers[index]; if (hasBeenSentToRecipientId(signer.nativeId)) { toast({ title: 'Cannot remove signer', description: 'This signer has already received the document.', variant: 'destructive', }); return; } removeSigner(index); }; const onKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Enter' && event.target instanceof HTMLInputElement) { onAddSigner(); } }; return (
{signers.map((signer, index) => (
( )} />
( )} />
))}
handleSubmit(onSubmit)()} onGoBackClick={onGoBack} />
); };