import { PickerSelect } from "./PickerSelect"; import { LAST_STANDING, WIN_REASONS, type WinReason, winReasonLabel } from "../domain/winReasons"; const REASON_OPTIONS = WIN_REASONS.map((w) => ({ id: w.code, label: w.label })); const NO_ROUND = 0; /** * Итог партии в форме завершения и правки результатов: причина победы, раунд окончания * и предупреждения о несогласованном вводе. «Последний выживший» не выбирается — * пока выживший один, причина зафиксирована (её ставит родитель, см. reasonForSurvivors). */ export function MatchOutcomeFields({ winReason, onReason, endRound, onEndRound, maxRounds, warnings, }: { winReason: WinReason | null; onReason: (reason: WinReason) => void; endRound: number | null; onEndRound: (round: number | null) => void; maxRounds: number; warnings: string[]; }) { const roundOptions = [ { id: NO_ROUND, label: "не указан" }, ...Array.from({ length: maxRounds }, (_, i) => ({ id: i + 1, label: `${i + 1}-й` })), ]; return (

Итог партии

{winReason === LAST_STANDING ? (
{winReasonLabel(LAST_STANDING)} все соперники выбыли
) : ( o.id === winReason) ?? null} options={REASON_OPTIONS} placeholder="— выберите причину —" renderOption={(o) => o.label} onPick={(o) => onReason(o.id)} /> )}
o.id === (endRound ?? NO_ROUND)) ?? null} options={roundOptions} placeholder="не указан" renderOption={(o) => o.label} onPick={(o) => onEndRound(o.id === NO_ROUND ? null : o.id)} />

Раунд, цели и миры необязательны, но делают рейтинг точнее: быстрая и крупная победа весит больше.

{warnings.length > 0 && ( )}
); }