import React, { useEffect, useMemo, useState } from 'react'; import { createPortal } from 'react-dom'; import type { AppPlayer, AppPlayerTeam, PlayerId, PlayerTeamId } from '../../shared/types'; import { resolveLaunchPlayerIds } from '../../shared/players/resolveLaunchPlayerIds'; import { useAppPlayers } from '../shared/playerToken/useAppPlayers'; import { Button } from '../shared/ui/controls'; import styles from './EditorApp.module.css'; import { useEditorI18n } from './i18n/EditorI18nContext'; import launchStyles from './LaunchPlayersModal.module.css'; export { resolveLaunchPlayerIds } from '../../shared/players/resolveLaunchPlayerIds'; export function LaunchPlayersModal({ open, onClose, onConfirm, }: { open: boolean; onClose: () => void; onConfirm: (playerIds: string[]) => void; }) { const { t } = useEditorI18n(); const { players, teams } = useAppPlayers(); const [selectedPlayers, setSelectedPlayers] = useState>(() => new Set()); const [selectedTeams, setSelectedTeams] = useState>(() => new Set()); useEffect(() => { if (!open) return; setSelectedPlayers(new Set()); setSelectedTeams(new Set()); }, [open]); const resolvedIds = useMemo( () => resolveLaunchPlayerIds(players, selectedPlayers, selectedTeams), [players, selectedPlayers, selectedTeams], ); const standalonePlayers = useMemo( () => players.filter((p) => !(p.teamId && selectedTeams.has(String(p.teamId)))), [players, selectedTeams], ); if (!open) return null; const togglePlayer = (id: PlayerId) => { setSelectedPlayers((prev) => { const next = new Set(prev); const key = String(id); if (next.has(key)) next.delete(key); else next.add(key); return next; }); }; const toggleTeam = (id: PlayerTeamId) => { const key = String(id); setSelectedTeams((prev) => { const next = new Set(prev); if (next.has(key)) next.delete(key); else next.add(key); return next; }); // Участники выбранной команды не показываются в «Игроки» — снимаем их индивидуальный выбор. setSelectedPlayers((prev) => { if (prev.size === 0) return prev; const next = new Set(prev); let changed = false; for (const p of players) { if (String(p.teamId) !== key) continue; if (next.delete(String(p.id))) changed = true; } return changed ? next : prev; }); }; return createPortal( <>
{t('top.runWithPlayersTitle')}

{t('top.runWithPlayersHint')}

{teams.length > 0 ? (
{t('top.runWithPlayersTeams')}
{teams.map((team: AppPlayerTeam) => { const count = players.filter((p) => p.teamId === team.id).length; return ( ); })}
) : null} {standalonePlayers.length > 0 ? (
{t('top.runWithPlayersPlayers')}
{standalonePlayers.map((player: AppPlayer) => ( ))}
) : players.length === 0 ? (
{t('top.runWithPlayersEmpty')}
) : null}
, document.body, ); }