'use client' import { useState, useMemo } from 'react' import { useDebounce } from '@/hooks/use-debounce' import Link from 'next/link' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Card, CardContent, } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' import { Input } from '@/components/ui/input' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Plus, Pencil, ExternalLink, Building2, Eye, EyeOff, Globe, Search, } from 'lucide-react' const visibilityIcons = { ADMIN_ONLY: EyeOff, JURY_VISIBLE: Eye, PUBLIC: Globe, } const partnerTypeColors: Record = { SPONSOR: 'bg-yellow-100 text-yellow-800', PARTNER: 'bg-blue-100 text-blue-800', SUPPORTER: 'bg-green-100 text-green-800', MEDIA: 'bg-purple-100 text-purple-800', OTHER: 'bg-gray-100 text-gray-800', } export default function PartnersPage() { const { data, isLoading } = trpc.partner.list.useQuery({ perPage: 50 }) const partners = data?.data const [search, setSearch] = useState('') const debouncedSearch = useDebounce(search, 300) const [typeFilter, setTypeFilter] = useState('all') const [activeFilter, setActiveFilter] = useState('all') const filteredPartners = useMemo(() => { if (!partners) return [] return partners.filter((partner) => { const matchesSearch = !debouncedSearch || partner.name.toLowerCase().includes(debouncedSearch.toLowerCase()) || partner.description?.toLowerCase().includes(debouncedSearch.toLowerCase()) const matchesType = typeFilter === 'all' || partner.partnerType === typeFilter const matchesActive = activeFilter === 'all' || (activeFilter === 'active' && partner.isActive) || (activeFilter === 'inactive' && !partner.isActive) return matchesSearch && matchesType && matchesActive }) }, [partners, debouncedSearch, typeFilter, activeFilter]) if (isLoading) { return (
{/* Toolbar skeleton */}
{/* Partner cards skeleton */}
{[...Array(6)].map((_, i) => (
))}
) } return (
{/* Header */}

Partners

Manage partner and sponsor organizations

{/* Toolbar */}
setSearch(e.target.value)} className="pl-9" />
{/* Results count */} {partners && (

{filteredPartners.length} of {partners.length} partners

)} {/* Partners Grid */} {filteredPartners.length > 0 ? (
{filteredPartners.map((partner) => { const VisibilityIcon = visibilityIcons[partner.visibility as keyof typeof visibilityIcons] || Eye return (

{partner.name}

{!partner.isActive && ( Inactive )}
{partner.partnerType}
{partner.description && (

{partner.description}

)}
{partner.website && ( )}
) })}
) : partners && partners.length > 0 ? (

No partners match your filters

) : (

No partners yet

Add sponsor and partner organizations to showcase on the platform.

)}
) }