fix(web): Y/n 按鈕 CSRF Token 缺失修復 (Phase 22 P0)
All checks were successful
E2E Health Check / e2e-health (push) Successful in 17s
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:
@@ -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}
|
||||
/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user