'use client' import { trpc } from '@/lib/trpc/client' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { FilePreview } from '@/components/shared/file-viewer' import { FileText, Download, ShieldAlert } from 'lucide-react' export default function FinalsDocumentsPage() { const { data: programId, isLoading: programLoading } = trpc.competition.getActiveProgramId.useQuery() const { data, isLoading, error } = trpc.finalist.listReviewDocuments.useQuery( { programId: programId! }, { enabled: !!programId, retry: false }, ) if (error?.data?.code === 'FORBIDDEN') { return (

No access

This review is for the Grand-Final jury and program admins.

) } // No active program resolved — nothing to review. if (!programLoading && !programId) { return (

No active program

Finalist documents will appear here once a program is active.

) } if (isLoading || !data) { return (
) } const fmt = new Intl.DateTimeFormat(undefined, { dateStyle: 'long', timeStyle: 'short', }) return (

Finalist Documents

{data.submittedCount} of {data.totalCount} teams complete {data.round.deadline ? ` · due ${fmt.format(new Date(data.round.deadline))}` : ''}

{data.teams.map((team) => ( {team.teamName}
{team.category && ( {team.category} )} {team.submitted ? 'Complete' : 'Incomplete'}
{team.documents.map((doc) => (
{doc.requirementName} {doc.file && ( )}
{doc.file ? ( ) : (

Not yet uploaded

)}
))}
))}
) }