import { useState } from 'react'; import { Trans } from '@lingui/react/macro'; import type { FieldType } from '@prisma/client'; import { ChevronLeftIcon } from 'lucide-react'; import { P, match } from 'ts-pattern'; import { DocumentAuth, type TRecipientActionAuth, type TRecipientActionAuthTypes, } from '@documenso/lib/types/document-auth'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; import { DocumentSigningAuth2FA } from './document-signing-auth-2fa'; import { DocumentSigningAuthAccount } from './document-signing-auth-account'; import { DocumentSigningAuthPasskey } from './document-signing-auth-passkey'; import { DocumentSigningAuthPassword } from './document-signing-auth-password'; import { useRequiredDocumentSigningAuthContext } from './document-signing-auth-provider'; export type DocumentSigningAuthDialogProps = { title?: string; availableAuthTypes: TRecipientActionAuthTypes[]; description?: string; actionTarget: FieldType | 'DOCUMENT'; open: boolean; onOpenChange: (value: boolean) => void; /** * The callback to run when the reauth form is filled out. */ onReauthFormSubmit: (values?: TRecipientActionAuth) => Promise | void; }; export const DocumentSigningAuthDialog = ({ title, description, availableAuthTypes, open, onOpenChange, onReauthFormSubmit, }: DocumentSigningAuthDialogProps) => { const { recipient, user, isCurrentlyAuthenticating } = useRequiredDocumentSigningAuthContext(); // Filter out EXPLICIT_NONE from available auth types for the chooser const validAuthTypes = availableAuthTypes.filter( (authType) => authType !== DocumentAuth.EXPLICIT_NONE, ); const [selectedAuthType, setSelectedAuthType] = useState(() => { // Auto-select if there's only one valid option if (validAuthTypes.length === 1) { return validAuthTypes[0]; } // Return null if multiple options - show chooser return null; }); const handleOnOpenChange = (value: boolean) => { if (isCurrentlyAuthenticating) { return; } // Reset selected auth type when dialog closes if (!value) { setSelectedAuthType(() => { if (validAuthTypes.length === 1) { return validAuthTypes[0]; } return null; }); } onOpenChange(value); }; const handleBackToChooser = () => { setSelectedAuthType(null); }; // If no valid auth types available, don't render anything if (validAuthTypes.length === 0) { return null; } return ( {selectedAuthType && validAuthTypes.length > 1 && (
{title || Sign field}
)} {(!selectedAuthType || validAuthTypes.length === 1) && (title || Sign field)}
{description || Reauthentication is required to sign this field}
{/* Show chooser if no auth type is selected and there are multiple options */} {!selectedAuthType && validAuthTypes.length > 1 && (

Choose your preferred authentication method:

{validAuthTypes.map((authType) => ( ))}
)} {/* Show the selected auth component */} {selectedAuthType && match({ documentAuthType: selectedAuthType, user }) .with( { documentAuthType: DocumentAuth.ACCOUNT }, { user: P.when((user) => !user || user.email !== recipient.email) }, // Assume all current auth methods requires them to be logged in. () => , ) .with({ documentAuthType: DocumentAuth.PASSKEY }, () => ( )) .with({ documentAuthType: DocumentAuth.TWO_FACTOR_AUTH }, () => ( )) .with({ documentAuthType: DocumentAuth.PASSWORD }, () => ( )) .with({ documentAuthType: DocumentAuth.EXPLICIT_NONE }, () => null) .exhaustive()}
); };