import type { Metadata } from "next"; import Image from "next/image"; import { getTranslations } from "next-intl/server"; import Link from "@/components/link"; import { LocalEventTime } from "@/components/public/local-event-time"; import { ContentCard, EmptyState } from "@/components/public/ui"; import { auth } from "@/lib/auth"; import { excerpt, slugify } from "@/lib/format"; import { logger } from "@/lib/logger"; import { withPublicPagePerformance } from "@/lib/public-page-performance"; import { loadPublicEvents } from "@/lib/services/public-events"; export async function generateMetadata(): Promise { const t = await getTranslations("pages.events"); return { title: t("title"), description: t("subtitle"), openGraph: { title: t("title"), description: t("subtitle"), type: "website", }, }; } async function EventsPage({ searchParams, }: { searchParams: Promise<{ status?: string; week?: string; mine?: string; page?: string; }>; }) { const t = await getTranslations("pages.events"); const params = await searchParams; const session = await auth(); const currentWeek = new Date(); currentWeek.setUTCDate( currentWeek.getUTCDate() - ((currentWeek.getUTCDay() + 6) % 7), ); const weeklyHref = (offset: number) => { const date = new Date( result?.week ? `${result.week}T00:00:00Z` : currentWeek, ); date.setUTCDate(date.getUTCDate() + offset * 7); return ( "/events?" + new URLSearchParams({ status: result?.status ?? "all", mine: params.mine ?? "", week: date.toISOString().slice(0, 10), }) ); }; const result = await loadPublicEvents({ status: params.status, week: params.week, mine: params.mine === "1", userId: Number(session?.user?.id) || undefined, page: Number(params.page ?? 1), }).catch((error) => { logger.error("Public events query failed", { module: "events", error }); return null; }); const events = result?.events ?? []; const href = (page: number) => `/events?${new URLSearchParams({ status: result?.status ?? "all", week: result?.week ?? "", mine: params.mine ?? "", page: String(page) })}`; return (
{session?.user && ( )} {t("reset")}

{t("timeZoneHint")}

{params.mine === "1" && !session?.user && (

{t("loginForRegistrations")}

)}
{!result ? (

{t("loadError")}

) : events.length === 0 ? ( {t("empty")} ) : (
{events.map((event) => { const href = `/events/${slugify(event.title)}-${event.id}`; const spots = event.maxPlayers != null ? t("spots", { count: event._count.registrations, max: event.maxPlayers, }) : t("registered", { count: event._count.registrations }); return ( {event.image ? (
) : (
)}

{event.type.name} {` ยท ${t(event.phase === "completed" ? "statusCompleted" : event.phase === "upcoming" ? "statusUpcoming" : "statusOngoing")}`}{" "} {event.registered && ` ยท ${t("youRegistered")}`}

{event.title}

{excerpt(event.description, 120)}

{spots}

); })}
)} {result && ( )}
); } export default withPublicPagePerformance("/events", EventsPage);