'use client' import { useState, useMemo } from 'react' import Link from 'next/link' import type { Route } from 'next' import { trpc } from '@/lib/trpc/client' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip' import { Users, Search, CheckCircle2, AlertCircle, Clock, ArrowLeft, Loader2, } from 'lucide-react' const categoryLabels: Record = { STARTUP: 'Startup', BUSINESS_CONCEPT: 'Business Concept', } const statusConfig = { active: { label: 'Active', color: 'bg-emerald-500', icon: CheckCircle2 }, invited: { label: 'Invited', color: 'bg-amber-500', icon: Clock }, none: { label: 'No Account', color: 'bg-red-500', icon: AlertCircle }, } as const type SemiFinalistsContentProps = { editionId: string } export function SemiFinalistsContent({ editionId }: SemiFinalistsContentProps) { const { data, isLoading } = trpc.dashboard.getSemiFinalistDetail.useQuery( { editionId }, { enabled: !!editionId } ) const [search, setSearch] = useState('') const [categoryFilter, setCategoryFilter] = useState('all') const [statusFilter, setStatusFilter] = useState('all') const filtered = useMemo(() => { if (!data) return [] let items = data if (categoryFilter !== 'all') { items = items.filter(p => p.category === categoryFilter) } if (statusFilter === 'activated') { items = items.filter(p => p.allActivated) } else if (statusFilter === 'pending') { items = items.filter(p => !p.allActivated) } if (search.trim()) { const q = search.toLowerCase() items = items.filter(p => p.title.toLowerCase().includes(q) || p.teamName?.toLowerCase().includes(q) || p.country?.toLowerCase().includes(q) || p.teamMembers.some(tm => tm.name?.toLowerCase().includes(q) || tm.email.toLowerCase().includes(q) ) ) } return items }, [data, search, categoryFilter, statusFilter]) const stats = useMemo(() => { if (!data) return { total: 0, activated: 0, pending: 0 } return { total: data.length, activated: data.filter(p => p.allActivated).length, pending: data.filter(p => !p.allActivated).length, } }, [data]) if (isLoading) { return (
) } return (
{/* Header */}

Semi-Finalists

{stats.total} projects · {stats.activated} fully activated · {stats.pending} pending

{/* Filters */}
setSearch(e.target.value)} className="pl-9" />
{/* Table */} {filtered.length} project{filtered.length !== 1 ? 's' : ''} {filtered.length === 0 ? (

No semi-finalist projects match your filters.

) : (
Project Category Country Current Round Team Members Status {filtered.map((project) => ( {project.title} {project.teamName && (

{project.teamName}

)}
{categoryLabels[project.category ?? ''] ?? project.category} {project.country || '—'} {project.currentRound}
{project.teamMembers.map((tm, idx) => { const cfg = statusConfig[tm.accountStatus] const Icon = cfg.icon return (
{tm.name || tm.email}

{tm.email}

{cfg.label} {tm.lastLogin && ` · Last login: ${new Date(tm.lastLogin).toLocaleDateString()}`}

) })}
{project.allActivated ? ( ) : ( )}
))}
)}
) }