Skip to content

Releases: FairCoinOfficial/FAIRWallet

v1.0.0-alpha.12 — Map simplify pass

Choose a tag to compare

@NateIsern NateIsern released this 12 Apr 17:24

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 single SHEET_INDEX_MID, and renamed SHEET_INDEX_SEARCHSHEET_INDEX_TOP to 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

Choose a tag to compare

@NateIsern NateIsern released this 12 Apr 17:13

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

Choose a tag to compare

@NateIsern NateIsern released this 12 Apr 17:00

Native Places map rewrite

Map screen

  • Replaced MarkerView with native ShapeSource + 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.alert with a Bloom Prompt dialog for the location-denied path.
  • Added haptic feedback on marker / row selection and directions button.

Places data

  • Extended the Place model with minimumSpend, acceptsFairToFiat, localCurrency, fiatPayoutMethods, maxFiatPayout, openingHours.
  • New PlaceFacts block surfaces them inside the detail view.
  • Enriched all 16 seed places with realistic values.

Other

  • Migrated FlatListFlashList in contacts and language screens.
  • Replaced the deprecated BottomSheetFlashList wrapper with the documented useBottomSheetScrollableCreator hook.
  • Splash screen now uses the transparent adaptive-icon-foreground asset.

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

Choose a tag to compare

@github-actions github-actions released this 12 Apr 05:42
v1.0.0

UI polish: web tabs theming, welcome screen, home screen improvements

v1.0.0-alpha.6

v1.0.0-alpha.6 Pre-release
Pre-release

Choose a tag to compare

@NateIsern NateIsern released this 11 Apr 16:50

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 onPeerReady callback 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
  • isSyncing state 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

v1.0.0-alpha.5 Pre-release
Pre-release

Choose a tag to compare

@NateIsern NateIsern released this 11 Apr 15:58

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

v1.0.0-alpha.4 Pre-release
Pre-release

Choose a tag to compare

@NateIsern NateIsern released this 11 Apr 15:22

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

v1.0.0-alpha.3 Pre-release
Pre-release

Choose a tag to compare

@NateIsern NateIsern released this 11 Apr 14:57

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 onConnect callback 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.