"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import { fetchEmailRequests, createEmailRequest, updateEmailRequest, deleteEmailRequest, type EmailRequest, type CreateEmailRequestDto, type UpdateEmailRequestDto, } from "@/lib/api/emailRequests"; import { Pencil, Trash2, Plus, X } from "lucide-react"; import { formatDate } from "@/lib/dateFormattingUtility"; type EmailStatusTab = "ALL" | "PENDING" | "SENT" | "FAILED" | "OTHER"; export default function AdminEmailPage() { const [emails, setEmails] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showModal, setShowModal] = useState(false); const [modalMode, setModalMode] = useState<"create" | "edit">("create"); const [selectedEmail, setSelectedEmail] = useState(null); const [formData, setFormData] = useState({ email: "", status: "", }); const [submitting, setSubmitting] = useState(false); const [statusTab, setStatusTab] = useState("ALL"); const loadEmails = useCallback(async () => { try { setLoading(true); const data = await fetchEmailRequests(); setEmails(data); setError(null); } catch (e: any) { console.error(e); setError(e?.message ?? "Failed to load email requests"); } finally { setLoading(false); } }, []); useEffect(() => { loadEmails(); }, [loadEmails]); const normalizeStatus = (s: unknown) => String(s ?? "").trim().toUpperCase(); const counts = useMemo(() => { const c = { ALL: 0, PENDING: 0, SENT: 0, FAILED: 0, OTHER: 0 } as Record< EmailStatusTab, number >; c.ALL = emails.length; for (const e of emails) { const st = normalizeStatus(e.status); if (st === "PENDING") c.PENDING += 1; else if (st === "SENT") c.SENT += 1; else if (st === "FAILED") c.FAILED += 1; else c.OTHER += 1; } return c; }, [emails]); const filteredEmails = useMemo(() => { if (statusTab === "ALL") return emails; return emails.filter((e) => { const st = normalizeStatus(e.status); if (statusTab === "OTHER") { return st !== "PENDING" && st !== "SENT" && st !== "FAILED"; } return st === statusTab; }); }, [emails, statusTab]); const tabs: { key: EmailStatusTab; label: string }[] = [ { key: "ALL", label: "All" }, { key: "PENDING", label: "Pending" }, { key: "SENT", label: "Sent" }, { key: "FAILED", label: "Failed" }, { key: "OTHER", label: "Other" }, ]; const handleCreate = () => { setModalMode("create"); setFormData({ email: "", status: "" }); setSelectedEmail(null); setShowModal(true); }; const handleEdit = (email: EmailRequest) => { setModalMode("edit"); setFormData({ email: email.email, status: email.status }); setSelectedEmail(email); setShowModal(true); }; const handleDelete = async (id: number) => { if (!confirm("Are you sure you want to delete this email request?")) return; try { await deleteEmailRequest(id); await loadEmails(); } catch (e: any) { alert(e?.message ?? "Failed to delete email request"); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { setSubmitting(true); if (modalMode === "create") { await createEmailRequest(formData); } else if (selectedEmail) { const updateData: UpdateEmailRequestDto = {}; if (formData.email !== selectedEmail.email) updateData.email = formData.email; if (formData.status !== selectedEmail.status) updateData.status = formData.status; await updateEmailRequest(selectedEmail.id, updateData); } setShowModal(false); await loadEmails(); } catch (e: any) { alert(e?.message ?? "Failed to save email request"); } finally { setSubmitting(false); } }; return (
{/* Header */}

Emails

Manage Email and their statuses.

{/* Status Tabs */}
{tabs.map((t) => { const active = statusTab === t.key; return ( ); })}
{/* Error */} {error && (
{error}
)} {/* Table */} {loading ? (
Loading…
) : (
{filteredEmails.map((email) => ( ))} {filteredEmails.length === 0 && ( )}
ID Email Status Created At Updated At Actions
{email.id} {email.recipient} {email.status} {new Date(email.createdAt).toLocaleString()} {email.updatedAt ? formatDate(email.updatedAt) : "—"}
No email requests found for{" "} {tabs.find((t) => t.key === statusTab)?.label}.
)} {/* Modal */} {showModal && (

{modalMode === "create" ? "Create Email Request" : "Edit Email Request"}

setFormData({ ...formData, email: e.target.value })} className="w-full rounded-md border border-zinc-800 bg-zinc-900 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-500 focus:border-emerald-500 focus:outline-none focus:ring-1 focus:ring-emerald-500" placeholder="user@example.com" required />
setFormData({ ...formData, status: e.target.value })} className="w-full rounded-md border border-zinc-800 bg-zinc-900 px-3 py-2 text-sm text-zinc-100 placeholder-zinc-500 focus:border-emerald-500 focus:outline-none focus:ring-1 focus:ring-emerald-500" placeholder="pending" />
)}
); }