import { memo, useMemo, Fragment } from "react"; import { TeamAvatar } from "~/components/TeamAvatar"; import { type DraftPick, groupPicksByTeamAndSport } from "./picks-utils"; import type { RawFlagConfig } from "~/lib/flag-types"; interface DraftSummaryViewProps { draftSlots: Array<{ id: string; team: { id: string; name: string; logoUrl?: string | null; flagConfig?: RawFlagConfig | null; avatarType?: string | null; }; }>; ownerMap?: Record; picks: DraftPick[]; sports: Array<{ id: string; name: string }>; totalRounds: number; } export const DraftSummaryView = memo(function DraftSummaryView({ draftSlots, ownerMap = {}, picks, sports, totalRounds, }: DraftSummaryViewProps) { const picksByTeamAndSport = useMemo( () => groupPicksByTeamAndSport(picks), [picks] ); const sportStats = useMemo(() => { const map = new Map(); sports.forEach((sport) => map.set(sport.id, { total: 0, teams: 0 })); picksByTeamAndSport.forEach((teamMap) => { teamMap.forEach((teamSportPicks, sportId) => { const stat = map.get(sportId); if (stat && teamSportPicks.length > 0) { stat.total += teamSportPicks.length; stat.teams++; } }); }); return map; }, [picksByTeamAndSport, sports]); const flexPicksAvailable = Math.max(0, totalRounds - sports.length); const flexPicksUsedByTeam = useMemo(() => { const map = new Map(); picksByTeamAndSport.forEach((teamMap, teamId) => { let used = 0; teamMap.forEach((teamSportPicks) => { if (teamSportPicks.length > 1) used += teamSportPicks.length - 1; }); map.set(teamId, used); }); return map; }, [picksByTeamAndSport]); if (sports.length === 0) { return (

No sports have been configured for this season.

); } const gridCols = `140px 96px repeat(${draftSlots.length}, minmax(80px, 1fr))`; return (
{/* Header row */}
Sport
Total
{draftSlots.map((slot, index) => { const ownerName = ownerMap[slot.team.id]; const isLast = index === draftSlots.length - 1; const used = flexPicksUsedByTeam.get(slot.team.id) ?? 0; const flexesExhausted = flexPicksAvailable > 0 && used >= flexPicksAvailable; return (
{ownerName || slot.team.name}
{flexPicksAvailable > 0 && ( {used}/{flexPicksAvailable} flex picks )}
); })} {/* Data rows */} {sports.map((sport, sportIndex) => { const isLastRow = sportIndex === sports.length - 1; const { total: sportTotal, teams: sportTeamCount } = sportStats.get(sport.id) ?? { total: 0, teams: 0 }; return (
{sport.name}
{sportTotal > 0 ? ( <>
{sportTotal}
{sportTeamCount}/{draftSlots.length} teams
) : ( )}
{draftSlots.map((slot, slotIndex) => { const count = picksByTeamAndSport.get(slot.team.id)?.get(sport.id)?.length ?? 0; const isLast = slotIndex === draftSlots.length - 1; const isFlex = count >= 2; return (
{count > 0 ? ( {count} ) : ( )}
); })}
); })}
); });