import { Stack, ActionIcon, Text, Group, Loader, } from "@mantine/core"; import Typeahead, { TypeaheadOption } from "@/components/typeahead"; import { TrashIcon } from "@phosphor-icons/react"; import { useState, useCallback, useMemo, memo } from "react"; import { useTournament, useUnenrolledTeams } from "../queries"; import useEnrollTeam from "../hooks/use-enroll-team"; import useUnenrollTeam from "../hooks/use-unenroll-team"; import Avatar from "@/components/avatar"; import { Team, TeamInfo } from "@/features/teams/types"; interface EditEnrolledTeamsProps { tournamentId: string; } interface TeamItemProps { team: TeamInfo; onUnenroll: (teamId: string) => void; disabled: boolean; } const TeamItem = memo(({ team, onUnenroll, disabled }: TeamItemProps) => { const playerNames = useMemo( () => team.players?.map((p) => `${p.first_name} ${p.last_name}`).join(", ") || "", [team.players] ); return ( {team.name} {playerNames && ( {playerNames} )} onUnenroll(team.id)} disabled={disabled} size="sm" > ); }); const EditEnrolledTeams = ({ tournamentId }: EditEnrolledTeamsProps) => { const { data: tournament, isLoading: tournamentLoading } = useTournament(tournamentId); const { data: unenrolledTeams = [], isLoading: unenrolledLoading } = useUnenrolledTeams(tournamentId); const { mutate: enrollTeam, isPending: isEnrolling } = useEnrollTeam(); const { mutate: unenrollTeam, isPending: isUnenrolling } = useUnenrollTeam(); const searchTeams = async (query: string): Promise[]> => { if (!query.trim()) return []; const filtered = unenrolledTeams.filter((team: Team) => team.name.toLowerCase().includes(query.toLowerCase()) ); return filtered.map((team: Team) => ({ id: team.id, data: team })); }; const handleEnrollTeam = useCallback( (option: TypeaheadOption) => { enrollTeam({ tournamentId, teamId: option.data.id }); }, [enrollTeam, tournamentId] ); const handleUnenrollTeam = useCallback( (teamId: string) => { unenrollTeam({ tournamentId, teamId }); }, [unenrollTeam, tournamentId] ); const renderTeamOption = (option: TypeaheadOption) => { const team = option.data; return ( {team.name} ); }; const formatTeam = (option: TypeaheadOption) => { return option.data.name; }; const isLoading = tournamentLoading || unenrolledLoading; const enrolledTeams = tournament?.teams || []; const hasEnrolledTeams = enrolledTeams.length > 0; return ( Add Team Enrolled Teams {enrolledTeams.length} teams {isLoading ? ( ) : !hasEnrolledTeams ? ( No teams enrolled yet ) : ( {enrolledTeams.map((team: TeamInfo) => ( ))} )} ); }; export default EditEnrolledTeams;