import { CalendarDays, Gift, Trophy, Users } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { notFound, redirect } from "next/navigation"; import { AdminBreadcrumb } from "@/components/admin/admin-breadcrumb"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; import { EventForm } from "../event-form"; import { EventPrizesManager } from "./event-prizes"; import { EventRegistrations } from "./event-registrations"; import { EventWinnersManager } from "./event-winners"; export default async function EventDetailPage({ params, }: { params: Promise<{ locale: string; id: string }>; }) { const { id } = await params; const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.EVENTS_EDIT, session.user.rank)) { redirect("/admin/events"); } const eventId = parseInt(id, 10); if (Number.isNaN(eventId)) notFound(); const t = await getTranslations("pages.admin.events"); const tHubs = await getTranslations("pages.admin.hubs"); const event = await prisma.websiteEvent.findUnique({ where: { id: eventId }, include: { type: true, prizes: { orderBy: { position: "asc" } }, winners: { orderBy: { position: "asc" } }, registrations: { orderBy: { createdAt: "desc" } }, }, }); if (!event) notFound(); const eventTypes = await prisma.websiteEventType.findMany({ where: { isActive: 1 }, orderBy: { name: "asc" }, }); // Fetch usernames for registrations and winners const userIds = [ ...event.registrations.map((r) => r.userId), ...event.winners.map((w) => w.userId), ]; const users = userIds.length > 0 ? await prisma.user.findMany({ where: { id: { in: [...new Set(userIds)] } }, select: { id: true, username: true }, }) : []; const userMap = new Map(users.map((u) => [u.id, u.username])); const statusLabel: Record = { published: t("statusPublished"), draft: t("statusDraft"), cancelled: t("statusCancelled"), completed: t("statusCompleted"), }; return (

{event.title}

{statusLabel[event.status] ?? event.status}

{event.type.name} · {new Date(event.startsAt).toLocaleString()}

{/* Stats */}
{t("statRegistrations")}
{event.registrations.length}
{event.maxPlayers && (

{t("maxPlayers", { count: event.maxPlayers })}

)}
{t("statPrizes")}
{event.prizes.length}
{t("statWinners")}
{event.winners.length}
{t("statTime")}
{new Date(event.startsAt) > new Date() ? t("timeUpcoming") : t("timePast")}
{event.endsAt && (

{t("endsAt", { date: new Date(event.endsAt).toLocaleString(), })}

)}
{/* Edit form */} {/* Prizes */} {/* Winners */} ({ ...w, username: userMap.get(w.userId) ?? t("userFallback", { id: w.userId }), }))} /> {/* Registrations */} ({ ...r, username: userMap.get(r.userId) ?? t("userFallback", { id: r.userId }), }))} />
); }