Skip to content

feat(send): give the zero fee the prominence it earns (#561) - #709

Merged
islandbitcoin merged 3 commits into
mainfrom
feat/fee-row-prominence
Aug 25, 2026
Merged

feat(send): give the zero fee the prominence it earns (#561)#709
islandbitcoin merged 3 commits into
mainfrom
feat/fee-row-prominence

Conversation

@bobodread876

Copy link
Copy Markdown
Collaborator

Closes #561 (Lori's app-audit P1). Based on fix/fee-from-amount-disclosure — merges after #708, because the two features share the fee row and must agree.

What changes

before after
Fee — same weight as every row Flash fee — value in theme green, bold
no context small gray line: "Typical remittance services charge J$1,500–2,000 for this."

Copy decided with Jabari: the comparison lands without naming a competitor in-app (brand rule).

The integration decision, pinned by a property test

Celebration and #708's fee-from-amount disclosure are mutually exclusive by construction. shouldCelebrateZeroFee fires only on a settled zero that shouldDiscloseFeeFromAmount has nothing to say about. A row that says "$0.00, we're proud of it" directly above "the network fee is deducted from the amount" would be the app contradicting itself on a money screen. The test sweeps every paymentType × currency combination and asserts both predicates never fire together — so a future edit to either can't silently reintroduce the contradiction.

Concretely: intraledger sends and Flash-to-Flash lightning (payee-node suppressed) celebrate; an external USD send with a probed zero shows the caveat, never the green.

Color note

#561 asked for #3ab54a, which isn't in the theme. This uses colors.green (defined for light and dark) rather than hardcoding an off-theme hex — a one-line palette addition if the exact brand hex is wanted, and I'd rather that be a deliberate design call.

i18n

Two keys at the source, types regenerated, all 23 locales filled (Spanish translated: "Los servicios de remesas típicos cobran J$1,500–2,000 por esto."), drift check green.

88 suites / 884 tests.

bobodread876 pushed a commit that referenced this pull request Aug 24, 2026
…ll raw translations

Review fix for PR #709: the dead feeLabel key was removed from the source
dictionary in round 1, but no locale sync exists to drop it from the 23
raw translation JSONs (check-translation-drift only flags missing keys,
never extras), so the stale key would persist and could silently
resurrect as mistranslations if feeLabel were ever reintroduced with a
different meaning.

The JSON round-trip also dedupes a pre-existing exact-duplicate
TopUpAmountScreen allowanceExhausted key (identical value in both
occurrences of every file), which is semantics-preserving.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
Base automatically changed from fix/fee-from-amount-disclosure to main August 24, 2026 23:32
Dread and others added 3 commits August 24, 2026 16:32
Lori's app-audit P1: the fee row carried the same visual weight as every
other data row, on the screen where Flash's zero fee IS the product
moment — a transfer that costs J$1,500-2,000 through a typical
remittance service costs nothing here.

The row now reads 'Flash fee', the value renders in the theme's green,
bold, and a small gray line underneath says 'Typical remittance services
charge J$1,500-2,000 for this.' Copy chosen with Jabari: the comparison
lands without naming a competitor in-app (brand rule: no punching).

THE INTEGRATION DECISION, pinned by a property test: celebration and the
fee-from-amount disclosure (#694) are mutually exclusive by
construction. shouldCelebrateZeroFee fires only on a settled zero that
shouldDiscloseFeeFromAmount has nothing to say about — a row that says
'$0.00, we're proud of it' directly above 'the network fee is deducted
from the amount' would be the app contradicting itself on a money
screen. The test sweeps every paymentType x currency combination and
asserts both never fire together.

Color note: #561 asked for #3ab54a, which is not in the theme palette;
uses colors.green (defined for light AND dark) rather than hardcoding an
off-theme hex. One-line palette add if the exact brand hex is wanted.

i18n at the source, 23 locales filled (es translated), drift green.
Based on fix/fee-from-amount-disclosure — merges after #708.

88 suites / 884 tests green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
…bel, revert drive-by churn

- send-confirmation.spec.tsx: assert the rendered celebration (green fee +
  'Zero Fee Comparison' with the real copy) on the Intraledger story, and
  that an external-USD probed zero renders the fee-from-amount caveat with
  no celebration — pinning the ConfirmationWalletFee wiring the predicate
  unit tests cannot see (both cases verified to fail under a wired-wrong
  component)
- i18n: delete the now-dead SendBitcoinConfirmationScreen.feeLabel from the
  source dictionary and regenerate types; stale key in translation files is
  dropped by the locale sync
- revert unrelated style refactors in ConfirmationError.tsx and
  DetailDestination.tsx to keep the PR surface at #561

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
…ll raw translations

Review fix for PR #709: the dead feeLabel key was removed from the source
dictionary in round 1, but no locale sync exists to drop it from the 23
raw translation JSONs (check-translation-drift only flags missing keys,
never extras), so the stale key would persist and could silently
resurrect as mistranslations if feeLabel were ever reintroduced with a
different meaning.

The JSON round-trip also dedupes a pre-existing exact-duplicate
TopUpAmountScreen allowanceExhausted key (identical value in both
occurrences of every file), which is semantics-preserving.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEoz7nBtdtsHyuYG5wNPQV
@islandbitcoin
islandbitcoin force-pushed the feat/fee-row-prominence branch from 85c2cc3 to 378e8dc Compare August 24, 2026 23:33
@islandbitcoin
islandbitcoin merged commit ddcf092 into main Aug 25, 2026
10 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.

[P1] Fee row on payment confirmation needs visual prominence

2 participants