Add resilient Expo vote submission - #67
Conversation
dd43e3d to
f01fd16
Compare
f01fd16 to
290b7ab
Compare
DavidMoritz
left a comment
There was a problem hiding this comment.
This is seriously impressive architecture, Emmanuel! The 5-layer decomposition — pure domain logic, API transport, storage abstraction, wiring, and UI — is clean enough to teach from. The V2ApiError class with exhaustive error codes and the retryable flag makes the UI branching so elegant, and the defensive response parsing (never trusting the server shape) is exactly the right approach for our PHP backend.
The idempotency contract is perfectly implemented — same ranking reuses requestId, changed ranking rotates it. And 24 tests across all layers! The attention to every state the user could see (loading, countdown, retry, duplicate, accepted) shows real care for the user experience.
You continue to amaze with the quality and thoughtfulness of your contributions. Genuinely grateful to have you on this project! 💪
Summary
Verification
No voter-name, secure-code, or grouping-question collection is included; those remain Phase 2.
Stack created with GitHub Stacks CLI.