import type { Metadata } from "next"; import { notFound } from "next/navigation"; import Link from "next/link"; import { headers } from "next/headers"; import { getPayload } from "payload"; import config from "@payload-config"; import { PageHeader } from "@/components/PageHeader"; import { Section } from "@/components/Section"; import { ImagePlaceholder } from "@/components/ImagePlaceholder"; import { RichText } from "@/components/RichText"; import { CTA } from "@/components/CTA"; import { RegisterForm } from "@/components/meeting/RegisterForm"; import { getEventBySlug } from "@/lib/payload/content"; import { mediaAlt, mediaUrl } from "@/lib/payload/media"; import { formatFullDate, formatTimeRange } from "@/lib/format"; import { EVENT_CATEGORIES } from "@/collections/Events"; import { canJoinMeeting, combineDateAndTime, getMeetingStatus, statusLabel } from "@/lib/meeting/status"; export const dynamic = "force-dynamic"; type Args = { params: Promise<{ slug: string }> }; export async function generateMetadata({ params }: Args): Promise { const { slug } = await params; const event = await getEventBySlug(slug); if (!event) return {}; return { title: event.title }; } export default async function EventDetailPage({ params }: Args) { const { slug } = await params; const event = await getEventBySlug(slug); if (!event) notFound(); const categoryLabel = EVENT_CATEGORIES.find((c) => c.value === event.category)?.label; const time = formatTimeRange(event.startTime, event.endTime); let meetingCard = null; if (event.isOnline) { const payload = await getPayload({ config }); const { user } = await payload.auth({ headers: await headers() }); const isHost = Boolean(user); const settings = await payload.findGlobal({ slug: "meeting-settings" }); const start = combineDateAndTime(event.date, event.startTime); const end = event.endTime ? combineDateAndTime(event.date, event.endTime) : new Date(start.getTime() + 60 * 60_000); const status = getMeetingStatus({ start, end, joinWindowMinutes: isHost ? settings.hostJoinWindowMinutes : settings.participantJoinWindowMinutes, closeAfterMinutes: settings.meetingCloseAfterMinutes, }); const joinable = canJoinMeeting(status); meetingCard = (

Online-Termin

{joinable ? ( {statusLabel[status]} ) : (

{statusLabel[status]}

)}
); } return ( <>
{event.description && } {event.registrationRequired && (

Anmeldung

)}
{meetingCard}
Datum
{formatFullDate(event.date)}
{time && (
Uhrzeit
{time}
)} {event.location && (
Ort
{event.location}
)} {event.maxParticipants && (
Teilnehmerzahl
max. {event.maxParticipants}
)} {event.registrationRequired && event.registrationInfo && (
Anmeldung
{event.registrationInfo}
)}
); }