'use client' import { useState, useEffect } from 'react' import { AlertTriangle, Bot, CheckCircle2 } from 'lucide-react' import { toast } from 'sonner' import { trpc } from '@/lib/trpc/client' import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from '@/components/ui/sheet' import { Button } from '@/components/ui/button' import { ScrollArea } from '@/components/ui/scroll-area' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' interface AssignmentPreviewSheetProps { roundId: string open: boolean onOpenChange: (open: boolean) => void } export function AssignmentPreviewSheet({ roundId, open, onOpenChange, }: AssignmentPreviewSheetProps) { const utils = trpc.useUtils() const { data: preview, isLoading, refetch, } = trpc.roundAssignment.preview.useQuery( { roundId, honorIntents: true, requiredReviews: 3 }, { enabled: open } ) const { mutate: execute, isPending: isExecuting } = trpc.roundAssignment.execute.useMutation({ onSuccess: (result) => { toast.success(`Created ${result.created} assignments`) utils.roundAssignment.coverageReport.invalidate({ roundId }) utils.roundAssignment.unassignedQueue.invalidate({ roundId }) utils.assignment.listByStage.invalidate({ roundId }) utils.roundEngine.getProjectStates.invalidate({ roundId }) onOpenChange(false) }, onError: (err) => { toast.error(err.message) }, }) useEffect(() => { if (open) { refetch() } }, [open, refetch]) const handleExecute = () => { if (!preview?.assignments || preview.assignments.length === 0) { toast.error('No assignments to execute') return } execute({ roundId, assignments: preview.assignments.map((a: any) => ({ userId: a.userId, projectId: a.projectId, })), }) } return ( Assignment Preview AI Suggested Review the proposed assignments before executing. All assignments are admin-approved on execute. {isLoading ? (
{[1, 2, 3].map((i) => ( ))}
) : preview ? (
{preview.stats.assignmentsGenerated || 0} Assignments Proposed

{preview.stats.totalJurors || 0} jurors will receive assignments

{preview.warnings && preview.warnings.length > 0 && ( Warnings ({preview.warnings.length})
    {preview.warnings.map((warning: string, idx: number) => (
  • {warning}
  • ))}
)} {preview.assignments && preview.assignments.length > 0 && ( Assignment Summary
Total assignments: {preview.assignments.length}
Unique projects: {new Set(preview.assignments.map((a: any) => a.projectId)).size}
Unique jurors: {new Set(preview.assignments.map((a: any) => a.userId)).size}
)}
) : (

No preview data available

)}
) }