feat: add totalRounds prop to DraftSummaryView and pass from DraftRoom (#60)

This commit is contained in:
Chris Parsons 2026-03-02 22:19:19 -08:00 committed by GitHub
parent 16aa450d63
commit d53bd271c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 43 additions and 9 deletions

View file

@ -6,6 +6,7 @@ interface DraftSummaryViewProps {
ownerMap?: Record<string, string>;
picks: DraftPick[];
sports: Array<{ id: string; name: string }>;
totalRounds: number;
}
export const DraftSummaryView = memo(function DraftSummaryView({
@ -13,24 +14,42 @@ export const DraftSummaryView = memo(function DraftSummaryView({
ownerMap = {},
picks,
sports,
totalRounds,
}: DraftSummaryViewProps) {
const picksByTeamAndSport = useMemo(
() => groupPicksByTeamAndSport(picks),
[picks]
);
const totalPicksBySport = useMemo(() => {
const map = new Map<string, number>();
sports.forEach((sport) => {
let count = 0;
picksByTeamAndSport.forEach((teamMap) => {
count += teamMap.get(sport.id)?.length ?? 0;
const sportStats = useMemo(() => {
const map = new Map<string, { total: number; teams: number }>();
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++;
}
});
map.set(sport.id, count);
});
return map;
}, [picksByTeamAndSport, sports]);
const flexPicksAvailable = Math.max(0, totalRounds - sports.length);
const flexPicksUsedByTeam = useMemo(() => {
const map = new Map<string, number>();
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 (
<div className="flex items-center justify-center h-full p-8 text-muted-foreground">
@ -59,6 +78,8 @@ export const DraftSummaryView = memo(function DraftSummaryView({
{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 (
<th
key={slot.id}
@ -66,6 +87,11 @@ export const DraftSummaryView = memo(function DraftSummaryView({
className={`border-b border-border p-2 text-center font-semibold bg-muted/50 min-w-[60px] ${!isLast ? "border-r" : ""}`}
>
<span className="text-sm">{displayName}</span>
{flexPicksAvailable > 0 && (
<div className={`text-xs mt-0.5 ${flexesExhausted ? "text-destructive font-medium" : "font-normal text-muted-foreground"}`}>
{used} of {flexPicksAvailable} flexes
</div>
)}
</th>
);
})}
@ -74,7 +100,7 @@ export const DraftSummaryView = memo(function DraftSummaryView({
<tbody>
{sports.map((sport, sportIndex) => {
const isLastRow = sportIndex === sports.length - 1;
const sportTotal = totalPicksBySport.get(sport.id) ?? 0;
const { total: sportTotal, teams: sportTeamCount } = sportStats.get(sport.id) ?? { total: 0, teams: 0 };
return (
<tr key={sport.id}>
<th
@ -86,7 +112,14 @@ export const DraftSummaryView = memo(function DraftSummaryView({
<td
className={`border-r border-border p-2 text-center text-sm font-semibold bg-muted/30 ${!isLastRow ? "border-b" : ""}`}
>
{sportTotal > 0 ? sportTotal : null}
{sportTotal > 0 ? (
<>
<div>{sportTotal}</div>
<div className="text-xs font-normal text-muted-foreground mt-0.5">
{sportTeamCount} team{sportTeamCount !== 1 ? "s" : ""}
</div>
</>
) : null}
</td>
{draftSlots.map((slot, slotIndex) => {
const count =

View file

@ -1463,6 +1463,7 @@ export default function DraftRoom() {
picks,
sports: seasonSportsData,
ownerMap,
totalRounds: season.draftRounds,
};
const rosterViewProps = {