import { CONTACT_MESSAGE_TYPES, type ContactMessageAdminView } from "@batch-cooking/shared"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { adminApiClient } from "../../../api/admin-client"; import "../admin-page.scss"; import "./messages-page.scss"; type MessagesState = | { status: "loading" } | { status: "loaded"; rows: ContactMessageAdminView[] } | { status: "error" }; /** * Contact-form messages (issue #80) — a read-only list of the bug reports / * suggestions users have sent from `/parametres/contact`, newest first, * capped server-side at 200. One optional filter (by `type`); no actions, * no triage workflow in this first version. */ export function MessagesPage() { const { t } = useTranslation(); const [type, setType] = useState(""); const [state, setState] = useState({ status: "loading" }); useEffect(() => { let cancelled = false; setState({ status: "loading" }); adminApiClient .getContactMessages({ type: type || undefined }) .then((rows) => { if (!cancelled) setState({ status: "loaded", rows }); }) .catch(() => { if (!cancelled) setState({ status: "error" }); }); return () => { cancelled = true; }; }, [type]); return (

{t("admin.messages.title")}

{t("admin.messages.lead")}

{state.status === "loading" && (

{t("admin.common.loading")}

)} {state.status === "error" && (

{t("admin.common.loadError")}

)} {state.status === "loaded" && state.rows.length === 0 && (

{t("admin.messages.empty")}

)} {state.status === "loaded" && state.rows.length > 0 && (
{state.rows.map((row) => ( ))}
{t("admin.messages.col.date")} {t("admin.messages.col.sender")} {t("admin.messages.col.type")} {t("admin.messages.col.message")} {t("admin.messages.col.page")} {t("admin.messages.col.userAgent")}
{new Date(row.createdAt).toLocaleString("fr-FR")} {row.author ? ( <> {row.author.firstName} {row.author.lastName}
{row.author.email} ) : ( {t("admin.messages.deletedAuthor")} )}
{t(`admin.messages.type.${row.type}`)} {row.message} {row.pageUrl ?? "—"} {row.userAgent ?? "—"}
)}
); }