import { useEffect, useState } from "react"; import { Link, useSearchParams } from "react-router"; import { toast } from "sonner"; import { format } from "date-fns"; import type { Route } from "./+types/$leagueId"; import { Button } from "~/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card"; import { SportSeasonCard } from "~/components/sports/SportSeasonCard"; export { loader } from "./$leagueId.server"; export default function LeagueHome({ loaderData }: Route.ComponentProps) { const { league, season, teams, commissioners, currentUserId, isUserCommissioner, ownerMap, commissionerMap, availableTeamCount, draftSlots, sportsCount, teamsWithOwners, isDraftOrderSet, sportsSeasons, } = loaderData; const [searchParams, setSearchParams] = useSearchParams(); const [copied, setCopied] = useState(false); useEffect(() => { if (searchParams.get("updated") === "true") { toast.success("Team updated successfully"); setSearchParams({}); } if (searchParams.get("joined") === "true") { toast.success("Welcome to the league! You've been assigned a team."); setSearchParams({}); } if (searchParams.get("left") === "true") { toast.success("You have left the league. Your team is now available."); setSearchParams({}); } }, [searchParams, setSearchParams]); const handleCopyInviteLink = async () => { if (!season?.inviteCode) return; const inviteUrl = `${window.location.origin}/i/${season.inviteCode}`; try { await navigator.clipboard.writeText(inviteUrl); setCopied(true); toast.success("Invite link copied to clipboard!"); setTimeout(() => setCopied(false), 2000); } catch { toast.error("Failed to copy invite link"); } }; return (
{season.year} Season • Status:{" "} {season.status.replace("_", " ")}
)}Anyone with this link can join your league
{slot.team.name}
{ownerName && ({ownerName}
)}Created
{new Date(league.createdAt).toLocaleDateString()}
Season Status
{season.status.replace("_", " ")}
Teams Filled
{teamsWithOwners} of {teams.length}
Draft Order Set
{isDraftOrderSet ? "Yes" : "No"}
{!isDraftOrderSet && isUserCommissioner && ( )}Draft Rounds
{season.draftRounds}
Sports Selected
{sportsCount}
Draft Board
View Draft BoardStandings
View StandingsFlex Spots
{Math.max(0, season.draftRounds - sportsCount)}
Draft Date
{format(new Date(season.draftDateTime), "PPP 'at' p")}
{commissionerName || "Unknown User"} {commissioner.userId === currentUserId && ( (You) )}
{!hasTeam && (No team
)}