Skip to content

Scan experience follow-up ​

Mobile draft: poc-tcg-collector #842.

Scope ​

  • Restore the selected candidate and captured image after opening a card detail and returning, including the hardware-back navigation action.
  • Default scan history to the existing persistent AsyncStorage repository, retaining explicit mock selection for fixtures.
  • Resolve French One Piece alternate artwork through the catalogue mirror.
  • Keep the two-step collection flow, but scroll its preview and fields separately from the submit action; apply keyboard avoidance on the result modal.
  • Explain collection quota refusals with usage and an offers action. Do not bypass quotas, alter account entitlements or report a refused write as saved.
  • Show queued artwork arriving in the bulk tray, with reduced-motion support.
  • Do not silently upload a whole camera photo when isolation fails. Reticle crop geometry and native recognition algorithms are not changed.

Explicit exclusions ​

Recognition accuracy/ranking, removal of the two-step collection journey, native code, dependency updates, production changes and emulator startup are excluded. No user account or collection was edited to verify these changes.

Evidence and limitations ​

Focused Jest regressions cover image routing, persistent history after repository recreation, route restoration, form submission placement and explicit quota feedback. Existing iOS visible-frame upload tests remain passing. Some component wiring tests use lightweight React mocks and do not prove native layout.

The exact French One Piece alternate from the report exists in the catalogue and its first-party mirrored artwork responded HTTP 200 with image/webp.

Lint and TypeScript pass. The full Jest run has a pre-existing dependency alignment failure: staging requires react-native-svg 15.16.0, but the published Expo 54.0.38 bundled manifest requires 15.12.1. No dependency pin or test was weakened. Physical-device framing, keyboard geometry, bulk animation and a live collection write are not verified. No emulator was started.

The user approved the mobile 11-file exception. The fixture-driven .maestro/scan-result-return.yaml now checks detail/back restoration and reachable submission after keyboard use without launching/resetting the app or submitting a collection write. YAML parsing passes; execution remains intentionally deferred because no emulator may be started.

The user also authorized a separate rollback to the Expo-compatible SVG version: mobile #843. That change only restores react-native-svg 15.12.1 and its lock entries, and is tracked separately under mobile issue #780. Native sources and unrelated package pins remain unchanged. Validation of the combined changes is performed in an isolated checkout, not by merging either PR into staging.

After applying the separate SVG manifest/lock correction to the scan branch in that checkout, ESLint and TypeScript pass and the complete Jest suite reports 303 passing suites, 2 skipped suites, 2,990 passing tests and 11 skipped tests, with no failures. Validation uses Node 22.23.4 and a clean Expo 54.0.38/SVG 15.12.1 installation with the existing postinstall compatibility script applied. These are local integration results, not a claim that #842's unchanged staging base already contains #843 or that native E2E/device testing ran.

Measured framing follow-up ​

Mobile #845 addresses the remaining layout/crop mismatch on both platforms. The upload rectangle now comes from the laid-out brackets and camera viewport. A failed deterministic crop may not switch to a full-photo contour search. Android adds the same explicit crop capability as iOS, with EXIF normalization, bounded decoding and bitmap cleanup, using existing platform APIs. The user explicitly approved the native scope.

Combined local validation with the prerequisites: 303 passing suites, 2,994 passing tests, 11 skipped tests, no failures; lint and TypeScript pass. Android compileReleaseKotlin succeeds. This is not a physical sensor/preview pixel test, and an iOS binary cannot be compiled on this Windows host.

Read-only production inspection confirms the deployed free collection cap is 30 active copies, not 30 distinct rows. Soft-deleted holdings do not consume the cap. The reported refusal is consistent with that rule; no entitlement, account or holding is changed to circumvent it. No personal identifiers or collection contents are recorded here.

The user authorized staging merges followed by launching the existing emulator for manual testing. Preserve its data, back up before replacement installation, and never uninstall, clear app storage or submit a collection write as a test.