'use client'; import { useId, useState } from 'react'; import dynamic from 'next/dynamic'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { Document, Field, Recipient, User } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { AddFieldsFormPartial } from './edit-document/add-fields'; import { AddSignersFormPartial } from './edit-document/add-signers'; import { AddSubjectFormPartial } from './edit-document/add-subject'; import { TEditDocumentFormSchema, ZEditDocumentFormSchema } from './edit-document/types'; const PDFViewer = dynamic(async () => import('~/components/(dashboard)/pdf-viewer/pdf-viewer'), { ssr: false, loading: () => (

Loading document...

), }); const MAX_STEP = 2; export type EditDocumentFormProps = { className?: string; user: User; document: Document; recipients: Recipient[]; fields: Field[]; }; export const EditDocumentForm = ({ className, document, recipients, fields, user: _user, }: EditDocumentFormProps) => { const initialId = useId(); const [step, setStep] = useState(0); const [nextStepLoading, setNextStepLoading] = useState(false); const documentUrl = `data:application/pdf;base64,${document.document}`; const defaultSigners = recipients.length > 0 ? recipients.map((recipient) => ({ nativeId: recipient.id, formId: `${recipient.id}-${recipient.documentId}`, name: recipient.name, email: recipient.email, })) : [ { formId: initialId, name: '', email: '', }, ]; const defaultFields = fields.map((field) => ({ nativeId: field.id, formId: `${field.id}-${field.documentId}`, pageNumber: field.page, type: field.type, pageX: Number(field.positionX), pageY: Number(field.positionY), pageWidth: Number(field.width), pageHeight: Number(field.height), signerEmail: recipients.find((recipient) => recipient.id === field.recipientId)?.email ?? '', })); const { mutateAsync: setRecipientsForDocument } = trpc.document.setRecipientsForDocument.useMutation(); const { mutateAsync: setFieldsForDocument } = trpc.document.setFieldsForDocument.useMutation(); const { control, handleSubmit, watch, trigger, formState: { errors, isSubmitting }, } = useForm({ mode: 'onBlur', defaultValues: { signers: defaultSigners, fields: defaultFields, email: { subject: '', message: '', }, }, resolver: zodResolver(ZEditDocumentFormSchema), }); const signersFormValue = watch('signers'); const fieldsFormValue = watch('fields'); console.log({ state: watch(), errors }); const canGoBack = step > 0; const canGoNext = step < MAX_STEP; const onGoBackClick = () => setStep((prev) => Math.max(0, prev - 1)); const onGoNextClick = async () => { setNextStepLoading(true); const passes = await trigger(); if (step === 0) { await setRecipientsForDocument({ documentId: document.id, recipients: signersFormValue.map((signer) => ({ id: signer.nativeId ?? undefined, name: signer.name, email: signer.email, })), }).catch((err: unknown) => console.error(err)); } if (step === 1) { await setFieldsForDocument({ documentId: document.id, fields: fieldsFormValue.map((field) => ({ id: field.nativeId ?? undefined, type: field.type, signerEmail: field.signerEmail, pageNumber: field.pageNumber, pageX: field.pageX, pageY: field.pageY, pageWidth: field.pageWidth, pageHeight: field.pageHeight, })), }).catch((err: unknown) => console.error(err)); } if (passes) { setStep((prev) => Math.min(MAX_STEP, prev + 1)); } console.log({ passes }); setNextStepLoading(false); }; return (
{step === 0 && ( )} {step === 1 && ( )} {step === 2 && ( )}

Add Signers ({step + 1}/{MAX_STEP + 1})

{step < MAX_STEP && ( )} {step === MAX_STEP && ( )}
); };