import Link from 'next/link'; import { ArrowRight, FileText, GraduationCap, Mail, Plus, UserCheck, UserPlus, CalendarDays, Activity, BedDouble, } from 'lucide-react'; import { createBookingManagementApi } from '@kit/booking-management/api'; import { createCourseManagementApi } from '@kit/course-management/api'; import { createEventManagementApi } from '@kit/event-management/api'; import { createFinanceApi } from '@kit/finance/api'; import { createMemberManagementApi } from '@kit/member-management/api'; import { createNewsletterApi } from '@kit/newsletter/api'; import { formatDate } from '@kit/shared/dates'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Badge } from '@kit/ui/badge'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@kit/ui/card'; import { AccountNotFound } from '~/components/account-not-found'; import { CmsPageShell } from '~/components/cms-page-shell'; import { EmptyState } from '~/components/empty-state'; import { StatsCard } from '~/components/stats-card'; interface TeamAccountHomePageProps { params: Promise<{ account: string }>; } export default async function TeamAccountHomePage({ params, }: TeamAccountHomePageProps) { const { account } = await params; const client = getSupabaseServerClient(); const { data: acct } = await client .from('accounts') .select('id, name') .eq('slug', account) .single(); if (!acct) return ; // Load all stats in parallel with allSettled for resilience const [ memberStatsResult, courseStatsResult, invoicesResult, newslettersResult, bookingsResult, eventsResult, ] = await Promise.allSettled([ createMemberManagementApi(client).getMemberStatistics(acct.id), createCourseManagementApi(client).getStatistics(acct.id), createFinanceApi(client).listInvoices(acct.id, { status: 'draft' }), createNewsletterApi(client).listNewsletters(acct.id), createBookingManagementApi(client).listBookings(acct.id, { page: 1 }), createEventManagementApi(client).listEvents(acct.id, { page: 1 }), ]); const memberStats = memberStatsResult.status === 'fulfilled' ? memberStatsResult.value : { total: 0, active: 0, inactive: 0, pending: 0, resigned: 0 }; const courseStats = courseStatsResult.status === 'fulfilled' ? courseStatsResult.value : { totalCourses: 0, openCourses: 0, completedCourses: 0, totalParticipants: 0, }; const openInvoices = invoicesResult.status === 'fulfilled' ? invoicesResult.value : []; const newsletters = newslettersResult.status === 'fulfilled' ? newslettersResult.value : []; const bookings = bookingsResult.status === 'fulfilled' ? bookingsResult.value : { data: [], total: 0 }; const events = eventsResult.status === 'fulfilled' ? eventsResult.value : { data: [], total: 0 }; const accountName = acct.name ? String(acct.name) : 'Dashboard'; return (
{/* Stats Row */}
} description={`${memberStats.total} gesamt, ${memberStats.pending} ausstehend`} /> } description={`${courseStats.totalCourses} gesamt, ${courseStats.totalParticipants} Teilnehmer`} /> } description="Entwürfe zum Versenden" /> } description="Erstellt" />
{/* Letzte Aktivität */} Letzte Aktivität Aktuelle Buchungen und Veranstaltungen
{/* Recent bookings */} {bookings.data .slice(0, 3) .map((booking: Record) => (
Buchung{' '} {booking.check_in ? formatDate(booking.check_in as string) : '—'}

{formatDate(booking.check_in as string)} –{' '} {formatDate(booking.check_out as string)}

{String(booking.status ?? '—')}
))} {/* Recent events */} {events.data .slice(0, 3) .map((event: Record) => (
{String(event.name)}

{formatDate(event.event_date as string)}

{String(event.status ?? '—')}
))} {bookings.data.length === 0 && events.data.length === 0 && ( } title="Noch keine Aktivitäten" description="Aktuelle Buchungen und Veranstaltungen werden hier angezeigt." /> )}
{/* Schnellaktionen */} Schnellaktionen Häufig verwendete Aktionen Neues Mitglied Neuer Kurs Newsletter erstellen Neue Buchung Neue Veranstaltung
{/* Module Overview Row */}

Buchungen

{bookings.total}

{ bookings.data.filter( (b: Record) => b.status === 'confirmed' || b.status === 'checked_in', ).length }{' '} aktiv

Veranstaltungen

{events.total}

{ events.data.filter( (e: Record) => e.status === 'published' || e.status === 'registration_open', ).length }{' '} aktiv

Kurse abgeschlossen

{courseStats.completedCourses}

von {courseStats.totalCourses} insgesamt

); }