import { memo, useMemo, useState } from "react"; import { TeamAvatar } from "~/components/TeamAvatar"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "~/components/ui/context-menu"; import { Sheet, SheetContent, SheetHeader, SheetTitle, } from "~/components/ui/sheet"; import { Button } from "~/components/ui/button"; import { MoreVertical } from "lucide-react"; import { formatClockTime, getTimerColorClass } from "~/lib/draft-timer"; import { DraftPickCell } from "~/components/draft/DraftPickCell"; import type { SeasonStatus } from "~/models/season"; type MobileSheetData = | { type: "team"; teamId: string } | { type: "current-cell"; pickNumber: number; teamId: string } | { type: "picked-cell"; pickNumber: number; teamId: string }; interface DraftGridSectionProps { draftSlots: Array<{ id: string; draftOrder: number; team: { id: string; name: string; logoUrl?: string | null; }; }>; draftGrid: Array< Array<{ pickNumber: number; round: number; pickInRound: number; teamId: string; pick?: { participant: { name: string; }; sport: { name: string; }; }; }> >; currentPick: number; teamTimers: Record; autodraftStatus: Record; connectedTeams: Set; isCommissioner: boolean; seasonStatus?: SeasonStatus; draftPaused?: boolean; onAdjustTimeBankOpen?: (teamId: string) => void; onSetAutodraftOpen?: (teamId: string) => void; onForceAutopick?: (pickNumber: number, teamId: string) => void; onForceManualPickOpen?: (pickNumber: number, teamId: string) => void; onReplacePick?: (pickNumber: number, teamId: string) => void; onRollbackToPick?: (pickNumber: number) => void; ownerMap?: Record; } export const DraftGridSection = memo(function DraftGridSection({ draftSlots, draftGrid, currentPick, teamTimers, autodraftStatus, connectedTeams, isCommissioner, seasonStatus, draftPaused, onAdjustTimeBankOpen, onSetAutodraftOpen, onForceAutopick, onForceManualPickOpen, onReplacePick, onRollbackToPick, ownerMap = {}, }: DraftGridSectionProps) { const [mobileSheet, setMobileSheet] = useState(null); const currentTeamId = useMemo( () => draftGrid.flat().find((c) => c.pickNumber === currentPick)?.teamId ?? null, [draftGrid, currentPick] ); return (

Draft Grid

{/* Team Headers */}
{draftSlots.map((slot) => { const teamTime = teamTimers[slot.team.id]; const isAutodraft = autodraftStatus[slot.team.id]?.isEnabled || false; const isConnected = connectedTeams.has(slot.team.id); const headerInner = (
{isAutodraft && ( A )} {ownerMap[slot.team.id] || slot.team.name}
{formatClockTime(teamTime)}
{isCommissioner && (onAdjustTimeBankOpen || onSetAutodraftOpen) && ( )}
); if (isCommissioner && (onAdjustTimeBankOpen || onSetAutodraftOpen)) { return (
{headerInner}
{onAdjustTimeBankOpen && ( onAdjustTimeBankOpen(slot.team.id)}> Adjust Time Bank... )} {onSetAutodraftOpen && ( onSetAutodraftOpen(slot.team.id)}> Set Autodraft... )}
); } return (
{headerInner}
); })}
{/* Draft Grid Rows */}
{draftGrid.map((roundPicks, roundIndex) => { const round = roundIndex + 1; const isEvenRound = round % 2 === 0; const displayPicks = isEvenRound ? [...roundPicks].toReversed() : roundPicks; return (
{displayPicks.map((cell) => { const isCurrent = cell.pickNumber === currentPick; const isPicked = !!cell.pick; const cellState = isPicked ? "picked" : isCurrent ? "current" : "upcoming"; const pickData = cell.pick ? { participant: { name: cell.pick.participant.name }, sport: { name: cell.pick.sport.name } } : undefined; const pendingCorona = cellState === "upcoming" ? { type: "pending" as const } : undefined; const mobileButtons = isCommissioner && ( <> {!isPicked && isCurrent && (onForceAutopick || onForceManualPickOpen) && ( )} {isPicked && (onReplacePick || onRollbackToPick) && ( )} ); if (isCommissioner && !isPicked && isCurrent && (onForceAutopick || onForceManualPickOpen)) { return ( {mobileButtons} {onForceAutopick && ( onForceAutopick(cell.pickNumber, cell.teamId)}> Force Auto Pick )} {onForceManualPickOpen && ( onForceManualPickOpen(cell.pickNumber, cell.teamId)}> Force Manual Pick )} ); } if (isCommissioner && isPicked && (onReplacePick || onRollbackToPick)) { return ( {mobileButtons} {onReplacePick && ( onReplacePick(cell.pickNumber, cell.teamId) } > Replace Pick )} {onRollbackToPick && ( onRollbackToPick(cell.pickNumber)} className="text-destructive focus:text-destructive" > Roll Back to This Pick )} ); } return ( {mobileButtons} ); })}
); })}
{/* Mobile Commissioner Sheet */} !open && setMobileSheet(null)}> Commissioner Actions
{mobileSheet?.type === "team" && ( <> {onAdjustTimeBankOpen && ( )} {onSetAutodraftOpen && ( )} )} {mobileSheet?.type === "current-cell" && ( <> {onForceAutopick && ( )} {onForceManualPickOpen && ( )} )} {mobileSheet?.type === "picked-cell" && ( <> {onReplacePick && ( )} {onRollbackToPick && ( )} )}
); });