import Link from 'next/link'; import { CalendarDays, ClipboardList, Users } from 'lucide-react'; import { getTranslations } from 'next-intl/server'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Badge } from '@kit/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { createEventManagementApi } from '@kit/event-management/api'; import { CmsPageShell } from '~/components/cms-page-shell'; import { EmptyState } from '~/components/empty-state'; import { StatsCard } from '~/components/stats-card'; import { AccountNotFound } from '~/components/account-not-found'; import { EVENT_STATUS_VARIANT, EVENT_STATUS_LABEL } from '~/lib/status-badges'; interface PageProps { params: Promise<{ account: string }>; } export default async function EventRegistrationsPage({ params }: PageProps) { const { account } = await params; const client = getSupabaseServerClient(); const t = await getTranslations('cms.events'); const { data: acct } = await client .from('accounts') .select('id') .eq('slug', account) .single(); if (!acct) return ; const api = createEventManagementApi(client); const events = await api.listEvents(acct.id, { page: 1 }); // Load registrations for each event in parallel const eventsWithRegistrations = await Promise.all( events.data.map(async (event: Record) => { const registrations = await api.getRegistrations(String(event.id)); return { id: String(event.id), name: String(event.name), eventDate: event.event_date ? String(event.event_date) : null, status: String(event.status ?? 'draft'), capacity: event.capacity != null ? Number(event.capacity) : null, registrationCount: registrations.length, }; }), ); const totalRegistrations = eventsWithRegistrations.reduce( (sum, e) => sum + e.registrationCount, 0, ); const eventsWithRegs = eventsWithRegistrations.filter( (e) => e.registrationCount > 0, ); return (
{/* Header */}

{t('registrations')}

{t('registrationsOverview')}

{/* Stats */}
} /> } /> } />
{/* Registration Summary Table */} {eventsWithRegistrations.length === 0 ? ( } title={t('noEvents')} description={t('noEventsForRegistrations')} actionLabel={t('newEvent')} actionHref={`/home/${account}/events/new`} /> ) : ( {t('overviewByEvent')} ({eventsWithRegistrations.length})
{eventsWithRegistrations.map((event) => { const utilization = event.capacity && event.capacity > 0 ? Math.round( (event.registrationCount / event.capacity) * 100, ) : null; return ( ); })}
{t('event')} {t('eventDate')} {t('status')} {t('capacity')} {t('registrations')} {t('utilization')}
{event.name} {event.eventDate ? new Date(event.eventDate).toLocaleDateString( 'de-DE', ) : '—'} {EVENT_STATUS_LABEL[event.status] ?? event.status} {event.capacity ?? '—'} {event.registrationCount} {utilization !== null ? ( = 90 ? 'destructive' : utilization >= 70 ? 'default' : 'secondary' } > {utilization}% ) : ( )}
)}
); }