import { data, redirect } from "react-router"; import type { LoaderFunctionArgs } from "react-router"; import { getAuth } from "@clerk/react-router/server"; import { findLeagueById, findCurrentSeason, findTeamsBySeasonId, isCommissioner, findDraftSlotsBySeasonId, getDraftPicks, getSeasonTimers, findSeasonWithSportsSeasons, } from "~/models"; import { DraftGrid } from "~/components/draft/DraftGrid"; export async function loader(args: LoaderFunctionArgs) { const { userId } = await getAuth(args); if (!userId) { throw redirect("/"); } const { leagueId } = args.params; if (!leagueId) { throw new Response("League ID is required", { status: 400 }); } // Get league and season const league = await findLeagueById(leagueId); if (!league) { throw new Response("League not found", { status: 404 }); } const season = await findCurrentSeason(leagueId); if (!season) { throw new Response("No active season found", { status: 404 }); } // Get season with sports and participants const seasonWithSports = await findSeasonWithSportsSeasons(season.id); const participants = seasonWithSports?.seasonSports?.flatMap( (ss: any) => ss.sportsSeason?.participants || [] ) || []; // Get teams and draft order const teams = await findTeamsBySeasonId(season.id); const draftSlots = await findDraftSlotsBySeasonId(season.id); // Sort teams by draft order const teamsWithOrder = teams.map((team) => { const slot = draftSlots.find((s: { teamId: string }) => s.teamId === team.id); return { ...team, draftOrder: slot?.draftOrder || 0, }; }).sort((a, b) => a.draftOrder - b.draftOrder); // Check user permissions const isUserCommissioner = await isCommissioner(leagueId, userId); const userTeam = teams.find((team) => team.ownerId === userId); // Get draft data const draftPicks = await getDraftPicks(season.id); const timers = await getSeasonTimers(season.id); // Calculate current pick info const totalPicks = season.draftRounds * teams.length; const currentPickNumber = season.currentPickNumber || 1; const isDraftComplete = currentPickNumber > totalPicks; return data({ league, season, teams: teamsWithOrder, draftSlots, isCommissioner: isUserCommissioner, userTeam, draftPicks, participants, timers, currentPickNumber, totalPicks, isDraftComplete, userId, }); } export default function DraftRoom({ loaderData }: { loaderData: Awaited>["data"] }) { const { league, season, teams, draftPicks, participants, isCommissioner, userTeam, currentPickNumber, totalPicks, isDraftComplete, } = loaderData; return (
{/* Header */}

{league.name} Draft

{season.year} Season • Pick {currentPickNumber} of {totalPicks}

{isCommissioner && ( Commissioner )} {userTeam && ( {userTeam.name} )}
{/* Main Content */}
{isDraftComplete ? (

Draft Complete!

All picks have been made. The season is ready to begin.

) : (
{/* Draft Board - Full Width */}

Draft Board

{/* 2x2 Grid Below */}
{/* Available Players */}

Available Players

Player list will be implemented in Phase 6
{/* Your Queue */}

Your Queue

Queue will be implemented in Phase 7
{/* Draft Timer */}

Draft Timer

Timer will be implemented in Phase 8
{/* Commissioner Controls */} {isCommissioner ? (

Commissioner Controls

Controls will be implemented in Phase 9
) : (

Draft Info

Current Pick: {currentPickNumber} of {totalPicks}
Draft Rounds: {season.draftRounds}
)}
)}
); }