Skip to content

feat(account): capabilities hub + light headline status (ENG-513 + ENG-516)#667

Merged
islandbitcoin merged 10 commits into
mainfrom
eng-516/light-headline-status
Jul 18, 2026
Merged

feat(account): capabilities hub + light headline status (ENG-513 + ENG-516)#667
islandbitcoin merged 10 commits into
mainfrom
eng-516/light-headline-status

Conversation

@islandbitcoin

@islandbitcoin islandbitcoin commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Summary

This branch carries two slices of the Account Upgrade Revamp (it was repurposed to hold both):

  • ENG-513 — the capabilities hub. AccountType is rebuilt into the "Do more with Flash" screen (mock): a light status pill, a Verify hero card, and independent capability rows — no tier picker, no guided interview.
  • ENG-516 — nomenclature + headline status. The capability state machine surfaced in the app: Trial → Verified → Business, with Pro/International retired and Merchant renamed Business.

Companion PRs: lnflash/flash#452 (backend), lnflash/frappe-flash-admin#55 (admin panel).

Product decision (2026-07-14): light headline status — the account leads with one word (Trial → Verified → Business), with capabilities as supporting detail rather than a badge wall.

Changes

Capabilities hub (ENG-513)

  • app/screens/account-upgrade-flow/AccountType.tsx rewritten from the Personal/Pro/Merchant/International tier ladder into the "Do more with Flash" capabilities hub:
    • Eyebrow "Your Flash account" + "Do more with Flash" title + a light status pill (Trial/Verified/Business) sourced from useAccountStatus.
    • A green Verify your account hero card, hidden once verified.
    • Independent capability rows grouped under Ways to get paid (Bank cash-out, US-dollar account) and Grow (Business). Rows have four states: Set up → (available), On ✓ (enabled, non-tappable), In review (Bridge KYC pending), and locked (padlock — prerequisite not met or feature remotely disabled). The USD row is always visible: locked rather than hidden when Bridge is off (ENG-465 kill switch) or the account is unverified (L1 floor).
    • Rows key off the capabilities { verified bankPayout business usdAccount } object via useAccountStatus — the single source of capability truth, with a level-derived fallback for older backends (unit-tested in __tests__/hooks/account-status-derivation.spec.ts).
    • Each row routes into its existing setup flow — no new data-collection screens: verify/bank/business → today's PersonalInformation wizard; USD → the Bridge KYC modal. Dropped the linear ProgressSteps, which doesn't model a non-linear capability menu. The nav header is untitled — the hub self-titles.
  • New hub strings under AccountUpgrade i18n + regenerated i18n-types.ts / raw-i18n. Dead tier keys (personal/pro/merchant/international + descs, accountType, successUpgrade/successRequest) deleted.

Nomenclature + headline status (ENG-516)

  • useAccountStatus hook (app/hooks/use-account-status.ts): queries statusHeadline + capabilities { verified bankPayout business usdAccount }; capabilities is always defined — backend object when available, else the level+Bridge-KYC derivation from app/hooks/account-status-derivation.ts (pure, tested). Screens must not re-derive from the level.
  • useBridgeKyc hook (app/hooks/use-bridge-kyc.ts): extracted Bridge KYC (bridgeInitiateKyc + BridgeKycModal + navigate("BridgeKycWebView")) into one hook so the hub and other surfaces launch it consistently. Alerts localized.
  • Settings row (account-level.tsx): PERSONAL/PRO/MERCHANT ACCOUNT → localized Trial account / Verified / Business.
  • Account screen (account-screen.tsx): the level row now shows Verified · Bank payout · USD account style status text (localized) instead of the raw internal level (TWO).
  • Success/Validation copy: capability language — "Your account is verified" / "Your bank cash-out request has been submitted for review" / "Your business upgrade request has been submitted for review" — replaces "You successfully upgraded your account to BANK PAYOUT".
  • Bank Accounts screen: the locked verify-identity card launches Bridge KYC directly — with the L1 floor enforced: unverified accounts are routed through the verify wizard first. There is no fallback to the upgrade picker.
  • Codegen: public-schema.graphql synced from the backend (verified additive-only); yarn dev:codegen + yarn update-translations rerun.

Known limits (by design, later tickets)

  • The Bank cash-out (L2) row still runs today's form, which collects business name/location — the business-less L2 flow is ENG-515.
  • The per-capability setup forms are reused as-is; restyling them to the mock's single-step cards is intentionally out of scope for this PR.
  • Non-English locales still carry the old tier words and lack the new hub strings until the next translation sync (en is source of truth).

Testing

  • yarn tsc:check clean; changed files lint clean (the 2 Success.tsx inline-style errors exist on main).
  • __tests__/hooks/account-status-derivation.spec.ts — 8 tests covering the headline + capability level-derivation fallbacks (pass).
  • yarn update-translations / codegen deterministic and committed.
  • Visually verified in the iOS simulator (2026-07-16) in the Trial state: hub renders faithfully to the mock (eyebrow, title, muted Trial pill, Verify hero, capability rows). Verified/Business, "On ✓", "In review", and locked states not yet eyeballed on-device.
  • To test in app: point the app at a backend running feat(accounts): capability state machine + headline status nomenclature (ENG-516) flash#452, then open an account-upgrade entry (Settings → Account → upgrade, Home QuickStart, etc.) → you land on the "Do more with Flash" hub. Tap a capability row → it opens that capability's existing setup flow.

