2
Sports
{templates.length > 0 && (
{templates.map((t) => (
))}
)}
{/* Named template: read-only alphabetical sport list */}
{selectedTemplate !== "" && selectedTemplate !== "customize" && (
{Object.values(
displaySeasons.reduce>((acc, s) => {
acc[s.sport.name] = s.sport;
return acc;
}, {})
).toSorted((a, b) => a.name.localeCompare(b.name)).map((sport) => (
-
{sport.name}
{isBracktSport(sport) && }
))}
These are the sport seasons included in this template. Switch to Customize to adjust your selection.
)}
{/* Customize: full interactive selector */}
{selectedTemplate === "customize" && (
{/* Selected chips */}
{selectedSports.size > 0 && (
{selectedSports.size} selected
{allSportsSeasons
.filter((s) => selectedSports.has(s.id))
.toSorted((a, b) => a.sport.name.localeCompare(b.sport.name))
.map((s) => (
{s.name}
))}
)}
{/* Full sport picker */}
{sortedDisplaySeasons.map((s) => {
const selected = selectedSports.has(s.id);
return (
);
})}
{sortedDisplaySeasons.length === 0 && (
No sports seasons available.
)}
)}
{error &&
{error}
}
{selectedSports.size === 0 && (
Select at least one sport season to continue.
)}
);
}
// ─── Step 3: Draft Settings ───────────────────────────────────────────────────
function Step3DraftSettings({
draftRounds,
setDraftRounds,
draftDate,
setDraftDate,
draftTime,
setDraftTime,
autoStartDraft,
setAutoStartDraft,
timerMode,
setTimerMode,
draftSpeed,
setDraftSpeed,
overnightMode,
setOvernightMode,
overnightStart,
setOvernightStart,
overnightEnd,
setOvernightEnd,
overnightTimezone,
setOvernightTimezone,
commishTimezone,
sportsCount,
error,
onNext,
onBack,
}: {
draftRounds: number;
setDraftRounds: (v: number) => void;
draftDate: string;
setDraftDate: (v: string) => void;
draftTime: string;
setDraftTime: (v: string) => void;
autoStartDraft: boolean;
setAutoStartDraft: (v: boolean) => void;
timerMode: "chess_clock" | "standard";
setTimerMode: (v: "chess_clock" | "standard") => void;
draftSpeed: string;
setDraftSpeed: (v: string) => void;
overnightMode: "none" | "league" | "per_user";
setOvernightMode: (v: "none" | "league" | "per_user") => void;
overnightStart: string;
setOvernightStart: (v: string) => void;
overnightEnd: string;
setOvernightEnd: (v: string) => void;
overnightTimezone: string;
setOvernightTimezone: (v: string) => void;
commishTimezone: string | null;
sportsCount: number;
error: string | null;
onNext: () => void;
onBack: () => void;
}) {
const minRounds = sportsCount;
const flexSpots = Math.max(0, draftRounds - sportsCount);
const { draftInitialTime, draftIncrementTime } = parseDraftSpeed(draftSpeed, timerMode);
const showOvernightPause = draftInitialTime >= 3600 || draftIncrementTime >= 600;
const localTz = useLocalTimezone();
useEffect(() => {
if (!showOvernightPause) setOvernightMode("none");
}, [showOvernightPause]); // eslint-disable-line react-hooks/exhaustive-deps
return (
3
Draft Settings
{/* Draft Rounds */}
Minimum: {minRounds} (based on sports selected)
{sportsCount > 0 && ` · Flex spots: ${flexSpots}`}
{/* Draft Date & Time */}
{/* Timer Mode */}
{/* Draft Speed */}
{/* Overnight Pause */}
{error &&
{error}
}
);
}
// ─── Step 4: Scoring ──────────────────────────────────────────────────────────
function Step4Scoring({
scoringPreset,
setScoringPreset,
scoringRules,
setScoringRules,
onNext,
onBack,
}: {
scoringPreset: "brackt" | "omnifantasy" | "custom";
setScoringPreset: (v: "brackt" | "omnifantasy" | "custom") => void;
scoringRules: ScoringRules;
setScoringRules: (v: ScoringRules) => void;
onNext: () => void;
onBack: () => void;
}) {
return (