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 (
{/* Main Content Area */}
{/* Left Section - Step Navigation */}

{match(recipient.role) .with(RecipientRole.VIEWER, () => View Document) .with(RecipientRole.SIGNER, () => Sign Document) .with(RecipientRole.APPROVER, () => Approve Document) .with(RecipientRole.ASSISTANT, () => Assist Document) .otherwise(() => null)}

{/* Quick Actions. */} {!isDirectTemplate && (

Actions

Attachments } /> Download PDF } /> {envelope.type === EnvelopeType.DOCUMENT && ( Reject Document } /> )}
)} {/* Footer of left sidebar. */}
{/* Horizontal envelope item selector */} {envelopeItems.length > 1 && (
{envelopeItems.map((doc, i) => ( field.envelopeItemId === doc.id).length } /> } isSelected={currentEnvelopeItem?.id === doc.id} buttonProps={{ onClick: () => setCurrentEnvelopeItem(doc.id) }} /> ))}
)} {/* Document View */}
{currentEnvelopeItem ? ( ) : (

No documents found

)} {/* Mobile widget - Additional padding to allow users to scroll */}
); };