'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client'; import { DocumentStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { AddFieldsFormPartial } from '@documenso/ui/primitives/document-flow/add-fields'; import type { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; import { AddSignersFormPartial } from '@documenso/ui/primitives/document-flow/add-signers'; import type { TAddSignersFormSchema } from '@documenso/ui/primitives/document-flow/add-signers.types'; import { AddSubjectFormPartial } from '@documenso/ui/primitives/document-flow/add-subject'; import type { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; import { AddTitleFormPartial } from '@documenso/ui/primitives/document-flow/add-title'; import type { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types'; import { DocumentFlowFormContainer, DocumentFlowFormContainerHeader, } from '@documenso/ui/primitives/document-flow/document-flow-root'; import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type EditDocumentFormProps = { className?: string; user: User; document: DocumentWithData; recipients: Recipient[]; fields: Field[]; documentData: DocumentData; }; type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject'; export const EditDocumentForm = ({ className, document, recipients, fields, user: _user, documentData, }: EditDocumentFormProps) => { const { toast } = useToast(); const router = useRouter(); const [step, setStep] = useState( document.status === DocumentStatus.DRAFT ? 'title' : 'signers', ); const { mutateAsync: addTitle } = trpc.document.setTitleForDocument.useMutation(); const { mutateAsync: addFields } = trpc.field.addFields.useMutation(); const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation(); const { mutateAsync: sendDocument } = trpc.document.sendDocument.useMutation(); const documentFlow: Record = { title: { title: 'Add Title', description: 'Add the title to the document.', stepIndex: 1, }, signers: { title: 'Add Signers', description: 'Add the people who will sign the document.', stepIndex: 2, onBackStep: () => document.status === DocumentStatus.DRAFT && setStep('title'), }, fields: { title: 'Add Fields', description: 'Add all relevant fields for each recipient.', stepIndex: 3, onBackStep: () => setStep('signers'), }, subject: { title: 'Add Subject', description: 'Add the subject and message you wish to send to signers.', stepIndex: 4, onBackStep: () => setStep('fields'), }, }; const currentDocumentFlow = documentFlow[step]; const onAddTitleFormSubmit = async (data: TAddTitleFormSchema) => { try { // Custom invocation server action await addTitle({ documentId: document.id, title: data.title, }); router.refresh(); setStep('signers'); } catch (err) { console.error(err); toast({ title: 'Error', description: 'An error occurred while updating title.', variant: 'destructive', }); } }; const onAddSignersFormSubmit = async (data: TAddSignersFormSchema) => { try { // Custom invocation server action await addSigners({ documentId: document.id, signers: data.signers, }); router.refresh(); setStep('fields'); } catch (err) { console.error(err); toast({ title: 'Error', description: 'An error occurred while adding signers.', variant: 'destructive', }); } }; const onAddFieldsFormSubmit = async (data: TAddFieldsFormSchema) => { try { // Custom invocation server action await addFields({ documentId: document.id, fields: data.fields, }); router.refresh(); setStep('subject'); } catch (err) { console.error(err); toast({ title: 'Error', description: 'An error occurred while adding signers.', variant: 'destructive', }); } }; const onAddSubjectFormSubmit = async (data: TAddSubjectFormSchema) => { const { subject, message } = data.email; try { await sendDocument({ documentId: document.id, email: { subject, message, }, }); toast({ title: 'Document sent', description: 'Your document has been sent successfully.', duration: 5000, }); router.push('/documents'); } catch (err) { console.error(err); toast({ title: 'Error', description: 'An error occurred while sending the document.', variant: 'destructive', }); } }; return (
e.preventDefault()} > {step === 'title' && ( )} {step === 'signers' && ( )} {step === 'fields' && ( )} {step === 'subject' && ( )}
); };