import { asc, eq, inArray } from "drizzle-orm"; import { CalendarDays, Gift, Trophy, Users } from "lucide-react"; import { notFound, redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { AdminBreadcrumb } from "@/components/admin/admin-breadcrumb"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { db, User, WebsiteEvent, WebsiteEventType } from "@/lib/db"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; 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 db.query.WebsiteEvent.findFirst({ where: eq(WebsiteEvent.id, eventId), with: { type: true, prizes: { orderBy: (p, { asc: a }) => [a(p.position)] }, winners: { orderBy: (w, { asc: a }) => [a(w.position)] }, registrations: { orderBy: (r, { desc: d }) => [d(r.createdAt)] }, }, }); if (!event) notFound(); const eventTypes = await db .select() .from(WebsiteEventType) .where(eq(WebsiteEventType.isActive, 1)) .orderBy(asc(WebsiteEventType.name)); // 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 db .select({ id: User.id, username: User.username }) .from(User) .where(inArray(User.id, [...new Set(userIds)])) : []; 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 }), }))} />
); }