import { lazy, useMemo } from 'react'; import { Plural, Trans } from '@lingui/react/macro'; import { EnvelopeType, RecipientRole } from '@prisma/client'; import { motion } from 'framer-motion'; import { ArrowLeftIcon, BanIcon, DownloadCloudIcon, PaperclipIcon } from 'lucide-react'; import { Link } from 'react-router'; import { match } from 'ts-pattern'; import { useCurrentEnvelopeRender } from '@documenso/lib/client-only/providers/envelope-render-provider'; import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope'; import PDFViewerKonvaLazy from '@documenso/ui/components/pdf-viewer/pdf-viewer-konva-lazy'; import { Button } from '@documenso/ui/primitives/button'; import { Separator } from '@documenso/ui/primitives/separator'; import { EnvelopeDownloadDialog } from '~/components/dialogs/envelope-download-dialog'; import { SignFieldCheckboxDialog } from '~/components/dialogs/sign-field-checkbox-dialog'; import { SignFieldDropdownDialog } from '~/components/dialogs/sign-field-dropdown-dialog'; import { SignFieldEmailDialog } from '~/components/dialogs/sign-field-email-dialog'; import { SignFieldInitialsDialog } from '~/components/dialogs/sign-field-initials-dialog'; import { SignFieldNameDialog } from '~/components/dialogs/sign-field-name-dialog'; import { SignFieldNumberDialog } from '~/components/dialogs/sign-field-number-dialog'; import { SignFieldSignatureDialog } from '~/components/dialogs/sign-field-signature-dialog'; import { SignFieldTextDialog } from '~/components/dialogs/sign-field-text-dialog'; import { DocumentSigningAttachmentsPopover } from '../document-signing/document-signing-attachments-popover'; import { EnvelopeItemSelector } from '../envelope-editor/envelope-file-selector'; import EnvelopeSignerForm from '../envelope-signing/envelope-signer-form'; import { EnvelopeSignerHeader } from '../envelope-signing/envelope-signer-header'; import { DocumentSigningMobileWidget } from './document-signing-mobile-widget'; import { DocumentSigningRejectDialog } from './document-signing-reject-dialog'; import { useRequiredEnvelopeSigningContext } from './envelope-signing-provider'; const EnvelopeSignerPageRenderer = lazy( async () => import('../envelope-signing/envelope-signer-page-renderer'), ); export const DocumentSigningPageViewV2 = () => { const { envelopeItems, currentEnvelopeItem, setCurrentEnvelopeItem } = useCurrentEnvelopeRender(); const { isDirectTemplate, envelope, recipient, recipientFields, recipientFieldsRemaining, requiredRecipientFields, selectedAssistantRecipientFields, } = useRequiredEnvelopeSigningContext(); /** * The total remaining fields remaining for the current recipient or selected assistant recipient. * * Includes both optional and required fields. */ const remainingFields = useMemo(() => { if (recipient.role === RecipientRole.ASSISTANT) { return selectedAssistantRecipientFields.filter((field) => !field.inserted); } return recipientFields.filter((field) => !field.inserted); }, [recipientFieldsRemaining, selectedAssistantRecipientFields, currentEnvelopeItem]); return (