import config from "@payload-config"; import { headers as nextHeaders } from "next/headers"; import { notFound, redirect } from "next/navigation"; import { getPayload } from "payload"; import type { Ticket } from "@/payload-types"; import { TicketDetail } from "@/components/frontend/helpdesk/TicketDetail"; import { hasPermission } from "@/utils/access-control/hasPermission"; import { ArrowLeftIcon, LifeBuoyIcon } from "lucide-react"; import Link from "next/link"; export const metadata = { title: "Ticket — Polaris Task Force", }; interface TicketPageProps { params: Promise<{ id: string }>; } export default async function TicketPage({ params }: TicketPageProps) { const { id } = await params; const headers = await nextHeaders(); const payload = await getPayload({ config }); const { user } = await payload.auth({ headers, canSetHeaders: false, }); if (!user) { const pathname = headers.get("x-invoke-path") || `/helpdesk/${id}`; redirect(`/login?returnTo=${encodeURIComponent(pathname)}`); } const ticket = await payload .findByID({ collection: "tickets", id: Number(id), depth: 2, }) .catch(() => null); if (!ticket) { notFound(); } const typedTicket = ticket as unknown as Ticket; const isStaff = await hasPermission(payload, user, "tickets:staff"); const assigneeOptions = isStaff ? ( await payload.find({ collection: "users", sort: "username", limit: 100, depth: 0, }) ).docs.map((staffUser) => ({ id: staffUser.id, label: staffUser.payloadDisplayName || staffUser.username, })) : []; return (
Helpdesk

Ticket #{typedTicket.id}

); }