import clsx from "clsx"; import clone from "just-clone"; import * as React from "react"; import { TOURNAMENT } from "../../tournament/tournament-constants"; import { Label } from "~/components/Label"; import type { TournamentLoaderData, TournamentLoaderTeam, } from "../../tournament/routes/to.$id"; import type { Unpacked } from "~/utils/types"; import { inGameNameWithoutDiscriminator } from "~/utils/strings"; import { useLoaderData } from "@remix-run/react"; import type { TournamentMatchLoaderData } from "../routes/to.$id.matches.$mid"; import type { Result } from "./ScoreReporter"; export type TeamRosterInputsType = "DEFAULT" | "DISABLED" | "PRESENTATIONAL"; /** Inputs to select who played for teams in a match as well as the winner. Can also be used in a presentational way. */ export function TeamRosterInputs({ teams, winnerId, setWinnerId, checkedPlayers, setCheckedPlayers, result, }: { teams: [TournamentLoaderTeam, TournamentLoaderTeam]; winnerId?: number | null; setWinnerId: (newId?: number) => void; checkedPlayers: [number[], number[]]; setCheckedPlayers?: (newPlayerIds: [number[], number[]]) => void; result?: Result; }) { const presentational = Boolean(result); const data = useLoaderData(); const inputMode = ( team: Unpacked ): TeamRosterInputsType => { if (presentational) return "PRESENTATIONAL"; // Disabled in this case because we expect a result to have exactly // TOURNAMENT_TEAM_ROSTER_MIN_SIZE members per team when reporting it // so there is no point to let user to change them around if (team.members.length <= TOURNAMENT.TEAM_MIN_MEMBERS_FOR_FULL) { return "DISABLED"; } return "DEFAULT"; }; React.useEffect(() => { setWinnerId(undefined); }, [data, setWinnerId]); return (
{teams.map((team, teamI) => (
Team {teamI + 1}

{team.name}

setWinnerId?.(team.id)} team={teamI + 1} /> { const newCheckedPlayers = () => { const newPlayers = clone(checkedPlayers); if (checkedPlayers.flat().includes(playerId)) { newPlayers[teamI] = newPlayers[teamI]!.filter( (id) => id !== playerId ); } else { newPlayers[teamI]!.push(playerId); } return newPlayers; }; setCheckedPlayers?.(newCheckedPlayers()); }} />
))}
); } /** Renders radio button to select winner, or in presentational mode just display the text "Winner" */ function WinnerRadio({ presentational, teamId, checked, onChange, team, }: { presentational: boolean; teamId: number; checked: boolean; onChange: () => void; team: number; }) { const id = React.useId(); if (presentational) { return (
Winner
); } return (
); } function TeamRosterInputsCheckboxes({ team, checkedPlayers, handlePlayerClick, mode, }: { team: Unpacked; checkedPlayers: number[]; handlePlayerClick: (playerId: number) => void; /** DEFAULT = inputs work, DISABLED = inputs disabled and look disabled, PRESENTATION = inputs disabled but look like in DEFAULT (without hover styles) */ mode: TeamRosterInputsType; }) { const id = React.useId(); return (
{team.members.map((member) => { return (
handlePlayerClick(member.userId)} />{" "}
); })}
); }