You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Due for payment 2026-03-30] [$250] Add bank account - Next button is unresponsive after going online on Manually add BA page #82769
Version Number: 9.3.21-0 Reproducible in staging?: Yes Reproducible in production?: Yes If this was caught during regression testing, add the test name, ID and link from BrowserStack:https://test-management.browserstack.com/projects/2219752/folder/13176693/test-cases/41236755 Email or phone of affected tester (no customers): N/A Issue reported by: Applause Internal Team Bug source: Exploratory - Significant User Experience Deterioration Device used: MacBook Air 15.7.3 Chrome App Component: Other
Action Performed:
Sign in to ND
Create a workspace
Open Workflows - Payments - Add bank account
Click "Connect manually", then Confirm
Enter routing and account numbers, go force offline - Next button is disabled
Go force online and click Next button
Expected Result:
User is navigated to the next step
Actual Result:
Next button is unresponsive, user remains on the "Manually add your bank account" page
Please re-state the problem that we are trying to solve in this issue.
After entering routing and account numbers on the "Manually add your bank account" page, going force offline (Next button correctly disables) and then going force online, the Next button becomes unresponsive. The user remains stuck on the page and cannot proceed.
What is the root cause of that problem?
The root cause is a combination of two issues triggered by the offline-to-online transition:
1. openReimbursementAccountPage sets isLoading: true on reconnection, which blocks form submission.
When the network changes from offline to online, ReimbursementAccountPage.tsx:293 detects this and calls fetchData(true), which calls openReimbursementAccountPage(). This READ command immediately (optimistically) sets isLoading: true on ONYXKEYS.REIMBURSEMENT_ACCOUNT (BankAccounts.ts:1027).
2. ONYXKEYS.REIMBURSEMENT_ACCOUNT and ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM are the same Onyx key ('reimbursementAccount') (ONYXKEYS.ts:350 and ONYXKEYS.ts:900).
This means when isLoading: true is set on the reimbursement account, it also becomes formState?.isLoading in FormProvider. The submit function at FormProvider.tsx:238 checks if (!!formState?.isLoading || isLoading) { return; } and silently blocks all clicks.
Meanwhile, the page-level loading check at ReimbursementAccountPage.tsx:495 shows a ReimbursementAccountLoadingIndicator while isLoading is true. When the READ response comes back and sets isLoading: false, the form re-renders. However, the SaveResponseInOnyx middleware (SaveResponseInOnyx.ts:38) may defer the response processing if it detects the client is behind on OnyxUpdates (common after reconnection), keeping isLoading stuck at true until the update gap is resolved.
Additionally, the READ command waits for all pending WRITE commands via waitForWrites() (API/index.ts:268) before firing, which can further delay the response if there are queued writes in the sequential queue.
What changes do you think we should make in order to solve the problem?
Pass shouldShowLoading: false when calling openReimbursementAccountPage from the offline-to-online reconnection handler. The form data is already loaded and visible to the user - there's no need to show a loading state just because we're refreshing data after reconnection.
In ReimbursementAccountPage.tsx, modify fetchData() to accept a parameter that controls whether the loading indicator is shown, and pass it through to openReimbursementAccountPage. Specifically:
Add a shouldShowLoading parameter to openReimbursementAccountPage in BankAccounts.ts (similar to how getVBBADataForOnyx already has a shouldShowLoading parameter at line 176). When false, the optimistic data should not set isLoading: true.
In the offline-to-online effect at ReimbursementAccountPage.tsx:293-294, call fetchData(true) in a way that propagates shouldShowLoading: false to openReimbursementAccountPage.
This keeps the form interactive while the background refresh happens, and the user can proceed with clicking Next without being blocked.
What alternative solutions did you explore? (Optional)
Adding enabledWhenOffline to the Manual form - This would prevent the button from being disabled while offline, but doesn't address the core problem of isLoading blocking submissions after reconnection.
Using a separate Onyx key for the form - This would decouple the form's isLoading state from the reimbursement account's loading state, but would be a larger refactor with broader implications.
Next Steps for Contributor+ team: Reply with @MelvinBot implement this to create a draft PR, or @MelvinBot <your feedback> to refine this analysis.
changed the title [-]Add bank account - Next button is unresponsive after going online on Manually add BA page[/-][+][$250] Add bank account - Next button is unresponsive after going online on Manually add BA page[/+]on Feb 24, 2026
Hi @mallenexpensify. While reading the contributing guide, I found this section PAYMENT_VIA_EXPENSIFY. My first assigned issue was #44506 (20 months ago). I think I'm now eligible for payment via expensify right?
@layacat this isn't the place to post that question. If you've been an active contributor for over 18 months, then we will reach out to you via email to get this set up for you. If you haven't heard from us after two weeks (~20 months-mark), please reach out via email. Please re-read the first paragraph of those guidelines. Thanks!
[Contributor] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to comment:
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion:
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal Template
[BugZero Assignee] Create a GH issue for creating/updating the regression test once above steps have been agreed upon.
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion: N/A
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Precondition:
Test:
Sign in to ND
Create a workspace
Open Workflows - Payments - Add bank account
Click "Connect manually", then Confirm
Enter routing and account numbers, go force offline - Next button is disabled
Activity
melvin-bot commentedon Feb 24, 2026
Triggered auto assignment to @johncschuster (
Bug), see https://stackoverflow.com/c/expensify/questions/14418 for more details. Please add this bug to a GH project, as outlined in the SO.MelvinBot commentedon Feb 24, 2026
Proposal
Please re-state the problem that we are trying to solve in this issue.
After entering routing and account numbers on the "Manually add your bank account" page, going force offline (Next button correctly disables) and then going force online, the Next button becomes unresponsive. The user remains stuck on the page and cannot proceed.
What is the root cause of that problem?
The root cause is a combination of two issues triggered by the offline-to-online transition:
1.
openReimbursementAccountPagesetsisLoading: trueon reconnection, which blocks form submission.When the network changes from offline to online,
ReimbursementAccountPage.tsx:293detects this and callsfetchData(true), which callsopenReimbursementAccountPage(). This READ command immediately (optimistically) setsisLoading: trueonONYXKEYS.REIMBURSEMENT_ACCOUNT(BankAccounts.ts:1027).2.
ONYXKEYS.REIMBURSEMENT_ACCOUNTandONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORMare the same Onyx key ('reimbursementAccount') (ONYXKEYS.ts:350andONYXKEYS.ts:900).This means when
isLoading: trueis set on the reimbursement account, it also becomesformState?.isLoadinginFormProvider. The submit function atFormProvider.tsx:238checksif (!!formState?.isLoading || isLoading) { return; }and silently blocks all clicks.Meanwhile, the page-level loading check at
ReimbursementAccountPage.tsx:495shows aReimbursementAccountLoadingIndicatorwhileisLoadingis true. When the READ response comes back and setsisLoading: false, the form re-renders. However, theSaveResponseInOnyxmiddleware (SaveResponseInOnyx.ts:38) may defer the response processing if it detects the client is behind on OnyxUpdates (common after reconnection), keepingisLoadingstuck attrueuntil the update gap is resolved.Additionally, the READ command waits for all pending WRITE commands via
waitForWrites()(API/index.ts:268) before firing, which can further delay the response if there are queued writes in the sequential queue.What changes do you think we should make in order to solve the problem?
Pass
shouldShowLoading: falsewhen callingopenReimbursementAccountPagefrom the offline-to-online reconnection handler. The form data is already loaded and visible to the user - there's no need to show a loading state just because we're refreshing data after reconnection.In
ReimbursementAccountPage.tsx, modifyfetchData()to accept a parameter that controls whether the loading indicator is shown, and pass it through toopenReimbursementAccountPage. Specifically:shouldShowLoadingparameter toopenReimbursementAccountPageinBankAccounts.ts(similar to howgetVBBADataForOnyxalready has ashouldShowLoadingparameter at line 176). Whenfalse, the optimistic data should not setisLoading: true.ReimbursementAccountPage.tsx:293-294, callfetchData(true)in a way that propagatesshouldShowLoading: falsetoopenReimbursementAccountPage.This keeps the form interactive while the background refresh happens, and the user can proceed with clicking Next without being blocked.
What alternative solutions did you explore? (Optional)
enabledWhenOfflineto the Manual form - This would prevent the button from being disabled while offline, but doesn't address the core problem ofisLoadingblocking submissions after reconnection.isLoadingstate from the reimbursement account's loading state, but would be a larger refactor with broader implications.Next Steps for Contributor+ team: Reply with
@MelvinBot implement thisto create a draft PR, or@MelvinBot <your feedback>to refine this analysis.melvin-bot commentedon Feb 24, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @hungvu193 (
External)[-]Add bank account - Next button is unresponsive after going online on Manually add BA page[/-][+][$250] Add bank account - Next button is unresponsive after going online on Manually add BA page[/+]melvin-bot commentedon Feb 24, 2026
Job added to Upwork: https://www.upwork.com/jobs/~022026441963143683545
hungvu193 commentedon Feb 25, 2026
@MelvinBot implement this
29 remaining items
melvin-bot commentedon Mar 23, 2026
Triggered auto assignment to @mallenexpensify (
Awaiting Payment)layacat commentedon Mar 23, 2026
Hi @mallenexpensify. While reading the contributing guide, I found this section PAYMENT_VIA_EXPENSIFY. My first assigned issue was #44506 (20 months ago). I think I'm now eligible for payment via expensify right?
johncschuster commentedon Mar 23, 2026
@layacat this isn't the place to post that question. If you've been an active contributor for over 18 months, then we will reach out to you via email to get this set up for you. If you haven't heard from us after two weeks (~20 months-mark), please reach out via email. Please re-read the first paragraph of those guidelines. Thanks!
johncschuster commentedon Mar 24, 2026
BugZero Checklist:
[Contributor] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to comment:
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion:
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal Template
[BugZero Assignee] Create a GH issue for creating/updating the regression test once above steps have been agreed upon.
Link to issue:
Regression Test Proposal
Precondition:
Test:
Do we agree 👍 or 👎
hungvu193 commentedon Mar 27, 2026
BugZero Checklist:
[Contributor] The offending PR has been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to comment: https://github.com/Expensify/App/pull/44902/changes#r3001699961
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion: N/A
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Precondition:
Test:
Do we agree 👍 or 👎
Zapier Logs
Run ID: 00040eee-ddbf-a1c8-46e1-27d76f516234johncschuster commentedon Mar 30, 2026
Payment Summary
twisterdotcom commentedon Mar 31, 2026
@hungvu193 has submitted payment for this report on ND here.
SO: https://stackoverflowteams.com/c/expensify/questions/7582
Zapier Logs
Run ID: 00040eee-63c7-a165-437e-635d7173eaf4