import { count, desc, eq, inArray } from "drizzle-orm"; import Image from "next/image"; import { getTranslations } from "next-intl/server"; import Link from "@/components/link"; import { ContentCard, EmptyState } from "@/components/public/ui"; import { db, WebsiteEvent, WebsiteEventRegistration, WebsiteEventType, } from "@/lib/db"; import { excerpt, slugify } from "@/lib/format"; import { formatDate } from "@/lib/format-date"; export const metadata = { title: "Events" }; export default async function EventsPage() { const t = await getTranslations("pages.events"); const eventRows = await db .select({ id: WebsiteEvent.id, title: WebsiteEvent.title, description: WebsiteEvent.description, status: WebsiteEvent.status, image: WebsiteEvent.image, startsAt: WebsiteEvent.startsAt, maxPlayers: WebsiteEvent.maxPlayers, typeName: WebsiteEventType.name, typeColor: WebsiteEventType.color, typeSlug: WebsiteEventType.slug, }) .from(WebsiteEvent) .innerJoin(WebsiteEventType, eq(WebsiteEvent.typeId, WebsiteEventType.id)) .where(inArray(WebsiteEvent.status, ["published", "completed"])) .orderBy(desc(WebsiteEvent.startsAt)) .limit(50) .catch(() => []); const eventIds = eventRows.map((e) => e.id); const regCounts = eventIds.length > 0 ? await db .select({ eventId: WebsiteEventRegistration.eventId, value: count(), }) .from(WebsiteEventRegistration) .where(inArray(WebsiteEventRegistration.eventId, eventIds)) .groupBy(WebsiteEventRegistration.eventId) .catch(() => []) : []; const countByEvent = new Map( regCounts.map((r) => [r.eventId, Number(r.value)]), ); const events = eventRows.map((event) => ({ ...event, type: { name: event.typeName, color: event.typeColor, slug: event.typeSlug, }, _count: { registrations: countByEvent.get(event.id) ?? 0 }, })); return (
{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} {event.status === "completed" ? ` ยท ${t("statusCompleted")}` : ""}

{event.title}

{formatDate(event.startsAt, "datetime", "")}

{excerpt(event.description, 120)}

{spots}

); })}
)}
); }