import { getTranslations } from "next-intl/server"; import { Bell } from "lucide-react"; import { sendHotelAlert } from "@/actions/admin-alerts"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; export const dynamic = "force-dynamic"; const CRITICAL = new Set(["critical", "error", "danger"]); const WARNING = new Set(["warning", "warn"]); function fromDate(d: Date | null | undefined): string { return d ? d.toISOString().slice(0, 16).replace("T", " ") : "—"; } function severityColor(severity: string): string { switch (severity.toLowerCase()) { case "critical": case "error": case "danger": return "var(--color-danger)"; case "warning": case "warn": return "var(--color-primary)"; case "success": return "var(--color-secondary)"; case "info": case "notice": return "var(--color-accent)"; default: return "var(--color-text-muted)"; } } function Badge({ label, color }: { label: string; color: string }) { return ( {label} ); } export default async function AdminAlerts() { const t = await getTranslations("pages.admin.alerts"); let alerts: Awaited>; try { alerts = await prisma.alertLogs.findMany({ orderBy: { id: "desc" }, take: 100, }); } catch { alerts = []; } const critical = alerts.filter((a) => CRITICAL.has((a.severity || "").toLowerCase())).length; const warnings = alerts.filter((a) => WARNING.has((a.severity || "").toLowerCase())).length; const unread = alerts.filter((a) => !a.isRead).length; return (

{t("title")}

{t("subtitle")}

0 ? "danger" : "ok"} icon="🚨" /> 0 ? "warn" : "neutral"} icon="⚠️" /> 0 ? "warn" : "ok"} icon="📨" />

{t("form.send")}

{t.rich("form.description", { code: (chunks) => {chunks}, })}