import { memo, useEffect, useMemo, useState } from "react"; import { Badge } from "~/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { type DraftPick, groupPicksByTeamAndSport } from "./picks-utils"; interface TeamRosterViewProps { draftSlots: Array<{ id: string; team: { id: string; name: string } }>; ownerMap?: Record; picks: DraftPick[]; sports: Array<{ id: string; name: string }>; } export const TeamRosterView = memo(function TeamRosterView({ draftSlots, ownerMap = {}, picks, sports, }: TeamRosterViewProps) { const [selectedTeamId, setSelectedTeamId] = useState( draftSlots[0]?.team.id ?? "" ); // Reset selection if the selected team is no longer present in the slot list useEffect(() => { if ( draftSlots.length > 0 && !draftSlots.some((s) => s.team.id === selectedTeamId) ) { setSelectedTeamId(draftSlots[0].team.id); } }, [draftSlots, selectedTeamId]); const picksByTeamAndSport = useMemo( () => groupPicksByTeamAndSport(picks), [picks] ); const teamPicks = useMemo( () => picksByTeamAndSport.get(selectedTeamId), [picksByTeamAndSport, selectedTeamId] ); const sportsWithPicks = useMemo( () => sports.filter((s) => (teamPicks?.get(s.id)?.length ?? 0) > 0), [sports, teamPicks] ); const totalPicks = useMemo(() => { let count = 0; teamPicks?.forEach((sp) => (count += sp.length)); return count; }, [teamPicks]); if (draftSlots.length === 0) { return (

No teams in this draft.

); } return (
{totalPicks === 0 ? (

No picks yet

) : ( sportsWithPicks.map((sport) => { const sportPicks = teamPicks?.get(sport.id) ?? []; return (

{sport.name}

{sportPicks.length}
    {sportPicks.map((pick) => (
  • {pick.participant.name}
  • ))}
); }) )}
); });