'use client' import { useState } from 'react' import { useParams, useRouter } from 'next/navigation' import { ArrowLeft, Loader2, PlayCircle, Zap } from 'lucide-react' import { toast } from 'sonner' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Skeleton } from '@/components/ui/skeleton' import { CoverageReport } from '@/components/admin/assignment/coverage-report' import { AssignmentPreviewSheet } from '@/components/admin/assignment/assignment-preview-sheet' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' export default function AssignmentsDashboardPage() { const params = useParams() const router = useRouter() const competitionId = params.competitionId as string const [selectedRoundId, setSelectedRoundId] = useState('') const [previewSheetOpen, setPreviewSheetOpen] = useState(false) const aiAssignmentMutation = trpc.roundAssignment.aiPreview.useMutation({ onSuccess: () => { toast.success('AI assignments ready!', { action: { label: 'Review', onClick: () => setPreviewSheetOpen(true) }, duration: 10000, }) }, onError: (err) => toast.error(`AI generation failed: ${err.message}`), }) const { data: competition, isLoading: isLoadingCompetition } = trpc.competition.getById.useQuery({ id: competitionId, }) const { data: selectedRound } = trpc.round.getById.useQuery( { id: selectedRoundId }, { enabled: !!selectedRoundId } ) const requiredReviews = (selectedRound?.configJson as Record)?.requiredReviewsPerProject as number || 3 const { data: unassignedQueue, isLoading: isLoadingQueue } = trpc.roundAssignment.unassignedQueue.useQuery( { roundId: selectedRoundId, requiredReviews }, { enabled: !!selectedRoundId } ) const rounds = competition?.rounds || [] const currentRound = rounds.find((r) => r.id === selectedRoundId) if (isLoadingCompetition) { return (
) } if (!competition) { return (

Competition not found

) } return (

Assignment Dashboard

Manage jury assignments for rounds

Select Round Choose a round to view and manage assignments {selectedRoundId && (
{aiAssignmentMutation.data && ( )}
Coverage Report Unassigned Queue Unassigned Projects Projects with fewer than {requiredReviews} assignments {isLoadingQueue ? (
{[1, 2, 3].map((i) => ( ))}
) : unassignedQueue && unassignedQueue.length > 0 ? (
{unassignedQueue.map((project: any) => (

{project.title}

{project.competitionCategory || 'No category'}

{project.assignmentCount || 0} / {requiredReviews} assignments
))}
) : (

All projects have sufficient assignments

)}
aiAssignmentMutation.mutate({ roundId: selectedRoundId, requiredReviews })} onResetAI={() => aiAssignmentMutation.reset()} />
)}
) }