fix(ui): подтверждать переключение правил Firewall

This commit is contained in:
Denozordec committed 2026-09-30 09:52:29 +07:00
1 parent 14be83a869
commit 131ecb8668
6 files changed
+89 -11

No files matched your search

+20 -4
View File
@@ -1935,6 +1935,10 @@ function FirewallPageInner() {
const [dataLoading, setDataLoading] = useState(false)
const [dataError, setDataError] = useState<string | null>(null)
const [busy, setBusy] = useState(false)
const toggleLock = useRef(false)
const [togglePending, setTogglePending] = useState(false)
const [toggleStatus, setToggleStatus] = useState<string | null>(null)
const [toggleError, setToggleError] = useState<string | null>(null)
const [selectedServerId, setSelectedServerId] = useState(serverFromQuery ?? ALL_SERVERS_ID)
const appliedQueryRef = useRef(false)
@@ -2136,18 +2140,27 @@ function FirewallPageInner() {
async function toggleRule(id: string) {
const r = displayRules.find((x) => x.id === id)
if (!r) return
if (!r || toggleLock.current || busy || historyRestoring) return
if (isLive) {
const key = ruleKey(r)
if (!key) return
toggleLock.current = true
setTogglePending(true)
setToggleError(null)
setToggleStatus(`Ожидание изменения правила ${r.comment || r.rosId || r.id}…`)
try {
await apiFetch("/api/firewall/rules", {
const result = await apiFetch<{ ok: boolean }>("/api/firewall/rules", {
method: "PATCH",
body: JSON.stringify({ ...key, disabled: r.enabled }),
})
if (result?.ok !== true) throw new Error("Сервер не подтвердил изменение правила")
await loadLive()
} catch (e) {
toast.error(e instanceof Error ? e.message : "Не удалось переключить правило")
setToggleError(`${r.comment || r.rosId || r.id}: ${e instanceof Error ? e.message : "Не удалось переключить правило"}`)
} finally {
toggleLock.current = false
setTogglePending(false)
setToggleStatus(null)
}
return
}
@@ -2468,6 +2481,8 @@ function FirewallPageInner() {
</span>
</div>
{toggleStatus && <p role="status" className="text-sm text-muted-foreground">{toggleStatus}</p>}
{toggleError && <p role="alert" className="text-sm text-destructive">{toggleError}</p>}
<KpiStatGrid
aria-label="Сводка Firewall"
items={[
@@ -2570,10 +2585,11 @@ function FirewallPageInner() {
<FirewallRulesDataGrid
rules={filteredRules}
mutationsDisabled={togglePending || busy || historyRestoring}
onToggle={(id) => { void toggleRule(id) }}
onEdit={openEdit}
onDelete={(r) => { void deleteRule(r) }}
onReorder={canReorder ? (activeId, overId) => { void reorderRules(activeId, overId) } : undefined}
onReorder={canReorder && !togglePending ? (activeId, overId) => { void reorderRules(activeId, overId) } : undefined}
showServer={showServerCol}
/>
</DataPageCard>