import { useEffect, useState } from 'react'; import { Trans } from '@lingui/react/macro'; import { match } from 'ts-pattern'; import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; import type { RecipientForCreation } from '~/utils/detect-document-recipients'; import { SuggestedRecipientsForm } from './suggested-recipients-form'; type RecipientDetectionStep = | 'PROMPT_DETECT_RECIPIENTS' | 'DETECTING_RECIPIENTS' | 'REVIEW_RECIPIENTS' | 'DETECTING_FIELDS'; export type RecipientDetectionPromptDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; onAccept: () => Promise | void; onSkip: () => void; recipients: RecipientForCreation[] | null; onRecipientsSubmit: (recipients: RecipientForCreation[]) => Promise | void; onAutoAddFields?: (recipients: RecipientForCreation[]) => Promise | void; isProcessingRecipients?: boolean; }; export const RecipientDetectionPromptDialog = ({ open, onOpenChange, onAccept, onSkip, recipients, onRecipientsSubmit, onAutoAddFields, isProcessingRecipients = false, }: RecipientDetectionPromptDialogProps) => { const [currentStep, setCurrentStep] = useState( 'PROMPT_DETECT_RECIPIENTS', ); const [currentRecipients, setCurrentRecipients] = useState( recipients, ); useEffect(() => { if (!open) { setCurrentStep('PROMPT_DETECT_RECIPIENTS'); } }, [open]); useEffect(() => { setCurrentRecipients(recipients); }, [recipients]); useEffect(() => { if (recipients && currentStep === 'DETECTING_RECIPIENTS') { setCurrentStep('REVIEW_RECIPIENTS'); } }, [recipients, currentStep]); const handleStartDetection = (e: React.MouseEvent) => { e.preventDefault(); setCurrentStep('DETECTING_RECIPIENTS'); Promise.resolve(onAccept()).catch(() => { setCurrentStep('PROMPT_DETECT_RECIPIENTS'); }); }; const handleSkip = () => { onSkip(); }; const handleAutoAddFields = async (recipients: RecipientForCreation[]) => { if (!onAutoAddFields) { return; } // Save the current state of recipients so if we fail and come back, // the form is restored with the user's changes. setCurrentRecipients(recipients); setCurrentStep('DETECTING_FIELDS'); try { await onAutoAddFields(recipients); } catch { setCurrentStep('REVIEW_RECIPIENTS'); } }; return ( { // Prevent closing during processing if ( !newOpen && (currentStep === 'DETECTING_RECIPIENTS' || currentStep === 'DETECTING_FIELDS' || isProcessingRecipients) ) { return; } onOpenChange(newOpen); }} >
{match(currentStep) .with('PROMPT_DETECT_RECIPIENTS', () => ( <> Auto-detect recipients? Would you like to automatically detect recipients in your document? This can save you time in setting up your document. )) .with('DETECTING_RECIPIENTS', () => (
Analyzing your document Scanning your document to detect recipient names, emails, and signing order.
)) .with('DETECTING_FIELDS', () => (
Detecting fields Scanning your document to intelligently place fields for your recipients.
)) .with('REVIEW_RECIPIENTS', () => ( <> Review detected recipients Confirm, edit, or add recipients before continuing. You can adjust any information below before importing it into your document. )) .exhaustive()}
); };