import * as React from "react"; import { CheckIcon, CopyIcon } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Spinner } from "@/components/ui/spinner"; import { Textarea } from "@/components/ui/textarea"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; import { cn } from "@/lib/utils"; // --------------------------------------------------------------------------- // Shared helper // --------------------------------------------------------------------------- function Field({ id, label, required, children, }: { id?: string; label: string; required?: boolean; children: React.ReactNode; }) { return (
{children}
); } // --------------------------------------------------------------------------- // ShareDetailsDialog // --------------------------------------------------------------------------- export interface ShareDetailsDialogProps { open: boolean; onOpenChange: (open: boolean) => void; contactName: string; /** Pre-generated share link to copy. */ shareUrl: string; /** When provided, shows an "Email link" button that calls this handler. */ onEmailLink?: () => void; isSendingEmail?: boolean; className?: string; } export function ShareDetailsDialog({ open, onOpenChange, contactName, shareUrl, onEmailLink, isSendingEmail = false, className, }: ShareDetailsDialogProps) { const [copied, setCopied] = React.useState(false); function handleCopy() { navigator.clipboard.writeText(shareUrl).catch(() => {}); setCopied(true); setTimeout(() => setCopied(false), 2000); } return ( Share Client Details

Share a secure link to{" "} {contactName}'s financial summary report.

(e.target as HTMLInputElement).select()} />
{copied && (

Link copied to clipboard!

)}
{onEmailLink && ( )}
); } // --------------------------------------------------------------------------- // EmailTemplateDialog // --------------------------------------------------------------------------- export interface EmailTemplateDialogProps { open: boolean; onOpenChange: (open: boolean) => void; contactName: string; contactEmail: string; defaultSubject?: string; defaultBody?: string; onSend: (payload: { subject: string; body: string }) => void; isSending?: boolean; className?: string; } export function EmailTemplateDialog({ open, onOpenChange, contactName, contactEmail, defaultSubject = "", defaultBody = "", onSend, isSending = false, className, }: EmailTemplateDialogProps) { const [subject, setSubject] = React.useState(defaultSubject); const [body, setBody] = React.useState(defaultBody); React.useEffect(() => { if (open) { setSubject(defaultSubject); setBody(defaultBody); } }, [open, defaultSubject, defaultBody]); const canSend = subject.trim() !== "" && body.trim() !== "" && !isSending; return ( Send Email
{/* To — read-only recipient display */}
{contactName} <{contactEmail}>
setSubject(e.target.value)} disabled={isSending} />