import { useCurrentEnvelopeRender } from '@documenso/lib/client-only/providers/envelope-render-provider'; import { PDF_VIEWER_ERROR_MESSAGES } from '@documenso/lib/constants/pdf-viewer-i18n'; import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Separator } from '@documenso/ui/primitives/separator'; import { Plural, Trans, useLingui } from '@lingui/react/macro'; import { EnvelopeType, RecipientRole } from '@prisma/client'; import { motion } from 'framer-motion'; import { ArrowLeftIcon, BanIcon, DownloadCloudIcon, PanelLeftCloseIcon, PanelLeftOpenIcon, PaperclipIcon, } from 'lucide-react'; import { useMemo, useRef, useState } from 'react'; import { Link } from 'react-router'; import { match } from 'ts-pattern'; 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 { useEmbedSigningContext } from '~/components/embed/embed-signing-context'; import { EnvelopeSignerPageRenderer } from '~/components/general/envelope-signing/envelope-signer-page-renderer'; import { EnvelopePdfViewer } from '~/components/general/pdf-viewer/envelope-pdf-viewer'; import { BrandingLogo } from '../branding-logo'; 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'; export const DocumentSigningPageViewV2 = () => { const { envelopeItems, currentEnvelopeItem, setCurrentEnvelopeItem } = useCurrentEnvelopeRender(); const scrollableContainerRef = useRef(null); const { isDirectTemplate, envelope, recipient, recipientFields, recipientFieldsRemaining, requiredRecipientFields, selectedAssistantRecipientFields, } = useRequiredEnvelopeSigningContext(); const { isEmbed = false, allowDocumentRejection = true, hidePoweredBy = true, onDocumentRejected, } = useEmbedSigningContext() || {}; const { t } = useLingui(); const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false); /** * 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 */}
{/* 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 document selected

)} {/* Mobile widget - Additional padding to allow users to scroll */}
{!hidePoweredBy && ( Powered by )}
); };