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 (
);
}
// ---------------------------------------------------------------------------
// 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 (
);
}
// ---------------------------------------------------------------------------
// ShareContactDialog
// ---------------------------------------------------------------------------
export interface InternalAdvisor {
id: string;
name: string;
role: string;
practice: string;
}
export interface ShareContactDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
contactName: string;
internalAdvisors: InternalAdvisor[];
onShareInternal: (advisorId: string, notes: string) => void;
onShareExternal: (payload: {
firstName: string;
lastName: string;
email: string;
notes: string;
}) => void;
isSending?: boolean;
className?: string;
}
export function ShareContactDialog({
open,
onOpenChange,
contactName,
internalAdvisors,
onShareInternal,
onShareExternal,
isSending = false,
className,
}: ShareContactDialogProps) {
const [tab, setTab] = React.useState("internal");
const [search, setSearch] = React.useState("");
const [selectedId, setSelectedId] = React.useState(null);
const [internalNotes, setInternalNotes] = React.useState("");
const [firstName, setFirstName] = React.useState("");
const [lastName, setLastName] = React.useState("");
const [email, setEmail] = React.useState("");
const [externalNotes, setExternalNotes] = React.useState("");
function reset() {
setTab("internal");
setSearch("");
setSelectedId(null);
setInternalNotes("");
setFirstName("");
setLastName("");
setEmail("");
setExternalNotes("");
}
function handleOpenChange(v: boolean) {
if (!v) reset();
onOpenChange(v);
}
const filtered = internalAdvisors.filter((a) => {
const q = search.toLowerCase();
return a.name.toLowerCase().includes(q) || a.role.toLowerCase().includes(q);
});
return (
);
}