import React, { useState, useEffect, useCallback, useMemo } from "react"; import { Stack, Text, Group, ActionIcon, Button, NumberInput, LoadingOverlay, } from "@mantine/core"; import { DragDropContext, Droppable, Draggable } from "@hello-pangea/dnd"; import { DotsNineIcon } from "@phosphor-icons/react"; import { useServerMutation } from "@/lib/tanstack-query/hooks/use-server-mutation"; import { generateTournamentBracket } from "../../matches/server"; import { TeamInfo } from "@/features/teams/types"; import TeamAvatar from "@/components/team-avatar"; import { useBracketPreview } from "@/features/bracket/queries"; import { BracketData } from "@/features/bracket/types"; import BracketView from "@/features/bracket/components/bracket-view"; import { useQueryClient } from "@tanstack/react-query"; import { tournamentKeys } from "../queries"; interface SeedTournamentProps { tournamentId: string; teams: TeamInfo[]; isRegional?: boolean; } const SeedTournament: React.FC = ({ tournamentId, teams, isRegional, }) => { const [orderedTeams, setOrderedTeams] = useState(teams); const { data: bracketPreview } = useBracketPreview(teams.length); const queryClient = useQueryClient(); const bracket: BracketData = useMemo( () => ({ winners: bracketPreview.winners.map((round) => round.map((match) => ({ ...match, away: match.away_seed !== undefined ? orderedTeams[match.away_seed - 1] : undefined, home: match.home_seed !== undefined ? orderedTeams[match.home_seed - 1] : undefined, })) ), losers: bracketPreview.losers, }), [bracketPreview, orderedTeams] ); const generateBracket = useServerMutation({ mutationFn: generateTournamentBracket, successMessage: "Tournament bracket generated successfully!", onSuccess: () => { queryClient.invalidateQueries({ queryKey: tournamentKeys.details(tournamentId), }); }, }); const handleDragEnd = (result: any) => { if (!result.destination) return; const items = Array.from(orderedTeams); const [reorderedItem] = items.splice(result.source.index, 1); items.splice(result.destination.index, 0, reorderedItem); setOrderedTeams(items); }; const handleSeedChange = (teamId: string, newSeed: number) => { if (newSeed < 1 || newSeed > orderedTeams.length) return; const currentIndex = orderedTeams.findIndex((t) => t.id === teamId); if (currentIndex === -1) return; const targetIndex = newSeed - 1; const items = Array.from(orderedTeams); const [movedTeam] = items.splice(currentIndex, 1); items.splice(targetIndex, 0, movedTeam); setOrderedTeams(items); }; const handleGenerateBracket = () => { const orderedTeamIds = orderedTeams.map((team) => team.id); generateBracket.mutate({ data: { tournamentId, orderedTeamIds, }, }); }; return (
Team Seeding {orderedTeams.length} teams {(provided) => (
{orderedTeams.map((team, index) => ( {(provided) => (
handleSeedChange(team.id, Number(value) || 1) } min={1} max={orderedTeams.length} size="xs" w={50} styles={{ input: { textAlign: "center", fontWeight: 600, height: 28, }, }} /> {team.name}
)}
))} {provided.placeholder}
)}
); }; export default SeedTournament;