UI: единое подтверждение удаления через ConfirmDialog

- админка, записи: удаление партии раньше срабатывало сразу по клику на
  иконку и показывало «Удалено» даже при ошибке — теперь модалка
  подтверждения и честная обработка ошибок;
- ачивки и dev-удаление аккаунта: window.confirm заменён на ConfirmDialog
  (в приложении принят именно он);
- настройки группы: удаление участника — с подтверждением.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 17:40:53 +03:00
co-authored by Claude Fable 5
parent d2c0feafcc
commit 7b61443fb9
4 changed files with 96 additions and 34 deletions
+21 -1
View File
@@ -2,6 +2,7 @@ import { Trash2, UserPlus } from "lucide-react";
import { useEffect, useState } from "react";
import { ApiError } from "../api/client";
import { ConfirmDialog } from "../components/ConfirmDialog";
import { PlayerLink } from "../components/PlayerLink";
import { Spinner } from "../components/Spinner";
import { Switch } from "../components/Switch";
@@ -24,6 +25,7 @@ export function GroupSettingsPage() {
const [selected, setSelected] = useState<Set<number>>(new Set());
const [newNick, setNewNick] = useState("");
const [removeTarget, setRemoveTarget] = useState<{ userId: number; nickname: string } | null>(null);
useEffect(() => {
if (group) setSelected(new Set(group.expansion_ids));
@@ -121,7 +123,10 @@ export function GroupSettingsPage() {
{m.nickname} <span className="muted small">· {m.role}</span>
</PlayerLink>
{isOwner && m.role !== "owner" && (
<button className="btn btn-ghost btn-danger small" onClick={() => remove(m.user_id)}>
<button
className="btn btn-ghost btn-danger small"
onClick={() => setRemoveTarget({ userId: m.user_id, nickname: m.nickname })}
>
<Trash2 size={16} />
</button>
)}
@@ -129,6 +134,21 @@ export function GroupSettingsPage() {
))}
</div>
</div>
<ConfirmDialog
open={removeTarget != null}
danger
title={`Удалить участника «${removeTarget?.nickname}»?`}
message="Игрок будет удалён из группы. Его сыгранные партии сохранятся."
confirmLabel="Удалить"
onCancel={() => setRemoveTarget(null)}
onConfirm={() => {
if (!removeTarget) return;
const userId = removeTarget.userId;
setRemoveTarget(null);
remove(userId);
}}
/>
</div>
);
}