diff --git a/app/admin/email/page.tsx b/app/admin/email/page.tsx index e090742..c1f19fa 100644 --- a/app/admin/email/page.tsx +++ b/app/admin/email/page.tsx @@ -12,7 +12,7 @@ import { type UpdateEmailRequestDto, } from "@/lib/api/emailRequests"; import { Pencil, Trash2, Plus, X } from "lucide-react"; - +import { formatDate } from "@/lib/api/dateFormattingUtility"; export default function AdminEmailPage() { const { token } = useAuth(); const [emails, setEmails] = useState([]); @@ -165,7 +165,7 @@ export default function AdminEmailPage() { {new Date(email.createdAt).toLocaleString()} - {new Date(email.updatedAt).toLocaleString()} + {formatDate(email.updatedAt)}
diff --git a/app/admin/email/send/page-sendText.tsx b/app/admin/email/send/page-sendText.tsx new file mode 100644 index 0000000..2151763 --- /dev/null +++ b/app/admin/email/send/page-sendText.tsx @@ -0,0 +1,116 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import { sendEmailAction, type ApiResponse, type EmailRequest } from "/app/actions/sendEmail"; +import { Button, Field, Input, Textarea } from "@/components/ui/form"; + +export default function SendEmailForm(): JSX.Element { + const [result, setResult] = useState< + ApiResponse | { error: string } | null + >(null); + const [submitting, setSubmitting] = useState(false); + + const [showSuccess, setShowSuccess] = useState(false); + const successTimerRef = useRef | null>(null); + + useEffect(() => { + return () => { + if (successTimerRef.current) clearTimeout(successTimerRef.current); + }; + }, []); + + async function onSubmit(e: React.FormEvent): Promise { + e.preventDefault(); + setResult(null); + + setShowSuccess(false); + if (successTimerRef.current) clearTimeout(successTimerRef.current); + + const form = new FormData(e.currentTarget); + + const recipient = String(form.get("recipient") ?? ""); + const subject = String(form.get("subject") ?? ""); + const body = String(form.get("body") ?? ""); + + try { + setSubmitting(true); + const data = await sendEmailAction({ recipient, subject, body }); + setResult(data); + + if (data?.success === true) { + setShowSuccess(true); + + successTimerRef.current = setTimeout(() => { + setShowSuccess(false); + }, 2000); + } + } catch (err) { + const message = err instanceof Error ? err.message : "Unknown error"; + setResult({ error: message }); + } finally { + setSubmitting(false); + } + } + + return ( +
+

+ Send Email +

+

+ Compose a message and send it from the admin panel. +

+ +
+ {result && "error" in result && ( +
+ {result.error} +
+ )} + + + + + + + + + + +