From 83e57b4c4577f4e090fcc0549d972e1b869a5d14 Mon Sep 17 00:00:00 2001 From: Lemon-miaow Date: Sat, 4 Jul 2026 00:49:44 +0800 Subject: [PATCH] fix(panel): implement two-step confirmation for claiming a server to prevent accidental operations --- panel/src/i18n/resources/en-US/servers.json | 2 ++ panel/src/i18n/resources/zh-CN/servers.json | 2 ++ panel/src/pages/servers/ServersPage.tsx | 40 +++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/panel/src/i18n/resources/en-US/servers.json b/panel/src/i18n/resources/en-US/servers.json index 31408c3..5b1d36f 100644 --- a/panel/src/i18n/resources/en-US/servers.json +++ b/panel/src/i18n/resources/en-US/servers.json @@ -19,6 +19,8 @@ "online": "online", "console": "Console", "claim": "Claim", + "claim_server_title": "Claim Server", + "claim_server_desc": "Are you sure you want to claim the server \"{{name}}\"? Once claimed, you will have access to its console, player management, and backups.", "claiming": "Claiming…", "stop": "Stop", "stopping": "Stopping…", diff --git a/panel/src/i18n/resources/zh-CN/servers.json b/panel/src/i18n/resources/zh-CN/servers.json index 530ef41..0d08fd1 100644 --- a/panel/src/i18n/resources/zh-CN/servers.json +++ b/panel/src/i18n/resources/zh-CN/servers.json @@ -19,6 +19,8 @@ "online": "人在线", "console": "控制台", "claim": "认领", + "claim_server_title": "认领服务器", + "claim_server_desc": "确认认领服务器「{{name}}」吗?认领后你将成为该服务器的所有者,获得控制台、白名单与备份管理权限。", "claiming": "认领中…", "stop": "停止", "stopping": "停止中…", diff --git a/panel/src/pages/servers/ServersPage.tsx b/panel/src/pages/servers/ServersPage.tsx index a62b41b..3bea84a 100644 --- a/panel/src/pages/servers/ServersPage.tsx +++ b/panel/src/pages/servers/ServersPage.tsx @@ -18,6 +18,14 @@ import { useTranslation } from "react-i18next"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; import { Select, SelectTrigger, @@ -433,6 +441,7 @@ function ServerRow({ const { t } = useTranslation("ops"); const { t: ts } = useTranslation("servers"); const [busy, setBusy] = useState(null); + const [confirmOpen, setConfirmOpen] = useState(false); const [error, setError] = useState(null); async function act(kind: "wake" | "stop" | "claim", fn: () => Promise) { @@ -523,14 +532,41 @@ function ServerRow({ size="sm" variant="outline" disabled={busy !== null} - onClick={() => act("claim", () => api.claim(server.name))} + onClick={() => setConfirmOpen(true)} className="text-primary hover:text-primary hover:bg-primary/5 border-primary/20" > - {busy === "claim" ? ts("claiming") : ts("claim")} + {ts("claim")} + + + + + {ts("claim_server_title")} + + {ts("claim_server_desc", { name: server.name })} + + + + + + + + ) : ( <>