From 574c1300e9fa1b7da00614e4fc8691ecbddd4b1e Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Mon, 23 Mar 2026 22:00:23 +0200 Subject: [PATCH] Hide teams on the league sign up page after divisions have been created Closes #2851 --- .../tournament/TournamentRepository.server.ts | 11 ++++++++ .../tournament/loaders/to.$id.server.ts | 10 +++++++ .../tournament/routes/to.$id.teams.tsx | 10 +++++-- app/features/tournament/routes/to.$id.tsx | 26 +++++++++++++------ 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/app/features/tournament/TournamentRepository.server.ts b/app/features/tournament/TournamentRepository.server.ts index 4deb7d6a5..ae7a02e18 100644 --- a/app/features/tournament/TournamentRepository.server.ts +++ b/app/features/tournament/TournamentRepository.server.ts @@ -316,6 +316,17 @@ export async function findById(id: number) { }; } +export async function hasChildTournaments(parentTournamentId: number) { + const row = await db + .selectFrom("Tournament") + .select("Tournament.id") + .where("Tournament.parentTournamentId", "=", parentTournamentId) + .limit(1) + .executeTakeFirst(); + + return Boolean(row); +} + export async function findChildTournaments(parentTournamentId: number) { const rows = await db .selectFrom("Tournament") diff --git a/app/features/tournament/loaders/to.$id.server.ts b/app/features/tournament/loaders/to.$id.server.ts index 86bfcbf8d..ac965bfd6 100644 --- a/app/features/tournament/loaders/to.$id.server.ts +++ b/app/features/tournament/loaders/to.$id.server.ts @@ -1,6 +1,7 @@ import type { LoaderFunctionArgs } from "react-router"; import { getUser } from "~/features/auth/core/user.server"; import * as TournamentRepository from "~/features/tournament/TournamentRepository.server"; +import { LEAGUES } from "~/features/tournament/tournament-constants"; import { tournamentDataCached } from "~/features/tournament-bracket/core/Tournament.server"; import { databaseTimestampToDate } from "~/utils/dates"; import { parseParams } from "~/utils/remix.server"; @@ -10,6 +11,7 @@ export type TournamentLoaderData = { tournament: Awaited>; streamingParticipants: number[]; streamsCount: number; + hasChildTournaments: boolean; friendCodes: | Awaited> | undefined; @@ -53,9 +55,17 @@ export const loader = async ({ params }: LoaderFunctionArgs) => { const showFriendCodes = tournamentStartedInTheLastMonth && isTournamentAdmin; + const isLeagueSignup = Object.values(LEAGUES) + .flat() + .some((entry) => entry.tournamentId === tournamentId); + const hasChildTournaments = isLeagueSignup + ? await TournamentRepository.hasChildTournaments(tournamentId) + : false; + // skip expensive rr7 data serialization (hot path loader) return JSON.stringify({ tournament, + hasChildTournaments, friendCodes: showFriendCodes ? await TournamentRepository.friendCodesByTournamentId(tournamentId) : undefined, diff --git a/app/features/tournament/routes/to.$id.teams.tsx b/app/features/tournament/routes/to.$id.teams.tsx index 741860ac7..e83cc2445 100644 --- a/app/features/tournament/routes/to.$id.teams.tsx +++ b/app/features/tournament/routes/to.$id.teams.tsx @@ -1,10 +1,16 @@ -import { tournamentTeamPage } from "~/utils/urls"; +import { Redirect } from "~/components/Redirect"; +import { tournamentDivisionsPage, tournamentTeamPage } from "~/utils/urls"; import { TeamWithRoster } from "../components/TeamWithRoster"; import { getBracketProgressionLabel } from "../tournament-utils"; -import { useTournament } from "./to.$id"; +import { useHasChildTournaments, useTournament } from "./to.$id"; export default function TournamentTeamsPage() { const tournament = useTournament(); + const hasChildTournaments = useHasChildTournaments(); + + if (tournament.isLeagueSignup && hasChildTournaments) { + return ; + } const perBracketSeedCounters = new Map(); const teamSeedInfo = tournament.ctx.teams.map((team, globalIndex) => { diff --git a/app/features/tournament/routes/to.$id.tsx b/app/features/tournament/routes/to.$id.tsx index de987ccd1..c86942795 100644 --- a/app/features/tournament/routes/to.$id.tsx +++ b/app/features/tournament/routes/to.$id.tsx @@ -156,14 +156,18 @@ export function TournamentLayout() { Divisions ) : null} - - {t("tournament:tabs.teams", { count: tournament.ctx.teams.length })} - + {!(tournament.isLeagueSignup && data.hasChildTournaments) ? ( + + {t("tournament:tabs.teams", { + count: tournament.ctx.teams.length, + })} + + ) : null} {!tournament.isInvitational && !tournament.everyBracketOver && !(tournament.isLeagueSignup && !tournament.registrationOpen) && @@ -206,6 +210,7 @@ export function TournamentLayout() { tournament, bracketExpanded, setBracketExpanded, + hasChildTournaments: data.hasChildTournaments, friendCodes: data.friendCodes, preparedMaps: data.preparedMaps, } satisfies TournamentContext @@ -220,6 +225,7 @@ type TournamentContext = { tournament: Tournament; bracketExpanded: boolean; setBracketExpanded: (expanded: boolean) => void; + hasChildTournaments: boolean; friendCode?: string; friendCodes?: TournamentLoaderData["friendCodes"]; preparedMaps: TournamentLoaderData["preparedMaps"]; @@ -236,6 +242,10 @@ export function useBracketExpanded() { return { bracketExpanded, setBracketExpanded }; } +export function useHasChildTournaments() { + return useOutletContext().hasChildTournaments; +} + export function useTournamentFriendCodes() { return useOutletContext().friendCodes; }