import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; import { UnifiedTicketsTable } from "@/components/admin/unified-tickets-table"; import { fetchUnifiedTicketInbox, type TicketInboxTypeFilter, } from "@/lib/admin/ticket-inbox"; import { fetchTicketQueueOpenCounts } from "@/lib/admin/ticket-queue-counts"; import { parseListParams } from "@/lib/admin-helpers"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; export default async function AdminTicketInboxPage({ searchParams, }: { searchParams: Promise>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.TICKETS_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.ticketInbox"); const raw = await searchParams; const parsed = parseListParams(new URLSearchParams(raw)); const typeRaw = raw.filter_type || "all"; const type: TicketInboxTypeFilter = typeRaw === "cms" || typeRaw === "help" ? typeRaw : "all"; const statusFilter = raw.filter_status || "open"; const openOnly = statusFilter !== "all"; const [inbox, queues] = await Promise.all([ fetchUnifiedTicketInbox({ page: parsed.page, perPage: parsed.perPage, search: parsed.search, type, openOnly, base: "admin", }), fetchTicketQueueOpenCounts(), ]); return (

{t("hint")}

0 ? "warn" : "neutral"} icon="🛟" />
{inbox.total === 0 && !parsed.search ? (
{t("noTickets")}
) : ( )}
); }