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 = { 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 (

CFH Tickets

In-game Call For Help reports

{/* Filters */}
{[ { key: -1, label: 'All' }, { key: 0, label: 'Open' }, { key: 1, label: 'Picked' }, { key: 2, label: 'Closed' }, ].map(({ key, label }) => ( = 0 ? `?state=${key}` : ''}`}> {label} ))}
{/* Table */}
# Issue Sender Reported Mod Status
{tickets.length === 0 ? (
No tickets found.
) : ( tickets.map((ticket) => { const state = CFH_STATES[ticket.state] ?? CFH_STATES[0] const StateIcon = state.icon return ( {ticket.id}

{ticket.issue || 'No description'}

Room #{ticket.roomId} ยท {new Date(ticket.timestamp * 1000).toLocaleString()}

{userMap.get(ticket.senderId) ?? 'โ€”'} {userMap.get(ticket.reportedId) ?? 'โ€”'} {userMap.get(ticket.modId) ?? 'โ€”'} {state.label} ) }) )}
{/* Pagination */} {totalPages > 1 && (
{page > 1 && ( Previous )} Page {page} of {totalPages} {page < totalPages && ( Next )}
)}
) }