'use client' import { useState } from 'react' import { useParams, useRouter } from 'next/navigation' import Link from 'next/link' import type { Route } from 'next' import { ArrowLeft, Plus, Users } from 'lucide-react' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { toast } from 'sonner' export default function JuriesListPage() { const params = useParams() const router = useRouter() const competitionId = params.competitionId as string const utils = trpc.useUtils() const [createOpen, setCreateOpen] = useState(false) const [formData, setFormData] = useState({ name: '', description: '', }) const { data: juryGroups, isLoading } = trpc.juryGroup.list.useQuery({ competitionId }) const createMutation = trpc.juryGroup.create.useMutation({ onSuccess: () => { utils.juryGroup.list.invalidate({ competitionId }) toast.success('Jury group created') setCreateOpen(false) setFormData({ name: '', description: '' }) }, onError: (err) => toast.error(err.message), }) const handleCreate = () => { if (!formData.name.trim()) { toast.error('Name is required') return } const slug = formData.name .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-|-$/g, '') createMutation.mutate({ competitionId, name: formData.name.trim(), slug, description: formData.description.trim() || undefined, }) } if (isLoading) { return (
{[1, 2, 3].map((i) => ( ))}
) } return (

Jury Groups

Manage jury groups and members for this competition

{juryGroups && juryGroups.length === 0 ? (

No jury groups yet. Create one to get started.

) : (
{juryGroups?.map((group) => ( {group.name} {group.defaultCapMode} {group.slug}
Members {group._count.members}
Assignments {group._count.assignments || 0}
Default Max {group.defaultMaxAssignments}
))}
)} {/* Create Jury Group Dialog */} Create Jury Group Create a new jury group for this competition. You can add members after creation.
setFormData({ ...formData, name: e.target.value })} />