import { Trans } from '@lingui/react/macro'; import type { FieldType } from '@prisma/client'; import { P, match } from 'ts-pattern'; import { DocumentAuth, type TRecipientActionAuth, type TRecipientActionAuthTypes, } from '@documenso/lib/types/document-auth'; 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 { useRequiredDocumentSigningAuthContext } from './document-signing-auth-provider'; export type DocumentSigningAuthDialogProps = { title?: string; documentAuthType: 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, documentAuthType, open, onOpenChange, onReauthFormSubmit, }: DocumentSigningAuthDialogProps) => { const { recipient, user, isCurrentlyAuthenticating } = useRequiredDocumentSigningAuthContext(); const handleOnOpenChange = (value: boolean) => { if (isCurrentlyAuthenticating) { return; } onOpenChange(value); }; return ( {title || Sign field} {description || Reauthentication is required to sign this field} {match({ documentAuthType, 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.EXPLICIT_NONE }, () => null) .exhaustive()} ); };