Problem
The UI polls for contract state every 15 seconds. This means ~15s lag between a blockchain event and the UI reflecting it. Polling is also wasteful.
Solution
Subscribe to Horizon's Server-Sent Events for contract events (once issue #5 lands).
What needs to be done
- `src/hooks/useEscrowEvents.ts` — subscribe to Horizon SSE stream, parse XDR events, return via callback
- Wire into pages:
- `DashboardPage` — refresh on `EscrowCreated` / `MilestoneApproved`
- `ApprovalsPage` — refresh on `MilestoneSubmitted`
- `MessagesPage` — replace `setInterval` with event stream
- Reconnect with exponential backoff
- Fallback to polling if Horizon SSE unavailable
Acceptance criteria
Depends on issue #5 (contract events)
Problem
The UI polls for contract state every 15 seconds. This means ~15s lag between a blockchain event and the UI reflecting it. Polling is also wasteful.
Solution
Subscribe to Horizon's Server-Sent Events for contract events (once issue #5 lands).
What needs to be done
Acceptance criteria
Depends on issue #5 (contract events)