import { memo, useMemo } from "react"; import { type DraftPick, groupPicksByTeamAndSport } from "./picks-utils"; interface DraftSummaryViewProps { draftSlots: Array<{ id: string; team: { id: string; name: string } }>; 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.

); } return (
{draftSlots.map((slot, index) => { const displayName = ownerMap[slot.team.id] || slot.team.name; const isLast = index === draftSlots.length - 1; const used = flexPicksUsedByTeam.get(slot.team.id) ?? 0; const flexesExhausted = flexPicksAvailable > 0 && used >= flexPicksAvailable; return ( ); })} {sports.map((sport, sportIndex) => { const isLastRow = sportIndex === sports.length - 1; const { total: sportTotal, teams: sportTeamCount } = sportStats.get(sport.id) ?? { total: 0, teams: 0 }; return ( {draftSlots.map((slot, slotIndex) => { const count = picksByTeamAndSport.get(slot.team.id)?.get(sport.id) ?.length ?? 0; const isLast = slotIndex === draftSlots.length - 1; return ( ); })} ); })}
Sport Total {displayName} {flexPicksAvailable > 0 && (
{used} of {flexPicksAvailable} flexes
)}
{sport.name} {sportTotal > 0 ? ( <>
{sportTotal}
{sportTeamCount} team{sportTeamCount !== 1 ? "s" : ""}
) : null}
= 2 ? "bg-accent/30 font-semibold" : "bg-background" } ${!isLastRow ? "border-b" : ""} ${!isLast ? "border-r" : ""}`} > {count > 0 ? count : null}
); });