'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { Field, Recipient, User } from '@documenso/prisma/client'; import { DocumentWithData } from '@documenso/prisma/types/document-with-data'; 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 { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; import { AddSignersFormPartial } from '@documenso/ui/primitives/document-flow/add-signers'; import { TAddSignersFormSchema } from '@documenso/ui/primitives/document-flow/add-signers.types'; import { AddSubjectFormPartial } from '@documenso/ui/primitives/document-flow/add-subject'; import { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; import { DocumentFlowFormContainer, DocumentFlowFormContainerHeader, } from '@documenso/ui/primitives/document-flow/document-flow-root'; import { 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'; import { addFields } from '~/components/forms/edit-document/add-fields.action'; import { addSigners } from '~/components/forms/edit-document/add-signers.action'; import { completeDocument } from '~/components/forms/edit-document/add-subject.action'; export type EditDocumentFormProps = { className?: string; user: User; document: DocumentWithData; recipients: Recipient[]; fields: Field[]; dataUrl: string; }; type EditDocumentStep = 'signers' | 'fields' | 'subject'; export const EditDocumentForm = ({ className, document, recipients, fields, user: _user, dataUrl, }: EditDocumentFormProps) => { const { toast } = useToast(); const router = useRouter(); const [step, setStep] = useState('signers'); const documentFlow: Record = { signers: { title: 'Add Signers', description: 'Add the people who will sign the document.', stepIndex: 1, }, fields: { title: 'Add Fields', description: 'Add all relevant fields for each recipient.', stepIndex: 2, onBackStep: () => setStep('signers'), }, subject: { title: 'Add Subject', description: 'Add the subject and message you wish to send to signers.', stepIndex: 3, onBackStep: () => setStep('fields'), }, }; const currentDocumentFlow = documentFlow[step]; 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 completeDocument({ 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 === 'signers' && ( )} {step === 'fields' && ( )} {step === 'subject' && ( )}
); };