UI: подтверждение перед отменой незавершённой и удалением сыгранной партии (модалка)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 16:57:35 +03:00
co-authored by Claude Opus 4.8
parent 4d365a373b
commit 7269afcd4e
3 changed files with 91 additions and 1 deletions
+25 -1
View File
@@ -2,6 +2,7 @@ import { useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
import { ApiError } from "../api/client";
import { ConfirmDialog } from "../components/ConfirmDialog";
import { MatchMedia } from "../components/MatchMedia";
import { Spinner } from "../components/Spinner";
import { formatDuration, formatTime } from "../domain/format";
@@ -39,6 +40,7 @@ export function MatchDetailPage() {
const [winReason, setWinReason] = useState<WinReason>("objectives");
const [overall, setOverall] = useState("");
const [error, setError] = useState<string | null>(null);
const [confirmRemove, setConfirmRemove] = useState(false);
if (isLoading) return <Spinner />;
if (!match) return <div className="muted">Партия не найдена.</div>;
@@ -271,10 +273,32 @@ export function MatchDetailPage() {
)}
{canModify && (
<button className="btn btn-danger" style={{ width: "100%" }} onClick={remove}>
<button
className="btn btn-danger"
style={{ width: "100%" }}
onClick={() => setConfirmRemove(true)}
>
{inProgress ? "Отменить партию" : "Удалить партию"}
</button>
)}
<ConfirmDialog
open={confirmRemove}
danger
title={inProgress ? "Отменить партию?" : "Удалить партию?"}
message={
inProgress
? "Незавершённая партия будет удалена. Действие необратимо."
: "Сыгранная партия и её результаты будут удалены. Действие необратимо."
}
confirmLabel={inProgress ? "Отменить партию" : "Удалить"}
cancelLabel="Назад"
onCancel={() => setConfirmRemove(false)}
onConfirm={() => {
setConfirmRemove(false);
remove();
}}
/>
</div>
);
}