diff --git a/app/routes/leagues/$leagueId.server.ts b/app/routes/leagues/$leagueId.server.ts index ec662c4..c34fd65 100644 --- a/app/routes/leagues/$leagueId.server.ts +++ b/app/routes/leagues/$leagueId.server.ts @@ -1,7 +1,6 @@ import { getAuth } from "@clerk/react-router/server"; import { findLeagueById, - findCurrentSeason, findTeamsBySeasonId, findCommissionersByLeagueId, isUserLeagueMember, @@ -10,6 +9,7 @@ import { findDraftSlotsBySeasonId, } from "~/models"; import { findCurrentSeasonWithSports } from "~/models/season"; +import { getSeasonStandings } from "~/models/standings"; import type { Route } from "./+types/$leagueId"; export async function loader(args: Route.LoaderArgs) { @@ -64,6 +64,12 @@ export async function loader(args: Route.LoaderArgs) { ? await findDraftSlotsBySeasonId(season.id) : []; + // Fetch standings for active/completed seasons + const standings = + season && (season.status === "active" || season.status === "completed") + ? await getSeasonStandings(season.id) + : []; + // Fetch user data for team owners const ownerIds = teams .map((t) => t.ownerId) @@ -128,10 +134,10 @@ export async function loader(args: Route.LoaderArgs) { ownerMap: Object.fromEntries(ownerMap), commissionerMap: Object.fromEntries(commissionerMap), availableTeamCount, - draftSlots, sportsCount, teamsWithOwners, isDraftOrderSet, sportsSeasons, + standings, }; } diff --git a/app/routes/leagues/$leagueId.settings.tsx b/app/routes/leagues/$leagueId.settings.tsx index cdb64c0..0b2bf18 100644 --- a/app/routes/leagues/$leagueId.settings.tsx +++ b/app/routes/leagues/$leagueId.settings.tsx @@ -61,6 +61,7 @@ import { AlertDialogTrigger, } from "~/components/ui/alert-dialog"; import { ScoringRulesEditor } from "~/components/scoring/ScoringRulesEditor"; +import { toast } from "sonner"; export async function loader(args: Route.LoaderArgs) { const { userId } = await getAuth(args); @@ -652,6 +653,20 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone return teams.find((t) => t.id === teamId); }; + const [copied, setCopied] = useState(false); + 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 (
{league.name}
+ Anyone with this link can join your league +
+