import Link from 'next/link'; import { GraduationCap, Users, Calendar, Euro, User, Clock, Pencil, } from 'lucide-react'; import { getTranslations } from 'next-intl/server'; import { createCourseManagementApi } from '@kit/course-management/api'; import { formatDate, formatCurrencyAmount } from '@kit/shared/dates'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { AccountNotFound } from '~/components/account-not-found'; import { CmsPageShell } from '~/components/cms-page-shell'; import { COURSE_STATUS_VARIANT, COURSE_STATUS_LABEL_KEYS, } from '~/lib/status-badges'; import { CreateSessionDialog } from './create-session-dialog'; import { DeleteCourseButton } from './delete-course-button'; interface PageProps { params: Promise<{ account: string; courseId: string }>; } export default async function CourseDetailPage({ params }: PageProps) { const { account, courseId } = await params; const client = getSupabaseServerClient(); const api = createCourseManagementApi(client); const t = await getTranslations('courses'); const [course, participants, sessions] = await Promise.all([ api.courses.getById(courseId), api.enrollment.listParticipants(courseId), api.sessions.list(courseId), ]); if (!course) return ; const courseData = course as Record; return (
{/* Action Buttons */}
{/* Summary Cards */}

{t('detail.name')}

{String(courseData.name)}

{t('common.status')}

{t( COURSE_STATUS_LABEL_KEYS[String(courseData.status)] ?? String(courseData.status), )}

{t('detail.instructor')}

{String(courseData.instructor_id ?? '—')}

{t('detail.dateRange')}

{formatDate(courseData.start_date as string)} {' – '} {formatDate(courseData.end_date as string)}

{t('list.fee')}

{courseData.fee != null ? formatCurrencyAmount(courseData.fee as number) : '—'}

{t('detail.participants')}

{participants.length} / {String(courseData.capacity ?? '∞')}

{/* Participants Section */} {t('detail.participants')}
{participants.length === 0 ? ( ) : ( participants.map((p: Record) => ( )) )}
{t('detail.name')} {t('detail.email')} {t('common.status')} {t('detail.date')}
{t('detail.noParticipants')}
{String(p.last_name ?? '')},{' '} {String(p.first_name ?? '')} {String(p.email ?? '—')} {String(p.status ?? '—')} {formatDate(p.enrolled_at as string)}
{/* Sessions Section */} {t('detail.sessions')}
{sessions.length === 0 ? ( ) : ( sessions.map((s: Record) => ( )) )}
{t('detail.date')} {t('list.startDate')} {t('list.endDate')} {t('detail.cancelled')}
{t('detail.noSessions')}
{formatDate(s.session_date as string)} {String(s.start_time ?? '—')} {String(s.end_time ?? '—')} {s.cancelled ? ( {t('common.yes')} ) : ( '—' )}
); }