fix(web): Y/n 按鈕 CSRF Token 缺失修復 (Phase 22 P0)
All checks were successful
E2E Health Check / e2e-health (push) Successful in 17s

修復問題:
- 按鈕點擊無反應:CSRF token 載入中或失敗時,buttons 現在會被 disabled
- 增加 toast.error() 提示:當 token 缺失時,顯示「安全驗證失敗」提示

變更:
- handleSign: 新增 toast.error() 當 csrfToken 為 null
- confirmReject: 新增 toast.error() 當 csrfToken 為 null
- ApprovalCard isLoading: 擴展為 signing || csrfLoading || csrfError

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-31 19:09:25 +08:00
parent b14d1110fd
commit a028b44c84

View File

@@ -28,6 +28,7 @@ import {
GlassCardTitle,
GlassCardContent,
} from '@/components/ui/glass-card'
import { toast } from '@/components/ui/toast'
import { StatusOrb } from '@/components/ui/status-orb'
import { cn } from '@/lib/utils'
import { ShieldX, Lock, AlertTriangle } from 'lucide-react'
@@ -154,6 +155,7 @@ export function LiveApprovalPanel({
// Phase 20: CSRF 保護 - 必須有 Token 才能簽核
if (!csrfToken) {
console.error('[HITL] CSRF token not available, cannot sign')
toast.error('安全驗證失敗,請重新整理頁面後再試')
return
}
@@ -209,6 +211,7 @@ export function LiveApprovalPanel({
// Phase 20: CSRF 保護 - 必須有 Token 才能拒絕
if (!csrfToken) {
console.error('[HITL] CSRF token not available, cannot reject')
toast.error('安全驗證失敗,請重新整理頁面後再試')
return
}
@@ -334,7 +337,7 @@ export function LiveApprovalPanel({
onApprove={() => handleSign(approval.id, approval.riskLevel)}
onReject={() => handleReject(approval.id)}
holdDuration={2000}
isLoading={signingStates[approval.id] === 'signing'}
isLoading={signingStates[approval.id] === 'signing' || csrfLoading || !!csrfError}
readOnly={isResolved}
/>