import { useT } from "@agent-native/core/client/i18n"; import { IconCheck, IconClock, IconLoader2, IconPencil, IconPlus, IconSend, IconTrash, IconX, } from "@tabler/icons-react"; import { useEffect, useMemo, useState } from "react"; import { Link, useNavigate, useParams, useSearchParams } from "react-router"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { useDraftQueueMembers, useOpenQueuedDraft, useQueueEmailDraft, useQueuedDrafts, useSendQueuedDrafts, useUpdateQueuedDraft, type QueuedEmailDraft, } from "@/hooks/use-draft-queue"; import { useNavigationState } from "@/hooks/use-navigation-state"; import { cn } from "@/lib/utils"; type QueueScope = "review" | "requested"; type DraftFormState = { to: string; cc: string; bcc: string; subject: string; body: string; context: string; }; const EMPTY_FORM: DraftFormState = { to: "", cc: "", bcc: "", subject: "", body: "", context: "", }; function formatTime(timestamp: number) { return new Date(timestamp).toLocaleString(undefined, { month: "short", day: "numeric", hour: "numeric", minute: "2-digit", }); } function statusLabel( status: QueuedEmailDraft["status"], t: ReturnType, ) { if (status === "in_review") return t("mail.draftQueue.statusInReview"); return status; } function statusClassName(status: QueuedEmailDraft["status"]) { if (status === "queued") return "border-amber-400/30 text-amber-300"; if (status === "in_review") return "border-sky-400/30 text-sky-300"; if (status === "sent") return "border-emerald-400/30 text-emerald-300"; return "border-muted-foreground/20 text-muted-foreground"; } function draftToForm(draft: QueuedEmailDraft | null): DraftFormState { if (!draft) return EMPTY_FORM; return { to: draft.to, cc: draft.cc, bcc: draft.bcc, subject: draft.subject, body: draft.body, context: draft.context, }; } function QueueDraftDialog({ open, onOpenChange, members, currentUser, }: { open: boolean; onOpenChange: (open: boolean) => void; members: { email: string; role: string }[]; currentUser: string; }) { const t = useT(); const queueDraft = useQueueEmailDraft(); const [ownerEmail, setOwnerEmail] = useState(currentUser); const [form, setForm] = useState(EMPTY_FORM); useEffect(() => { if (open) setOwnerEmail(currentUser || members[0]?.email || ""); }, [currentUser, members, open]); const update = (patch: Partial) => setForm((current) => ({ ...current, ...patch })); const canSubmit = ownerEmail && form.to.trim() && form.body.trim(); const submit = () => { if (!canSubmit) return; queueDraft.mutate( { ownerEmail, to: form.to, cc: form.cc || undefined, bcc: form.bcc || undefined, subject: form.subject || t("mail.draftQueue.noSubject"), body: form.body, context: form.context || undefined, source: "ui", }, { onSuccess: () => { toast(t("mail.toasts.draftQueued")); setForm(EMPTY_FORM); onOpenChange(false); }, onError: (error) => toast.error(error.message), }, ); }; return ( {t("mail.draftQueue.queueDraft")}
update({ to: event.target.value })} placeholder="recipient@example.com" />
update({ cc: event.target.value })} />
update({ bcc: event.target.value })} />
update({ subject: event.target.value })} />