🤖 Generated with Claude Code

Retire Pro and International as user-facing labels; Merchant is now
Business. The account leads with one headline word (Trial / Verified /
Business) with capability badges (Bank payout, USD account) as detail,
per the light-headline-status product decision. New useAccountStatus
hook queries statusHeadline + capabilities from the backend
(lnflash/flash#452) with a level-based fallback for older backends.
Settings row and Account screen show the headline instead of the raw
level; upgrade-flow tier cards adopt the new names. Synced
public-schema.graphql from the backend (additive only) and reran
codegen + typesafe-i18n.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@linear

linear Bot commented Jul 15, 2026

Copy link
Copy Markdown

ENG-516

ENG-513

forge0x and others added 3 commits July 15, 2026 15:04
…ENG-516)

The Business (L3) card rendered unconditionally, so a business account
reaching the picker (e.g. via Bank accounts → Upgrade your account when
Bridge KYC isn't approved) was offered Business again. Guard it like
the other tier cards; a business account now only sees the remaining
capability (USD Account).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ity CTA (ENG-516)

The locked card on the Bank accounts screen gates on the usdAccount
capability, so its CTA now opens the Bridge KYC flow (details modal →
KYC webview) instead of the tier picker. KYC initiation is extracted
from AccountType into a shared useBridgeKyc hook used by both screens;
the CTA falls back to the picker when the Bridge feature flag is off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rebuild AccountType into the "Do more with Flash" capabilities hub:
a light status pill (Trial/Verified/Business) from useAccountStatus, a
Verify hero card, and independent capability rows (Bank cash-out,
US-dollar account, Business) grouped under "Ways to get paid" / "Grow".
Each row routes into its existing setup flow — no guided interview.
Rows key off the capabilities object (level-derived fallback for older
backends); the internal L1/L2/L3 ladder stays hidden. Drops the linear
ProgressSteps, which no longer models a non-linear capability menu.

Adds hub i18n strings under AccountUpgrade + regenerated i18n types.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@islandbitcoin islandbitcoin changed the title feat(account): light headline status + capability nomenclature (ENG-516) feat(account): capabilities hub + light headline status (ENG-513 + ENG-516) Jul 16, 2026
Dread and others added 6 commits July 16, 2026 08:10
…ing sweep (ENG-513/516)

- Bank accounts verify CTA now enforces the L1 floor: unverified users
  route through the verify wizard; verified users launch Bridge KYC
  directly. The fallback to the upgrade picker is gone.
- Hub USD row is always visible: locked (not hidden) when Bridge is
  remotely disabled or the account is unverified; an "In review" state
  restores the pending-KYC affordance the old card's orange border gave.
- useAccountStatus is the single source of capability truth: the
  level+KYC fallback moved to account-status-derivation.ts (unit-tested)
  and AccountType's duplicate derivation is removed.
- String sweep: dead tier keys deleted (personal/pro/merchant/
  international + descs, accountType, successUpgrade/successRequest);
  success + validation copy speaks capability language instead of
  "upgraded to BANK PAYOUT"; account screens and Bridge KYC alerts are
  localized; the hub's nav header is untitled (the screen self-titles).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…/516)

The translation-drift CI check requires every locale to carry all keys
in en.json. Adds the 24 new AccountUpgrade hub keys and 3 BridgeKyc
alert keys to all 23 locale files, refreshes the renamed BridgeKyc
title/description (was untranslated "International Transfer"
everywhere), and prunes the 11 tier keys deleted from en — including
long-corrupted values like es "pro": "Pro Pro Pro …".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Verify: "Phone + ID" was wrong — verification is phone + OTP only.
  Now "Just your phone number · unlocks higher limits in a minute".
- USD row: title "US-Dollar Virtual Bank Account"; description leads
  with what you get — "Your own US account & routing number — receive
  ACH, wires & payroll".
- Business: adds the rewards program — "Get on the Flash map & reward
  your customers".

All 23 locales updated in step.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
When the USD row is locked by the L1 floor, its description now reads
"Verify your account first to unlock" instead of leaving the lock
unexplained (kill-switch locks keep the normal description). The row
also decrowds: title shortened to "USD Virtual Bank Account" and the
locked state shows only a lock icon, so the title no longer wraps.
All 23 locales updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
startBridgeKyc's boolean return had no remaining consumers once the
picker fallback was removed — make it void and fix the stale comment.
use-account-status re-exported the derivation helpers nobody imports
from it; the derivation module is their canonical home.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…reen prop

Two review items: a renderHook test asserting backend
statusHeadline/capabilities beat the level+KYC fallback (and that the
fallback engages when the fields are absent), and removal of
keyboardShouldPersistTaps from the hub Screen — it has no text inputs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@islandbitcoin
islandbitcoin merged commit 2cb8079 into main Jul 18, 2026
7 checks passed
islandbitcoin pushed a commit that referenced this pull request Jul 18, 2026
main's schema snapshot (synced from the flash#452 branch) predated the
Plaid fields, so neither side was a superset: public-schema.graphql now
carries the union, with the three Plaid members verified field-by-field
against the live production API via introspection. Codegen and
i18n-types regenerated from the merged sources; hooks barrel keeps all
three new exports. Full suite on the union: 42 suites / 194 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.

3 participants