Gate wallet transfer and receipt billing account selection behind a Save button (a11y On Input, PR 12) - #99238
Gate wallet transfer and receipt billing account selection behind a Save button (a11y On Input, PR 12)#99238MelvinBot wants to merge 1 commit into
Conversation
…ave button (a11y On Input, PR 12) Co-authored-by: truph01 <truph01@users.noreply.github.com>
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
🤖 I ran the testing steps for this PR on Android (standalone NewDot) but was unable to reach either page this PR modifies with the test account, so I could not verify the Save-button gating behavior. Why it's blocked: both pages require account state that a fresh Melvin test account doesn't have:
Neither precondition can be satisfied in a read-only verify run (e.g. linking a real bank account via Plaid is out of scope), so this reflects a test-environment limitation, not a failure of the PR itself. To get these verified on Android, the flows need to be run on an account that already has a funded Expensify Wallet with a linked bank account (for the transfer-account page) and an admin workspace with Uber central billing enabled (for the receipt-billing page). The behavior to confirm on each:
|
|
🤖 I ran the testing steps for this PR on Web but was unable to reach either page this PR modifies with the test account, so I could not verify the Save-button gating behavior. (Same blocker I hit on Android.) Why it's blocked: both pages require account state a fresh Melvin test account doesn't have:
These are test-environment preconditions, not a failure of the PR. To get these verified on Web, the flows need an account that already has a funded/enabled Expensify Wallet with a linked bank account (for the transfer-account page) and an admin workspace with Uber central billing enabled (for the receipt-billing page). The behavior to confirm on each:
|
|
@MelvinBot Mark this PR as ready |
|
🤖 Done — this PR is now marked Ready for review. |
JmillsExpensify
left a comment
There was a problem hiding this comment.
No product review required.
|
I looked into the failing checks — there's nothing here I can fix with a code push. All three failures are human process gates, not code/test failures:
Every actual code check is green (ESLint, typecheck, To get these to pass, the author/reviewer need to complete the checklists in the PR and obtain the required approval — no code change is needed from me. |



Explanation of Change
This addresses a WCAG 3.2.2 "On Input" accessibility violation, part of the batched plan in issue #74834 (PR 12). Two account-selection pages committed the change and navigated away the instant a row was tapped, so the layout/context changed without the user explicitly confirming — disorienting for screen-reader and low-vision users.
Both pages now stage the tapped account in local state and only commit it when the user presses the Save button (via
confirmButtonOptionsonSelectionList), matching the pattern already shipped in PRs 3–8. The staged row is highlighted, and the Save button is disabled until the staged selection differs from the current value. Footer/guard actions are intentionally left immediate:ChooseTransferAccountPage— the bank-account row selection is staged and committed (saveWalletTransferAccountTypeAndID+goBack) on Save; the "Add new bank account / debit card" footerMenuItemActionstays immediate.ChangeReceiptBillingAccountPage— the row selection reuses the existing localselectedOptionState(highlight) and is committed (changePolicyUberBillingAccount+goBack) on Save; thecentralBillingAccountEmailguard is preserved.🤖 Generated by MelvinBot. Checks run locally:
lint-changed✅,typecheck-tsgo✅. React Compiler compliance check couldn't run in this environment (base-ref resolution); no manual memoization was added, so CI will validate. Fullnpm test/ storybook smoke deferred to CI.Fixed Issues
$ #74834
PROPOSAL: #74834 (comment)
Tests
Offline tests
QA Steps
// TODO: These must be filled out, or the issue title must include "[No QA]."
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari