'use client'; import { useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { type DocumentData, type DocumentMeta, DocumentStatus, type Field, type Recipient, type User, } 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 } 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 { Stepper } from '@documenso/ui/primitives/stepper'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { useOptionalCurrentTeam } from '~/providers/team'; export type EditDocumentFormProps = { className?: string; user: User; document: DocumentWithData; recipients: Recipient[]; documentMeta: DocumentMeta | null; fields: Field[]; documentData: DocumentData; documentRootPath: string; }; type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject'; const EditDocumentSteps: EditDocumentStep[] = ['title', 'signers', 'fields', 'subject']; export const EditDocumentForm = ({ className, document, recipients, fields, documentMeta, user: _user, documentData, documentRootPath, }: EditDocumentFormProps) => { const { toast } = useToast(); const router = useRouter(); const searchParams = useSearchParams(); const team = useOptionalCurrentTeam(); 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 { mutateAsync: setPasswordForDocument } = trpc.document.setPasswordForDocument.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, }, fields: { title: 'Add Fields', description: 'Add all relevant fields for each recipient.', stepIndex: 3, }, subject: { title: 'Add Subject', description: 'Add the subject and message you wish to send to signers.', stepIndex: 4, }, }; const [step, setStep] = useState(() => { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const searchParamStep = searchParams?.get('step') as EditDocumentStep | undefined; let initialStep: EditDocumentStep = document.status === DocumentStatus.DRAFT ? 'title' : 'signers'; if ( searchParamStep && documentFlow[searchParamStep] !== undefined && !(recipients.length === 0 && (searchParamStep === 'subject' || searchParamStep === 'fields')) ) { initialStep = searchParamStep; } return initialStep; }); const onAddTitleFormSubmit = async (data: TAddTitleFormSchema) => { try { // Custom invocation server action await addTitle({ documentId: document.id, teamId: team?.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, teamId: team?.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, timezone, dateFormat, redirectUrl } = data.meta; try { await sendDocument({ documentId: document.id, teamId: team?.id, meta: { subject, message, dateFormat, timezone, redirectUrl, }, }); toast({ title: 'Document sent', description: 'Your document has been sent successfully.', duration: 5000, }); router.push(documentRootPath); } catch (err) { console.error(err); toast({ title: 'Error', description: 'An error occurred while sending the document.', variant: 'destructive', }); } }; const onPasswordSubmit = async (password: string) => { await setPasswordForDocument({ documentId: document.id, password, }); }; const currentDocumentFlow = documentFlow[step]; return (
e.preventDefault()} > setStep(EditDocumentSteps[step - 1])} >
); };