Skip to content

fix(mobile): address v0.6.0-beta user-test feedback (ENG-511)#666

Merged
islandbitcoin merged 4 commits into
mainfrom
jabariennis/eng-511-user-test-fixes
Jul 14, 2026
Merged

fix(mobile): address v0.6.0-beta user-test feedback (ENG-511)#666
islandbitcoin merged 4 commits into
mainfrom
jabariennis/eng-511-user-test-fixes

Conversation

@islandbitcoin

Copy link
Copy Markdown
Contributor

In-the-wild user testing on v0.6.0-beta surfaced several first-impression issues. This bundles the quick wins with the blank Cash Wallet bug. Tracked under ENG-511.

Changes

ENG-512 — never render a blank Cash Wallet (bug)

formatBalance in wallet-overview.tsx overwrote the Cash balance with ""/undefined when the price-conversion query lost a race on fresh login (or the Cash wallet was briefly missing mid USD→USDT cutover). The Cash <Balance> has no emptyText, so it collapsed to an empty box — looking broken on the very first screen after login. Now we only write a real value (keeping the cached/"0" balance otherwise) and recompute once price conversion resolves.

Home-screen noise (#2, #3)

  • Removed the "Non-custodial wallets" and "Get a Flashcard" QuickStart cards.
  • Moved the "Add Flashcard" action into Settings → Ways to get paid → Flashcard. The home wallet-overview Flashcard row now only renders when a card is linked, so the "Add Flashcard" prompt no longer adds noise for users without one (card-holders still see their balance).

Auto-capitalize name/address fields (#8)

autoCapitalize="words" on Full Name, Bank Name, Account Owner, Street, City; "characters" on US State/Country codes — in the account-upgrade and Bridge external-account forms. Email/username/number fields left untouched.

Verification

  • tsc -p . passes. No new eslint errors introduced (the touched files carry pre-existing lint debt unrelated to this change; eslint is not part of the check-code CI gate).
  • ⚠️ ENG-512 is a timing bug fixed by code reasoning — not yet verified on-device. Worth a QA pass on a slow/flaky connection (fresh login) and on mid-cutover accounts before closing ENG-512.

Refs ENG-511, ENG-512

🤖 Generated with Claude Code

In-the-wild user testing on v0.6.0-beta surfaced several first-impression
issues. Bundles the quick wins with the blank Cash Wallet bug.

- ENG-512: never render a blank Cash Wallet. formatBalance was overwriting
  the balance with ""/undefined when the price-conversion query lost a race
  on fresh login (or the Cash wallet was briefly missing mid USD->USDT
  cutover); the Cash card has no emptyText so it collapsed to an empty box.
  Now we only write a real value (keeping the cached/"0" balance otherwise)
  and recompute once price conversion resolves.
- Remove the "Non-custodial wallets" and "Get a Flashcard" QuickStart cards.
- Move the "Add Flashcard" action into Settings -> Ways to get paid. The home
  wallet-overview Flashcard row now only shows when a card is linked, so the
  "Add Flashcard" prompt no longer adds noise for users without one.
- Auto-capitalize name/address fields (Full Name, bank name, account owner,
  street, city -> words; US state/country codes -> characters) in the account
  upgrade and Bridge external-account forms.

Refs ENG-511, ENG-512

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@linear

linear Bot commented Jul 14, 2026

Copy link
Copy Markdown

ENG-512

ENG-511

ENG-517

Dread and others added 2 commits July 14, 2026 14:46
…zation

- wallet-overview: persist + guard the flashcard display balance the same way
  as Cash/BTC, so a linked card no longer blanks to the "Add Flashcard" empty
  state during the price-not-ready window on cold start (ENG-512, review #1).
  Adds cardDisplayBalance to persistent state; effect refires on balanceInSats.
- BridgeAddExternalAccount: normalize at submit — state/country via
  trim().toUpperCase() (Bridge wants ISO codes), trim the free-text fields —
  rather than trusting the autoCapitalize keyboard hint (review #2).
- add wallet-overview.spec.tsx: cached card balance survives an undefined
  converter and refreshes once it resolves (review #3, first test for this).
- minor: standardize the flashcard sync button on readFlashcard().

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ned keys

Review follow-up (ENG-511 minors):
- the account-flashcard settings row now uses LL.SettingsScreen.flashcard()
  (new key) instead of borrowing LL.HomeScreen.flashcard() from the
  home-screen wallet card — settings rows use the SettingsScreen namespace.
- remove the orphaned HomeScreen keys flashcardTitle / flashcardDesc /
  nonCustodialWalletTitle / nonCustodialWalletDesc (zero code references).
- regenerate i18n-types.ts + raw-i18n/source/en.json via typesafe-i18n.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@islandbitcoin

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review — the diagnosis was right and the "one row short" framing was fair. Addressed the must-fixes, added the test, cleaned up the minors, and filed the staleness follow-up.

① Flashcard row race — fixed (9f919884)

Applied the exact Cash/BTC treatment to the flashcard row: added cardDisplayBalance to persistent state, seed the row from it, and only overwrite when the converted value is truthy; the format effect now also refires on balanceInSats. So a linked card keeps its cached balance on cold start instead of flipping to the cardAdd / "Add Flashcard" empty state during the price-not-ready window — the row this PR was about.

② Bridge state/country normalization — fixed (9f919884)

handleSubmit now normalizes at submit rather than trusting the keyboard hint: state/country.trim().toUpperCase() (Bridge expects ISO codes — 2-char state, 3-char country), plus .trim() on the free-text fields. Kept autoCapitalize as a harmless UX hint.

③ Regression test — added (9f919884)

__tests__/components/wallet-overview.spec.tsx (first test for these modules): with the converter returning undefined, the cached balance survives (doesn't blank); once it resolves, the row updates and drops the stale value.

④ Stale money has no expiry — follow-up: ENG-517

Agreed, and the guard arguably entrenches it (the card now also never blanks). Bounding it properly — a last-success timestamp + a staleness affordance — is separate work, tracked in ENG-517 rather than reverting to blanking here.

Minors — fixed (abc69b47)

  • Settings row now uses LL.SettingsScreen.flashcard() (new key) instead of borrowing HomeScreen.flashcard().
  • Removed the four orphaned HomeScreen keys (flashcardTitle / flashcardDesc / nonCustodialWalletTitle / nonCustodialWalletDesc); regenerated i18n-types.ts + raw-i18n/source/en.json via typesafe-i18n.
  • Standardized the flashcard sync button on readFlashcard().

The translation-drift gate requires every en.json key to exist in each
locale file. Propagate SettingsScreen.flashcard (English placeholder — it's
a brand term) to all locale translation JSONs, and remove the now-orphaned
HomeScreen keys (flashcardTitle/flashcardDesc/nonCustodialWalletTitle/
nonCustodialWalletDesc) from them too. Passes check:translation-drift.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@islandbitcoin
islandbitcoin merged commit 43b7764 into main Jul 14, 2026
7 checks passed
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.

1 participant