chore(mobile): shared primitives for contact flows#372
Merged
Conversation
- saveContact: insert-only → upsert (functional set). - Schema: id and image optional so edits round-trip the id. - deleteContact: simplified; setContacts removed (unused).
- ConfirmActionBottomSheet: generic confirmation sheet. - useImagePicker: gallery picker with permission UX; strips EXIF. - QRScannerView: pad empty state; re-enable scanner after unrecognized codes; guard requestPermission against unmount. - PWIcon: register contacts + pen-solid; drop white fill on moon. - Add SHORT_ADDRESS_FORMAT (9) to @constants/ui. - iOS: photo-library permission + expo-image-picker plugin. - Add expo-image-picker dep.
This was referenced Apr 24, 2026
wjbeau
approved these changes
Apr 24, 2026
… review Instead of the UI hooks calling findContacts to guard against duplicate addresses, saveContact now enforces uniqueness at the store layer and throws DuplicateAddressError on conflict. Downstream hooks catch and surface to form state. Addresses PR #373 review comment to keep business rules in the package, not the UI layer.
…er review Replace the Alert.alert call in useImagePicker with a ConfirmActionBottomSheet, consistent with the rest of the codebase which doesn't use Alert. Extract PhotoPermissionDeniedSheet as a reusable component wrapping ConfirmActionBottomSheet with the photo-specific i18n copy. The hook now returns a permissionDenied state object (isVisible, close, openSettings) that callers pair with <PhotoPermissionDeniedSheet /> at the screen root. Also drops custom fontSize/lineHeight from ConfirmActionBottomSheet/styles.ts in favor of the PWText body variant at the callsite.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Foundational building blocks shared by every downstream contacts screen, plus collateral fixes that rode along:
Related Issues
No ticket — shared primitives commit. Enables PERA-3930, PERA-3931, PERA-3932, PERA-4122.
Checklist
Additional Notes
Stacked on #371. No screen-level changes in this PR — only the reusable pieces.