import { useState, useMemo } from "react"; import { Input } from "~/components/ui/input"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { Search, ArrowUpDown } from "lucide-react"; interface Participant { id: string; name: string; sport: string; expectedValue: number; } interface DraftPick { participantId: string; } interface PlayerListProps { participants: Participant[]; draftPicks: DraftPick[]; onAddToQueue?: (participantId: string) => void; onDraftPlayer?: (participantId: string) => void; canDraft: boolean; } export function PlayerList({ participants, draftPicks, onAddToQueue, onDraftPlayer, canDraft, }: PlayerListProps) { const [searchQuery, setSearchQuery] = useState(""); const [sportFilter, setSportFilter] = useState("all"); const [sortBy, setSortBy] = useState<"ev" | "name">("ev"); // Get unique sports const sports = useMemo(() => { const uniqueSports = new Set(participants.map((p) => p.sport)); return Array.from(uniqueSports).sort(); }, [participants]); // Get drafted participant IDs const draftedIds = useMemo(() => { return new Set(draftPicks.map((p) => p.participantId)); }, [draftPicks]); // Filter and sort participants const filteredParticipants = useMemo(() => { let filtered = participants.filter((p) => { // Filter out drafted players if (draftedIds.has(p.id)) return false; // Filter by search query if (searchQuery && !p.name.toLowerCase().includes(searchQuery.toLowerCase())) { return false; } // Filter by sport if (sportFilter !== "all" && p.sport !== sportFilter) { return false; } return true; }); // Sort if (sortBy === "ev") { filtered.sort((a, b) => b.expectedValue - a.expectedValue); } else { filtered.sort((a, b) => a.name.localeCompare(b.name)); } return filtered; }, [participants, draftedIds, searchQuery, sportFilter, sortBy]); return (
{/* Filters */}
{/* Search */}
setSearchQuery(e.target.value)} className="pl-9" />
{/* Sport Filter and Sort */}
{/* Player Count */}
{filteredParticipants.length} player{filteredParticipants.length !== 1 ? "s" : ""} available
{/* Player Table */}
{filteredParticipants.length === 0 ? (
No players found
) : ( {filteredParticipants.map((participant) => ( ))}
Player Sport EV Actions
{participant.name} {participant.sport} {participant.expectedValue.toFixed(1)}
{onAddToQueue && ( )} {canDraft && onDraftPlayer && ( )}
)}
); }