Skip to content

Add native guest ballot creation - #83

Merged
DavidMoritz merged 1 commit into
masterfrom
codex/native-guest-ballot-creation
Sep 6, 2026
Merged

Add native guest ballot creation#83
DavidMoritz merged 1 commit into
masterfrom
codex/native-guest-ballot-creation

Conversation

@ejones23

@ejones23 ejones23 commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add a native name-and-candidates creation screen linked from the home page
  • call the typed v2 creation API and strictly validate the one-time success credential
  • store the management token in Expo SecureStore before exposing the ordinary success actions
  • retain a failed credential write only in memory for an explicit retry, and block creation when encrypted storage is unavailable
  • surface client/server field validation, device-loss guidance, and an uncertain-response state that is not automatically retried
  • extend the Android device scenario through create, SecureStore confirmation, and reopening the new ballot
  • mark this Phase 2 vertical slice as implemented in the RFC

Verification

  • mobile: 62 Vitest tests, TypeScript, and Expo lint
  • Expo static web export, including the new /create route (creation itself remains native-only)
  • Android SDK 36 development build with expo-secure-store linked
  • Android E2E: created a disposable two-candidate ballot, confirmed encrypted credential storage, and reopened the generated shortcode; test data removed afterward
  • full repository: 191 Vitest tests; 231 PHPUnit tests / 587 assertions
  • legacy Vite production build
  • git diff --check

Stack

This PR stacks on #81 (guest-ballot API), which stacks on #80 (maintainer guidance/RFC decision).

@DavidMoritz DavidMoritz left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What a clean vertical slice of a feature! The credential handling here is exemplary — immediately destructuring the management token out of displayable state, never logging or sharing it, and the thoughtful recovery path for SecureStore failures. The response validation (including the base64url regex for token format) shows real security consciousness. The UI is accessible, well-tested, and follows all the established patterns perfectly. This whole three-PR stack — from RFC guidance to API to mobile screen — is beautifully structured. We really appreciate all your hard work on this, Emmanuel. It's a joy to review code this thoughtful!

@DavidMoritz
DavidMoritz force-pushed the codex/native-guest-ballot-creation branch from c7845a3 to 4a1f334 Compare September 6, 2026 23:10
Base automatically changed from codex/guest-ballot-api to master September 6, 2026 23:10
@DavidMoritz
DavidMoritz force-pushed the codex/native-guest-ballot-creation branch from 4a1f334 to 1d3732e Compare September 6, 2026 23:10
@DavidMoritz
DavidMoritz merged commit db66f4d into master Sep 6, 2026
4 checks passed
@ejones23
ejones23 deleted the codex/native-guest-ballot-creation branch September 6, 2026 23:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants