From 2f6950ee9ea78ea3d56c4fc547743a5e35daace0 Mon Sep 17 00:00:00 2001 From: yohlo Date: Wed, 3 Sep 2025 21:57:47 -0500 Subject: [PATCH] restarting brackets --- src/app/routes/_authed/admin/preview.tsx | 3 +- .../_authed/admin/tournaments/run.$id.tsx | 3 +- src/app/routes/api/auth.$.ts | 2 +- .../components/bracket-round.tsx | 0 .../components/bracket-view.tsx | 0 .../components/bracket.tsx | 2 +- .../_bracket/components/match-card.tsx | 72 +++++++ .../_bracket/components/match-slot.tsx | 51 +++++ .../components/preview.tsx | 0 .../_bracket/components/seed-badge.tsx | 29 +++ .../_bracket/components/seed-list.tsx | 48 +++++ .../_bracket/components/styles.module.css | 9 + src/features/_bracket/queries.ts | 18 ++ src/features/_bracket/server.ts | 21 ++ src/features/_bracket/types.ts | 20 ++ .../utils/bracket-maps.ts | 0 src/features/_bracket/utils/index.ts | 24 +++ src/features/bracket/types.ts | 26 +-- src/features/matches/types.ts | 28 +-- .../tournaments/components/run-tournament.tsx | 181 ------------------ 20 files changed, 307 insertions(+), 230 deletions(-) rename src/features/{bracket => _bracket}/components/bracket-round.tsx (100%) rename src/features/{bracket => _bracket}/components/bracket-view.tsx (100%) rename src/features/{bracket => _bracket}/components/bracket.tsx (96%) create mode 100644 src/features/_bracket/components/match-card.tsx create mode 100644 src/features/_bracket/components/match-slot.tsx rename src/features/{bracket => _bracket}/components/preview.tsx (100%) create mode 100644 src/features/_bracket/components/seed-badge.tsx create mode 100644 src/features/_bracket/components/seed-list.tsx create mode 100644 src/features/_bracket/components/styles.module.css create mode 100644 src/features/_bracket/queries.ts create mode 100644 src/features/_bracket/server.ts create mode 100644 src/features/_bracket/types.ts rename src/features/{bracket => _bracket}/utils/bracket-maps.ts (100%) create mode 100644 src/features/_bracket/utils/index.ts delete mode 100644 src/features/tournaments/components/run-tournament.tsx diff --git a/src/app/routes/_authed/admin/preview.tsx b/src/app/routes/_authed/admin/preview.tsx index 076fb33..77cb00f 100644 --- a/src/app/routes/_authed/admin/preview.tsx +++ b/src/app/routes/_authed/admin/preview.tsx @@ -1,4 +1,3 @@ -import { PreviewBracket } from "@/features/bracket/components/preview"; import { createFileRoute } from "@tanstack/react-router"; export const Route = createFileRoute("/_authed/admin/preview")({ @@ -13,5 +12,5 @@ export const Route = createFileRoute("/_authed/admin/preview")({ }); function RouteComponent() { - return ; + return

Preview

; } diff --git a/src/app/routes/_authed/admin/tournaments/run.$id.tsx b/src/app/routes/_authed/admin/tournaments/run.$id.tsx index dbb007c..5a864b4 100644 --- a/src/app/routes/_authed/admin/tournaments/run.$id.tsx +++ b/src/app/routes/_authed/admin/tournaments/run.$id.tsx @@ -1,7 +1,6 @@ import { createFileRoute, redirect } from '@tanstack/react-router' import { tournamentQueries } from '@/features/tournaments/queries' import { ensureServerQueryData } from '@/lib/tanstack-query/utils/ensure' -import RunTournament from '@/features/tournaments/components/run-tournament' export const Route = createFileRoute('/_authed/admin/tournaments/run/$id')({ beforeLoad: async ({ context, params }) => { @@ -27,5 +26,5 @@ export const Route = createFileRoute('/_authed/admin/tournaments/run/$id')({ function RouteComponent() { const { id } = Route.useParams() - return + return

Run tournament

} diff --git a/src/app/routes/api/auth.$.ts b/src/app/routes/api/auth.$.ts index cb75d5a..6d7eff7 100644 --- a/src/app/routes/api/auth.$.ts +++ b/src/app/routes/api/auth.$.ts @@ -9,7 +9,7 @@ ensureSuperTokensBackend(); const superTokensHandler = handleAuthAPIRequest(); const handleRequest = async ({ request }: {request: Request}) => { console.log("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="); - console.log("Handling auth request:", request); + console.log("Handling auth request:", request.method, request.url); return superTokensHandler(request); }; export const ServerRoute = createServerFileRoute('/api/auth/$').methods({ diff --git a/src/features/bracket/components/bracket-round.tsx b/src/features/_bracket/components/bracket-round.tsx similarity index 100% rename from src/features/bracket/components/bracket-round.tsx rename to src/features/_bracket/components/bracket-round.tsx diff --git a/src/features/bracket/components/bracket-view.tsx b/src/features/_bracket/components/bracket-view.tsx similarity index 100% rename from src/features/bracket/components/bracket-view.tsx rename to src/features/_bracket/components/bracket-view.tsx diff --git a/src/features/bracket/components/bracket.tsx b/src/features/_bracket/components/bracket.tsx similarity index 96% rename from src/features/bracket/components/bracket.tsx rename to src/features/_bracket/components/bracket.tsx index aab4869..af7db61 100644 --- a/src/features/bracket/components/bracket.tsx +++ b/src/features/_bracket/components/bracket.tsx @@ -1,8 +1,8 @@ import { ScrollArea, Text } from "@mantine/core"; import BracketView from "./bracket-view"; -import { Match } from "../types"; import useAppShellHeight from "@/hooks/use-appshell-height"; import { BracketMaps } from "../utils/bracket-maps"; +import { Match } from "@/features/matches/types"; interface BracketProps { winners: Match[][]; diff --git a/src/features/_bracket/components/match-card.tsx b/src/features/_bracket/components/match-card.tsx new file mode 100644 index 0000000..1bde010 --- /dev/null +++ b/src/features/_bracket/components/match-card.tsx @@ -0,0 +1,72 @@ +import { ActionIcon, Card, Text } from '@mantine/core'; +import { PlayIcon } from '@phosphor-icons/react'; +import React, { useCallback, useMemo } from 'react'; +import { MatchSlot } from './match-slot'; +import { Match } from '../types'; + +interface MatchCardProps { + match: Match; + getParentMatchOrder: (parentLid: number) => number | string; + onAnnounce?: (teamOne: any, teamTwo: any) => void; +} + +export const MatchCard: React.FC = ({ + match, + getParentMatchOrder, + onAnnounce +}) => { + + const showAnnounce = useMemo(() => + onAnnounce && match.home.team && match.away.team, + [onAnnounce, match.home.team, match.away.team]); + + const handleAnnounce = useCallback(() => + onAnnounce?.(match.home.team, match.away.team), [match.home.team, match.away.team]); + + return ( + + + + + + + + + + {match.reset && ( + + * If necessary + + )} + + {showAnnounce && ( + + + + )} + + ); +}; \ No newline at end of file diff --git a/src/features/_bracket/components/match-slot.tsx b/src/features/_bracket/components/match-slot.tsx new file mode 100644 index 0000000..7babadc --- /dev/null +++ b/src/features/_bracket/components/match-slot.tsx @@ -0,0 +1,51 @@ +import { Flex, Text } from "@mantine/core"; +import React from "react"; +import { SeedBadge } from "./seed-badge"; + +interface MatchSlotProps { + slot: any; + getParentMatchOrder: (parentLid: number) => number | string; +} + +export const MatchSlot: React.FC = ({ + slot, + getParentMatchOrder, +}) => { + const renderSlotContent = () => { + if (slot?.seed) { + return slot.team ? ( + {slot.team.name} + ) : ( + + Team {slot.seed} + + ); + } + + if (slot?.parent_lid !== null && slot?.parent_lid !== undefined) { + return ( + + {slot.loser ? "Loser" : "Winner"} of Match{" "} + {getParentMatchOrder(slot.parent_lid)} + + ); + } + + if (slot) { + return ( + + TBD + + ); + } + + return null; + }; + + return ( + + {slot?.seed && } +
{renderSlotContent()}
+
+ ); +}; diff --git a/src/features/bracket/components/preview.tsx b/src/features/_bracket/components/preview.tsx similarity index 100% rename from src/features/bracket/components/preview.tsx rename to src/features/_bracket/components/preview.tsx diff --git a/src/features/_bracket/components/seed-badge.tsx b/src/features/_bracket/components/seed-badge.tsx new file mode 100644 index 0000000..52eb316 --- /dev/null +++ b/src/features/_bracket/components/seed-badge.tsx @@ -0,0 +1,29 @@ +import { Text } from "@mantine/core"; +import React from "react"; + +interface SeedBadgeProps { + seed: number; +} + +export const SeedBadge: React.FC = ({ seed }) => { + return ( + + {seed} + + ); +}; diff --git a/src/features/_bracket/components/seed-list.tsx b/src/features/_bracket/components/seed-list.tsx new file mode 100644 index 0000000..89744e3 --- /dev/null +++ b/src/features/_bracket/components/seed-list.tsx @@ -0,0 +1,48 @@ +import { Flex, Text, Select, Card } from "@mantine/core"; + +interface Team { + id: string; + name: string; +} + +interface SeedListProps { + teams: Team[]; + onSeedChange: (currentIndex: number, newIndex: number) => void; +} + +export function SeedList({ teams, onSeedChange }: SeedListProps) { + const seedOptions = teams.map((_, index) => ({ + value: index.toString(), + label: `Seed ${index + 1}`, + })); + + return ( + + {teams.map((team, index) => ( + + + +