import { AlertTriangle, CheckCircle2, Clock, Radio } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { Badge } from "@/components/ui/badge"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; const CFH_STATES: Record< number, { label: string; class: string; icon: typeof AlertTriangle } > = { 0: { label: "Open", class: "bg-[var(--admin-error-subtle)] text-[var(--admin-error)]", icon: AlertTriangle, }, 1: { label: "Picked", class: "bg-[var(--admin-warning-subtle)] text-[var(--admin-warning)]", icon: Clock, }, 2: { label: "Closed", class: "bg-muted text-muted-foreground", icon: CheckCircle2, }, }; interface PageProps { searchParams: Promise<{ state?: string; page?: string }>; } export default async function CfhListPage({ searchParams }: PageProps) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.MODERATION_VIEW, session.user.rank)) redirect("/admin"); const sp = await searchParams; const stateFilter = sp.state !== undefined ? Number(sp.state) : -1; const page = Math.max(1, Number(sp.page) || 1); const perPage = 25; const where = stateFilter >= 0 ? { state: stateFilter } : {}; const [tickets, total] = await Promise.all([ prisma.supportTickets.findMany({ where, orderBy: { id: "desc" }, skip: (page - 1) * perPage, take: perPage, }), prisma.supportTickets.count({ where }), ]); // Fetch all related users const userIds = [ ...new Set([ ...tickets.map((t) => t.senderId), ...tickets.map((t) => t.reportedId), ...tickets.map((t) => t.modId), ]), ].filter(Boolean); const users = userIds.length > 0 ? await prisma.user.findMany({ where: { id: { in: userIds } }, select: { id: true, username: true }, }) : []; const userMap = new Map(users.map((u) => [u.id, u.username])); const totalPages = Math.ceil(total / perPage); return (
{ticket.issue || "No description"}
Room #{ticket.roomId} ยท{" "} {new Date(ticket.timestamp * 1000).toLocaleString()}