UI: единое подтверждение удаления через ConfirmDialog
- админка, записи: удаление партии раньше срабатывало сразу по клику на иконку и показывало «Удалено» даже при ошибке — теперь модалка подтверждения и честная обработка ошибок; - ачивки и dev-удаление аккаунта: window.confirm заменён на ConfirmDialog (в приложении принят именно он); - настройки группы: удаление участника — с подтверждением. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user