mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-08-25 04:26:00 -05:00
Hide teams on the league sign up page after divisions have been created
Closes #2851
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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<ReturnType<typeof tournamentDataCached>>;
|
||||
streamingParticipants: number[];
|
||||
streamsCount: number;
|
||||
hasChildTournaments: boolean;
|
||||
friendCodes:
|
||||
| Awaited<ReturnType<typeof TournamentRepository.friendCodesByTournamentId>>
|
||||
| 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,
|
||||
|
||||
@@ -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 <Redirect to={tournamentDivisionsPage(tournament.ctx.id)} />;
|
||||
}
|
||||
|
||||
const perBracketSeedCounters = new Map<number, number>();
|
||||
const teamSeedInfo = tournament.ctx.teams.map((team, globalIndex) => {
|
||||
|
||||
@@ -156,14 +156,18 @@ export function TournamentLayout() {
|
||||
Divisions
|
||||
</SubNavLink>
|
||||
) : null}
|
||||
<SubNavLink
|
||||
to="teams"
|
||||
end={false}
|
||||
prefetch="render"
|
||||
data-testid="teams-tab"
|
||||
>
|
||||
{t("tournament:tabs.teams", { count: tournament.ctx.teams.length })}
|
||||
</SubNavLink>
|
||||
{!(tournament.isLeagueSignup && data.hasChildTournaments) ? (
|
||||
<SubNavLink
|
||||
to="teams"
|
||||
end={false}
|
||||
prefetch="render"
|
||||
data-testid="teams-tab"
|
||||
>
|
||||
{t("tournament:tabs.teams", {
|
||||
count: tournament.ctx.teams.length,
|
||||
})}
|
||||
</SubNavLink>
|
||||
) : 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<TournamentContext>().hasChildTournaments;
|
||||
}
|
||||
|
||||
export function useTournamentFriendCodes() {
|
||||
return useOutletContext<TournamentContext>().friendCodes;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user