"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { FolderKanban, LayoutDashboard, ListChecks, SunMoon } from "lucide-react"; import { useAppLocale } from "@/features/i18n/LocaleProvider"; import { getDashboardMessages } from "@/features/i18n/messages/dashboard"; import { getSubmissionsMessages } from "@/features/i18n/messages/submissions"; interface SubmissionItem { id: string; createdAt: string; projectSlug: string; projectTitle: string | null; payload: Record; } type PageStatus = "idle" | "loading" | "error"; export default function AllProjectSubmissionsPage() { const router = useRouter(); const locale = useAppLocale(); const t = getDashboardMessages(locale); const m = getSubmissionsMessages(locale); const [submissions, setSubmissions] = useState([]); const [status, setStatus] = useState("idle"); const [errorMessage, setErrorMessage] = useState(null); const [isMenuOpen, setIsMenuOpen] = useState(false); useEffect(() => { let cancelled = false; const load = async () => { try { setStatus("loading"); setErrorMessage(null); const res = await fetch("/api/projects/submissions"); if (!res.ok) { if (cancelled) return; if (res.status === 401) { setStatus("error"); setErrorMessage(m.errorUnauthorized); router.push("/login"); return; } setStatus("error"); setErrorMessage(m.errorGeneric); return; } const data = (await res.json()) as SubmissionItem[]; if (!cancelled) { setSubmissions(Array.isArray(data) ? data : []); setStatus("idle"); setErrorMessage(null); } } catch { if (!cancelled) { setStatus("error"); setErrorMessage(m.errorGeneric); } } }; void load(); return () => { cancelled = true; }; }, []); const renderOtherFields = (payload: Record): string => { const knownKeys = new Set(["name", "email", "phone", "birthdate"]); const entries = Object.entries(payload).filter(([key]) => !knownKeys.has(key)); if (entries.length === 0) { return "-"; } return entries .map(([key, value]) => { const stringValue = typeof value === "string" ? value : JSON.stringify(value); return `${key}: ${stringValue}`; }) .join("\n"); }; const handleLogout = async () => { try { const res = await fetch("/api/auth/logout", { method: "POST", }); if (!res.ok) { setErrorMessage(m.errorLogout); return; } router.push("/login"); } catch { setErrorMessage(m.errorLogout); } }; return (

{m.headerTitle}

{m.headerDescription}

{isMenuOpen && (
)}
{status === "error" && errorMessage && (

{errorMessage}

)} {status === "loading" && (

{m.loadingText}

)} {status === "idle" && !errorMessage && submissions.length === 0 && (

{m.emptyText}

)} {submissions.length > 0 && ( {submissions.map((item) => { const payload = (item.payload ?? {}) as Record; const nameValue = payload["name"]; const emailValue = payload["email"]; const phoneValue = payload["phone"]; const birthdateValue = payload["birthdate"]; const name = typeof nameValue === "string" ? nameValue : ""; const email = typeof emailValue === "string" ? emailValue : ""; const phone = typeof phoneValue === "string" ? phoneValue : ""; const birthdate = typeof birthdateValue === "string" ? birthdateValue : ""; return ( ); })}
{m.tableHeaderCreatedAt} {m.tableHeaderProject} {m.tableHeaderSlug} {m.tableHeaderName} {m.tableHeaderEmail} {m.tableHeaderPhone} {m.tableHeaderBirthdate} {m.tableHeaderOtherFields}
{new Date(item.createdAt).toLocaleString()} {item.projectTitle ?? "-"} {item.projectSlug} {name} {email} {phone} {birthdate} {renderOtherFields(payload)}
)}
); }