feat(web): Phase 6.5c implement [Y/n] execution wiring

DualStateIncidentCard:
- Add proposalId prop for approval actions
- Add onApprovalChange callback for status updates
- Implement handleApprove() calling POST /api/v1/approvals/{id}/sign
- Implement handleReject() calling POST /api/v1/approvals/{id}/reject
- Add ButtonState management (idle/loading/approved/rejected/error)
- Loading spinner during API call
- Success state: green "已授權" / red "已拒絕"
- Error state: orange "錯誤" with auto-recovery

API Client:
- Fix endpoint mismatch: rename approveApproval to signApproval
- Use correct endpoint /sign instead of /approve
- Add signer parameter for multi-sig support

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-23 12:37:56 +08:00
parent a769738499
commit 28fa8e6af4
2 changed files with 133 additions and 11 deletions

View File

@@ -114,13 +114,19 @@ export const apiClient = {
}>(res)
},
async approveApproval(approvalId: string, reason?: string) {
const res = await fetch(`${API_BASE_URL}/approvals/${approvalId}/approve`, {
async signApproval(approvalId: string, signer: string = 'commander', reason?: string) {
const res = await fetch(`${API_BASE_URL}/approvals/${approvalId}/sign`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ reason }),
body: JSON.stringify({ signer, reason }),
})
return handleResponse<{ id: string; status: string }>(res)
return handleResponse<{
approval_id: string
status: string
current_signatures: number
required_signatures: number
message: string
}>(res)
},
async rejectApproval(approvalId: string, reason?: string) {