'use client' import Link from 'next/link' import type { Route } from 'next' import { trpc } from '@/lib/trpc/client' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader, CardTitle, } from '@/components/ui/card' import { Skeleton } from '@/components/ui/skeleton' import { Plus, Medal, Calendar, Users, Layers, FileBox, } from 'lucide-react' import { cn } from '@/lib/utils' import { formatDistanceToNow } from 'date-fns' import { useEdition } from '@/contexts/edition-context' const statusConfig = { DRAFT: { label: 'Draft', bgClass: 'bg-gray-100 text-gray-700', dotClass: 'bg-gray-500', }, ACTIVE: { label: 'Active', bgClass: 'bg-emerald-100 text-emerald-700', dotClass: 'bg-emerald-500', }, CLOSED: { label: 'Closed', bgClass: 'bg-blue-100 text-blue-700', dotClass: 'bg-blue-500', }, ARCHIVED: { label: 'Archived', bgClass: 'bg-muted text-muted-foreground', dotClass: 'bg-muted-foreground', }, } as const export default function CompetitionListPage() { const { currentEdition } = useEdition() const programId = currentEdition?.id const { data: competitions, isLoading } = trpc.competition.list.useQuery( { programId: programId! }, { enabled: !!programId } ) if (!programId) { return (

Competitions

Select an edition to view competitions

No Edition Selected

Select an edition from the sidebar to view its competitions

) } return (
{/* Header */}

Competitions

Manage competitions for {currentEdition?.name}

{/* Loading */} {isLoading && (
{[1, 2, 3].map((i) => ( ))}
)} {/* Empty State */} {!isLoading && (!competitions || competitions.length === 0) && (

No Competitions Yet

Competitions organize your multi-round evaluation workflow with jury groups, submission windows, and scoring. Create your first competition to get started.

)} {/* Competition Cards */} {competitions && competitions.length > 0 && (
{competitions.map((competition) => { const status = competition.status as keyof typeof statusConfig const config = statusConfig[status] || statusConfig.DRAFT return (
{competition.name}

{competition.slug}

{config.label}
{competition._count.rounds} rounds
{competition._count.juryGroups} juries
{competition._count.submissionWindows} windows
Updated {formatDistanceToNow(new Date(competition.updatedAt))} ago
) })}
)}
) }