Releases: FairCoinOfficial/FAIRWallet
Release list
v1.0.0-alpha.12 — Map simplify pass
Map simplify pass + keyboard fixes
Follow-up to v1.0.0-alpha.11. Applies a second round of /simplify review fixes and lands the keyboard-controller integration.
Cleanups
- Snap constants: collapsed
SHEET_INDEX_DETAIL/SHEET_INDEX_LIST(both `1`) into a singleSHEET_INDEX_MID, and renamedSHEET_INDEX_SEARCH→SHEET_INDEX_TOPto match what the index actually means. - Render perf: `LIST_CONTENT_CONTAINER_STYLE` is now a module-level constant instead of an empty-dep `useMemo`.
- Row re-renders: `PlaceRow` wrapped in `React.memo` so FlashList skips rows that aren't the new or old selection.
- No-op guard: `handleSheetChange` uses the functional setState form so repeat snaps at the same index don't schedule extra renders.
- Comment hygiene: `handleSearchFocus` comment trimmed to just the non-obvious WHY.
Keyboard
- `KeyboardProvider` from `react-native-keyboard-controller` wired at the root (replaces React Native's flaky keyboard bookkeeping on Android).
- Dropped the `onBlur`-triggered snap that was causing focus-blur oscillation on the search TextInput.
Test plan
- Tap search → sheet snaps to top, keyboard stays open, can type
- Drag sheet through all three snaps — magnetic to top
- Scroll the places list at mid and top snap
- Tap a pin from the map → detail view shows
- Change filter chip → list updates, haptic feedback fires
🤖 Generated with Claude Code
v1.0.0-alpha.11 — Places polish + keyboard-controller
Places map polish + keyboard-controller
Map
- Sheet snap-to-top bumped to 100% so the sheet slides behind the notch when fully expanded (Google Maps UX).
- Dynamic animated top padding on the list header keeps rows below the floating search pill as the sheet expands.
- Search pill uses `bg-surface` (distinct from the sheet background) and swaps its drop shadow for a hairline border when the sheet is fully expanded.
- Fixed FlashList flex layout so the list scrolls properly inside the sheet.
- Magnetic sheet snapping (via existing gorhom snap points) — flicks past the mid snap pull straight to the top.
- Detail mode uses a slightly larger 62% mid snap so the hero image, facts, and action row all fit without scrolling.
Keyboard
- Wire `KeyboardProvider` from `react-native-keyboard-controller` at the root layout. Fixes Android focus loss on the search `TextInput` when the bottom sheet auto-snaps. The `requestAnimationFrame` workaround is gone.
Test plan
- Tap search, verify sheet snaps to top AND keyboard opens AND TextInput keeps focus
- Drag sheet from mid to top, verify smooth transition and search pill stays visible
- Verify list scrolls at mid and top snap
- Verify filter chips and 'Near you' are visible at both snaps
- Tap a place, verify camera centers it above the sheet
- Verify sheet slides behind the notch at top snap
🤖 Generated with Claude Code
v1.0.0-alpha.10 — Native Places map
Native Places map rewrite
Map screen
- Replaced
MarkerViewwith nativeShapeSource+CircleLayer+SymbolLayer— GPU-rendered pins with drop shadows, zoom-responsive radii, and text labels. - Switched camera centering to the documented
fitBounds(ne, sw, [top, right, bottom, left], duration)path. The selected pin always lands in the visible upper portion of the screen above the bottom sheet. - Google-Maps-style interaction model:
- Sticky floating search pill with deeper shadow.
- Sticky category filter chips that pin below the title row.
- Floating grab handle that scrolled rows pass behind (transparent overlay).
- Smooth drag-synchronised top padding via Reanimated as the sheet expands behind the pill.
- Replaced
Alert.alertwith a Bloom Prompt dialog for the location-denied path. - Added haptic feedback on marker / row selection and directions button.
Places data
- Extended the
Placemodel withminimumSpend,acceptsFairToFiat,localCurrency,fiatPayoutMethods,maxFiatPayout,openingHours. - New
PlaceFactsblock surfaces them inside the detail view. - Enriched all 16 seed places with realistic values.
Other
- Migrated
FlatList→FlashListin contacts and language screens. - Replaced the deprecated
BottomSheetFlashListwrapper with the documenteduseBottomSheetScrollableCreatorhook. - Splash screen now uses the transparent
adaptive-icon-foregroundasset.
Test plan
- Open map, verify pins render with category colors and text labels
- Tap a pin, verify camera animates to it and detail sheet shows
- Drag sheet up, verify smooth transition and search pill stays visible
- Filter by category, verify pins and list update
- Search for a place, verify sheet expands to full screen
- Tap directions / call / website, verify they open correctly
- Verify location-denied shows a Bloom Prompt (not native Alert)
🤖 Generated with Claude Code
1.0.0
v1.0.0 UI polish: web tabs theming, welcome screen, home screen improvements
v1.0.0-alpha.6
Changes since alpha.5
Critical: Syncing now works
- syncHeaders() was never called — the SPV client started the peer manager but never triggered header synchronization when peers connected
- Added
onPeerReadycallback to PeerManager that notifies the SPV client when a peer completes the version/verack handshake - SPV client now automatically starts header sync on first ready peer
- Bloom filter is sent to each newly connected peer
isSyncingstate is driven by actual sync progress events, not set prematurely
Code quality
- Full codebase audit (40+ source files)
- Updated README with current architecture
- Gradle 8.13 pinned via Expo config plugin (avoids Gradle 9 IBM_SEMERU bug)
- GitHub Actions updated to use Java 21
Download
APK and desktop builds attached when CI completes.
v1.0.0-alpha.5
Critical P2P Fix
Root Cause Found
react-native-tcp-socket was being called as TcpSocket.default.createConnection() but the module exports createConnection directly via module.exports — there is no .default. This caused every TCP connection attempt to throw undefined is not a function, which was silently caught, leaving the wallet permanently in 'Searching for peers...' state.
Fix
TcpSocket.default.createConnection() → TcpSocket.createConnection()
Verified
Node.js test against seed1.fairco.in:46372 confirms:
- DNS resolution works (104.248.84.245)
- TCP connection succeeds
- Version handshake completes (protocol 71000)
- verack received — peer is ready
Also in this release
- Edge-to-edge scrolling (content scrolls behind notch)
v1.0.0-alpha.4
Changes since alpha.3
P2P Fix
- TCP handshake timing: Wait for socket onConnect before sending version message (fixes 'Searching for peers' stuck state)
UI/UX
- Edge-to-edge scrolling: Content scrolls behind the notch/status bar for immersive feel across all scrollable screens (home, send, receive, settings, masternode, wallets, transaction detail, contacts, coin control, export key)
- Non-scrollable screens (lock, PIN, onboarding) keep safe area boundaries
Downloads
APK and desktop builds attached automatically when CI completes.
v1.0.0-alpha.3
Changes since alpha.2
Critical Fix
- P2P handshake: Version message was sent before TCP connection was established, causing all peer connections to fail silently. Now waits for the socket
onConnectcallback before sending the version handshake.
Status
With this fix, the wallet should progress from 'Searching for peers...' to 'Connected to N peers' when connecting to seed1.fairco.in / seed2.fairco.in on port 46372.
Downloads
APK and desktop builds attached automatically when CI completes.