Skip to content

[$175] All - Empty "Check your info" page appears in RHP after adding BA to Wallet #104515

Open

Description

@applause-bot

If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.


Version Number: 9.5.15-1
Reproducible in staging?: Yes
Reproducible in production?: Yes
If this was caught during regression testing, add the test name, ID and link from BrowserStack: #103902
Email or phone of affected tester (no customers): fischer9966+102026+103902wmem2@gmail.com
Issue reported by: Applause Internal Team
Bug source: Pull Request QA execution
Device used: MacOS 26.6.2 / Chrome, safari. iPhone 17 Pro / 27.0.1. Google Pixel 5 / Android 14
App Component: User Settings

Action Performed:

Preconditions:

  1. Admin invite a member to workspace. Member should not be admin of any workspace.
  2. Admin go to OD: Workspace > Workflows > Enable 'Collect bank account details' and select United States only

Steps:

  1. Log in as member from precondition step 1/
  2. Go to Account > Wallet
  3. Click Add bank account
  4. Select United States > Next
  5. Enter Routing Number 011401533
  6. Enter Account Number 1234567890
  7. Fill in the rest fields
  8. Click on Next
  9. Verify that the meaningful error message is shown and there's no duplicate message
  10. BA added to Wallet after review info and confirm

Expected Result:

Meaningful error message about info Review is shown before confirm, no duplicate message. RHP closed and BA added to Wallet after Review and Confirm without any issues.

Actual Result:

BA added to Wallet. But the empty "Check your info" page appears in RHP after review and confirm information. RHP is not closed. Unexpected error message appears after click Confirm on the empty "Check your info" page.

Workaround:

Unknown

Platforms:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome Safari

Screenshots/Videos

Bug7291406_1792529722380.103902-Web.mp4
Bug7291406_1792529871394.103902-iOS.mp4
Bug7291406_1792530291028.103902-Android.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Chandana Kiran
Bug ID: 7291406

Upwork Automation - Do Not Edit

Activity

  1. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Oct 20, 2026
  2. MelvinBot commented on Oct 20, 2026

    @MelvinBot
    Contributor

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    After a member adds a bank account through the Collect Deposit Account flow, the RHP doesn't close. Instead, an empty "Check your info" page appears, and clicking Confirm on it shows an error.

    What is the root cause of that problem?

    Each step of the flow is pushed as its own screen, so the RHP stack is Country → Details → Confirm → Success. When the account is created, Confirmation moves to Success and clears the form draft. The Confirm screen stays mounted underneath with blank values.

    On Success, Continue (and the back button) calls goBack() in CollectDepositAccount/index.tsx:58-61. That runs a bare Navigation.goBack(), which removes only the Success screen and reveals the stale, empty Confirm screen. Clicking Confirm there submits empty values, so the backend rejects it with the generic walletPage.addBankAccountFailure error.

    This regressed in Add a time sensitive task for setting up a deposit account, which changed Navigation.goBack(ROUTES.SETTINGS_WALLET) to Navigation.goBack() so the flow could also open from Home. Surface verification error in Collect Deposit Account flow only exposed the bug during QA. It didn't cause it.

    Code references

    What changes do you think we should make in order to solve the problem?

    In CollectDepositAccount/index.tsx, close the whole flow when the user leaves Success:

    1. Add a finishFlow handler that clears the draft and calls Navigation.closeRHPFlow(). Other sub-page flows already use this pattern, for example MissingPersonalDetailsContent.
    2. Use finishFlow as onFinished and in handleBackButtonPress when pageIndex === SUCCESS.
    3. Keep the bare goBack() for the back button on the Country step.
    4. Add a test that completes the flow, presses Continue on Success, and checks that the RHP closes.

    What alternative solutions did you explore? (Optional)

    • Restore goBack(ROUTES.SETTINGS_WALLET): this fixes the Wallet entry point but sends users who started from Home to Wallet.
    • Set shouldReplaceRoute: true in useSubPage: this keeps a single screen in the stack, but it changes how editing and going back to Confirm work, so it needs more testing.
    Confidence and open questions

    Confidence: High from code reading. I didn't reproduce the bug in the app, because it needs an OldDot workspace with "Collect bank account details" enabled.

    • When the flow opens from BankAccountPurposePage, another RHP screen sits before it. Check that closeRHPFlow gives the intended result there.
    • I didn't verify whether the GIACT warning response also sets shouldShowSuccess. If it does, dismissing the warning could fire the success effect early. That would be a separate edge case.

    Next Steps for Contributor+ team:
    To accept: @MelvinBot implement [this](https://github.com/Expensify/App/issues/104515) to create a draft PR.
    To refine: @MelvinBot <your feedback>
    To reject: Explain why you are rejecting Melvin's proposal.


    view run

  3. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Oct 20, 2026
  4. melvin-bot commented on Oct 20, 2026

    @melvin-bot

    Triggered auto assignment to Contributor-plus team member for initial proposal review - @brunovjk (External)

  5. changed the title [-]All - Empty "Check your info" page appears in RHP after adding BA to Wallet[/-] [+][$175] All - Empty "Check your info" page appears in RHP after adding BA to Wallet[/+] on Oct 20, 2026
  6. melvin-bot commented on Oct 20, 2026

    @melvin-bot
  7. juni2003 commented on Oct 20, 2026

    @juni2003

    Contributor details
    Your Expensify account email: juni.xatti@gmail.com
    Upwork Profile Link: https://www.upwork.com/freelancers/~01867ae3203c9b7815?mp_source=share

    Proposal

    Please re-state the problem that we are trying to solve in this issue.
    After successfully adding a bank account via the Collect Deposit Account flow, tapping "Continue" (or the back button) on the Success screen drops the user onto a stale, blank "Check your info" screen instead of closing the Right-Hand Panel (RHP) flow.

    What is the root cause of that problem?
    The root cause is a Navigation stack management bug in the useSubPage flow configuration.

    1. The CollectDepositAccount flow pushes each sub-step (Country -> Details -> Confirm -> Success) onto the RHP navigation stack independently.
    2. In src/pages/workspace/accounting/CollectDepositAccount/index.tsx (lines 58-61), the onFinished callback executes a bare Navigation.goBack().
    3. Because the stack has multiple screens in it, Navigation.goBack() only pops the Success screen off the top of the stack. This drops the user right back onto the Confirm screen.
    4. Because the successful submission explicitly clears the ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM_DRAFT state upon reaching the Success screen, the Confirm screen now renders with completely blank values. Clicking Confirm submits empty data, causing the generic addBankAccountFailure backend error.

    What changes do you think we should make in order to solve the problem?
    We must use Expensify's global RHP dismissal method instead of a localized goBack() when terminating a completed multi-step flow.

    In src/pages/workspace/accounting/CollectDepositAccount/index.tsx, update the goBack handler to completely dismiss the modal stack when finishing the flow, rather than just popping the top screen.

    // src/pages/workspace/accounting/CollectDepositAccount/index.tsx
    
        const goBack = () => {
            if (pageIndex === CONST.COLLECT_DEPOSIT_ACCOUNT_PAGE.COUNTRY) {
                Navigation.goBack();
            } else if (pageIndex === CONST.COLLECT_DEPOSIT_ACCOUNT_PAGE.SUCCESS) {
                // Dismiss the entire RHP flow from the Success screen
                Navigation.dismissModal();
            } else {
                handleBackButtonPress();
            }
        };

    (Ensure handleBackButtonPress from useSubPage is still used for intermediate steps so users can navigate backward during data entry).

    What alternative solutions did you explore? (Optional)
    MelvinBot suggested manually calling Navigation.closeRHPFlow() and manually clearing drafts inside onFinished. I rejected this because Navigation.dismissModal() is the canonical Expensify standard for terminating complete wizard flows (like Onboarding or Workspace Creation) as it correctly handles the modal unmount animation and state cleanup universally, regardless of whether the user entered from the Wallet page or the Home tab.

  8. melvin-bot commented on Oct 20, 2026

    @melvin-bot

    ✅ Contributor details stored successfully. Thank you for contributing to Expensify!

  9. camesenin commented on Oct 20, 2026

    @camesenin

    Contributor details
    Your Expensify account email: camesenin@gmail.com
    Upwork Profile Link: https://www.upwork.com/freelancers/~0170d6b02e9440e604

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    In the Collect Deposit Account flow (adding a Bank Account to Wallet as a non-admin workspace member), after reviewing and confirming bank account information, the RHP fails to dismiss. Instead, a blank "Check your info" page appears and tapping Confirm results in an unexpected failure.

    What is the root cause of that problem?

    In src/pages/settings/Wallet/CollectDepositAccount/index.tsx:

    1. The sub-pages in this flow (Country -> Details -> Confirmation -> Success) are pushed sequentially onto the RHP stack via useSubPage.
    2. Upon successful bank account creation, Confirmation.tsx transitions to Success and immediately clears the form draft from Onyx.
    3. In CollectDepositAccount/index.tsx:58-61 and lines 100-104:
      onFinished={() => Navigation.goBack()}
      When the user taps "Continue" on the Success sub-page, it triggers onFinished(), which executes a bare Navigation.goBack().
    4. Navigation.goBack() only pops the topmost Success screen from the RHP stack, revealing the stale Confirmation screen underneath. Because the draft was already cleared, the Confirmation screen renders blank fields.
    5. Tapping "Confirm" on this stale screen attempts to submit empty form values, which the backend rejects with walletPage.addBankAccountFailure.

    What changes do you think we should make in order to solve the problem?

    1. Close the entire RHP flow upon leaving the Success step:
      In src/pages/settings/Wallet/CollectDepositAccount/index.tsx:
      Define a finishFlow handler:
      const finishFlow = useCallback(() => {
          clearDraftValues();
          Navigation.closeRHPFlow();
      }, [clearDraftValues]);
      • Use finishFlow as onFinished in useSubPage.
      • In handleBackButtonPress, if pageIndex === CONST.COLLECT_DEPOSIT_ACCOUNT.STEP.SUCCESS, call finishFlow() instead of popping to the stale confirmation view.
      • Retain standard Navigation.goBack() for the initial Country step so users can smoothly return to Wallet or Home.
    • Why this solution is optimal: Navigation.closeRHPFlow() is the standard pattern used across all multi-step RHP onboarding workflows (such as MissingPersonalDetailsContent), ensuring the entire sub-page stack is dismissed cleanly regardless of entry point (Wallet or Home time-sensitive task).

    Proof of Concept (Reproduction Demo)

    What specific scenarios should we cover in automated tests?

    In tests/unit/CollectDepositAccountTest.tsx:

    • Simulate completing the deposit account flow up to the Success sub-page.
    • Assert that tapping "Continue" on the Success page calls Navigation.closeRHPFlow and does not reveal the underlying Confirmation step.
  10. melvin-bot commented on Oct 20, 2026

    @melvin-bot

    ✅ Contributor details stored successfully. Thank you for contributing to Expensify!

  11. khizzcr7 commented on Oct 21, 2026

    @khizzcr7

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    After a member adds a bank account through the Collect Deposit Account flow, the RHP does not close. Instead, an empty "Check your info" page appears, and tapping Confirm on it shows an unexpected error.

    What is the root cause of that problem?

    1. Each step of the flow (Country -> Details -> Confirm -> Success) is pushed as its own RHP screen via useSubPage (src/hooks/useSubPage/index.tsx:38-44).
    2. On Success, Continue (and the back button) runs onFinished, which is the goBack handler in src/pages/settings/Wallet/CollectDepositAccount/index.tsx:58-61:
      const goBack = () => {
          clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
          Navigation.goBack();
      };
      The bare Navigation.goBack() pops only the Success screen and reveals the stale, empty Confirm screen underneath (its draft was cleared when transitioning to Success in Confirmation.tsx:46-53).
    3. Confirming on the stale screen submits empty values, so the backend rejects it with the generic walletPage.addBankAccountFailure error.
    4. This regressed in PR Add a time sensitive task for setting up a deposit account #100059, which changed Navigation.goBack(ROUTES.SETTINGS_WALLET) to Navigation.goBack() so the flow can also open from Home. PR Surface verification error in Collect Deposit Account flow #103902 only exposed the bug during QA.

    What changes do you think we should make in order to solve the problem?

    Close the whole flow when the user leaves Success:

    1. Add a finishFlow handler that clears the draft and calls Navigation.closeRHPFlow() (exported at src/libs/Navigation/Navigation.ts:1321; the same pattern other sub-page flows like MissingPersonalDetailsContent use).
    2. Use finishFlow as onFinished and in handleBackButtonPress when pageIndex === SUCCESS.
    3. Keep the bare goBack() for the back button on the Country step.
    4. Verify the edge case where the flow opens from BankAccountPurposePage (another RHP screen sits before it) so closeRHPFlow lands on the intended screen.

    Tests: complete the flow, press Continue on Success, assert the RHP closes and no stale Confirm screen is reachable; assert the back button on the Country step still goes back one screen.

  12. jloa-dev commented on Oct 21, 2026

    @jloa-dev

    Contributor details
    Your Expensify account email: jloa.dev@gmail.com
    Upwork Profile Link: https://www.upwork.com/freelancers/~0163955a2ba221e513

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    In the Collect Deposit Account flow (adding a Bank Account to Wallet as a non-admin workspace member), after reviewing and confirming bank account information, the RHP fails to dismiss. Instead, an empty "Check your info" page appears and tapping Confirm results in an unexpected error.

    What is the root cause of that problem?

    1. In src/pages/settings/Wallet/CollectDepositAccount/index.tsx, useSubPage configures the sub-page navigation:
      • By default, shouldReplaceRoute is false, so each step (Country -> Details -> Confirmation -> Success) pushes a new screen instance onto the modal navigation stack via Navigation.navigate().
      • When the user confirms their information on Confirmation.tsx, personalBankAccount.shouldShowSuccess becomes true. Confirmation.tsx calls onNext() (which advances to Success) and immediately calls clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM) to clean up the draft data from Onyx.
    2. On the Success screen, tapping "Continue" (or the back button) invokes onFinished, which triggers goBack() in CollectDepositAccount/index.tsx:
      const goBack = () => {
          clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
          Navigation.goBack();
      };
    3. A single Navigation.goBack() only pops the Success screen off the navigation stack, exposing the Confirmation screen that is still sitting underneath it in the stack.
    4. Because the draft values were already cleared upon advancing to Success, the exposed Confirmation screen renders with empty values (showing the blank "Check your info" header without any fields).
    5. If the user taps "Confirm" again on this blank screen, it submits empty parameters, causing the backend to fail and display walletPage.addBankAccountFailure.

    What alternative solutions did you explore? (Optional)

    None, ensuring modal dismissal via Navigation.dismissModal() and enabling route replacement via shouldReplaceRoute: true aligns this flow with standard Expensify RHP patterns.

    What changes do you think we should make in order to solve the problem?

    In src/pages/settings/Wallet/CollectDepositAccount/index.tsx:

    1. Use Navigation.dismissModal() when dismissing/finishing the flow instead of a single Navigation.goBack().
    2. Set shouldReplaceRoute: true in useSubPage options so intermediate subpages replace each other in place rather than stacking up in navigation history:
    --- a/src/pages/settings/Wallet/CollectDepositAccount/index.tsx
    +++ b/src/pages/settings/Wallet/CollectDepositAccount/index.tsx
    @@ -58,7 +58,7 @@ function CollectDepositAccount() {
         const goBack = () => {
             clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
    -        Navigation.goBack();
    +        Navigation.dismissModal();
         };
     
         const {CurrentPage, isEditing, nextPage, prevPage, pageIndex, moveTo, isRedirecting} = useSubPage<CustomSubPageProps>({
    @@ -66,6 +66,7 @@ function CollectDepositAccount() {
             startFrom: STEP_INDEXES.COUNTRY_SELECTOR,
             onFinished: goBack,
    +        shouldReplaceRoute: true,
             buildRoute: (pageName, action) => ROUTES.SETTINGS_COLLECT_DEPOSIT_ACCOUNT.getRoute(pageName, action),
         });

    What automated tests can you add to prevent this from re-occurring?

    Add a unit test in tests/unit/pages/CollectDepositAccountTest.tsx verifying that:

    1. Advancing through CollectDepositAccount replaces subpage routes without stacking multiple instances.
    2. Invoking onFinished on the Success page invokes Navigation.dismissModal(), cleanly closing the entire RHP.
  13. melvin-bot commented on Oct 21, 2026

    @melvin-bot

    ✅ Contributor details stored successfully. Thank you for contributing to Expensify!

  14. melvin-bot commented on Oct 21, 2026

    @melvin-bot

    ✅ Contributor details stored successfully. Thank you for contributing to Expensify!

  15. emkhalid commented on Oct 21, 2026

    @emkhalid
    Contributor

    @brunovjk I was able to successfully reproduce this issue and test the fix locally. Before you review Melvin’s proposal, please note that Melvin's proposed solution actually does not work and leaves the bug intact.

    Why Melvin's solution is not correct:

    Melvin suggests using Navigation.closeRHPFlow() to exit the flow. However, when multiple sub-pages are pushed onto the RHP stack (as useSubPage does here: Country → Details → Confirm → Success), closeRHPFlow() detects that routes.length > 1 and only executes a single StackActions.pop().

    This means closeRHPFlow() only pops the Success screen—leaving the user right back on the blank "Check your info" screen, exactly like goBack() does.

    • MelvinFix:
    melvinproposal.101545.webm

    The correct fix:

    Instead of closeRHPFlow(), we need to dismiss the modal stack using Navigation.dismissModal() when finishing or backing out of the Success screen, while preserving standard back navigation (Navigation.goBack()) on the initial Country step. This cleanly closes the RHP regardless of how many steps were pushed and works seamlessly across all entry points (Wallet, Home task, or Admin purpose selection).

    Demo Videos

    • Reproduction:
    ReproDemo104515.webm
    • Fix Verification:
    FixDemo104515.webm

    Would you like me to post the full proposal with the exact code changes and verified steps?

  16. RajGahoi commented on Oct 21, 2026

    @RajGahoi

    Contributor details
    Your Expensify account email: gahoiraj01@gmail.com
    Upwork Profile Link: https://www.upwork.com/freelancers/~014898525b9c53fc32

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    After adding a bank account in the Collect Deposit Account flow, the Right Hand Pane (RHP) does not close. Instead, an empty "Check your info" page appears with a blank form, and clicking "Confirm" triggers an unexpected error message.

    What is the root cause of that problem?

    In src/pages/settings/Wallet/CollectDepositAccount/index.tsx:

    const goBack = () => {
        clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
        Navigation.goBack();
    };
    
    const {CurrentPage, isEditing, nextPage, prevPage, pageIndex, moveTo, isRedirecting} = useSubPage<CustomSubPageProps>({
        pages,
        startFrom: STEP_INDEXES.COUNTRY_SELECTOR,
        onFinished: goBack,
        buildRoute: (pageName, action) => ROUTES.SETTINGS_COLLECT_DEPOSIT_ACCOUNT.getRoute(pageName, action),
    });
    1. Each step in the Collect Deposit Account flow is pushed as an individual route on the navigation stack:
      CountrySelection → BankAccountDetails → Confirmation → Success.
    2. When the bank account is successfully created in Confirmation.tsx:
      clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
      clearPersonalBankAccount();
      The draft form values are wiped clean, and the user navigates forward to Success.
    3. When the user taps "Continue" on the Success screen (or uses the header back button while on Success), onFinished: goBack executes Navigation.goBack().
    4. A standard Navigation.goBack() only pops the top screen on the stack (Success).
    5. Beneath Success on the stack sits the prior Confirmation screen ("Check your info").
    6. Because the draft values were already cleared upon successful account creation, Confirmation re-renders with completely empty fields. Clicking "Confirm" submits empty payload parameters, triggering an API error.
    7. Furthermore, using Navigation.closeRHPFlow() inside goBack also fails because when multiple sub-pages are pushed into the RHP stack, closeRHPFlow only executes StackActions.pop(), once again revealing the previous sub-page instead of exiting the entire modal.

    What changes do you think we should make in order to solve the problem?

    1. In src/pages/settings/Wallet/CollectDepositAccount/index.tsx:
      • When completing or exiting from Success, dismiss the modal entirely using Navigation.dismissModal().
      • Keep Navigation.goBack() for exiting from the initial CountrySelection step so normal back navigation is preserved when the user cancels out of the flow before starting.
    --- a/src/pages/settings/Wallet/CollectDepositAccount/index.tsx
    +++ b/src/pages/settings/Wallet/CollectDepositAccount/index.tsx
    @@ -58,7 +58,11 @@ function CollectDepositAccount() {
     
         const goBack = () => {
             clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
    -        Navigation.goBack();
    +        if (pageIndex === STEP_INDEXES.SUCCESS) {
    +            Navigation.dismissModal();
    +        } else {
    +            Navigation.goBack();
    +        }
         };
     
         const {CurrentPage, isEditing, nextPage, prevPage, pageIndex, moveTo, isRedirecting} = useSubPage<CustomSubPageProps>({
    1. Defense-in-depth on Confirmation.tsx / shouldReturnToCountryStep:
      Ensure that if the Confirmation screen is ever mounted or re-focused without draft details (for example via browser navigation or deep linking after completion), it automatically redirects back to CountrySelection rather than rendering an empty form:
    --- a/src/pages/settings/Wallet/CollectDepositAccount/index.tsx
    +++ b/src/pages/settings/Wallet/CollectDepositAccount/index.tsx
    @@ -82,7 +82,7 @@ function CollectDepositAccount() {
         // The drafted currency can stop being one the country collects, if a policy change flips the fields from
         // international to local. There is then nothing to fill in, so later steps would submit an empty account.
         // Success is exempt because the draft is cleared once the account exists.
    -    const shouldReturnToCountryStep = isEmptyObject(fieldsMap) && pageIndex !== STEP_INDEXES.COUNTRY_SELECTOR && pageIndex !== STEP_INDEXES.SUCCESS;
    +    const shouldReturnToCountryStep = (!bankCountry || isEmptyObject(fieldsMap)) && pageIndex !== STEP_INDEXES.COUNTRY_SELECTOR && pageIndex !== STEP_INDEXES.SUCCESS;

    What specific scenarios should we cover in automated tests to prevent reintroduction of this issue in the future?

    In tests/unit/CollectDepositAccountTest.tsx:

    1. Advance through Country → Details → Confirmation → Success.
    2. Tap "Continue" on the Success screen. Verify that Navigation.dismissModal is called and no intermediate sub-pages (/confirm, /details) remain open in the RHP.
    3. Verify that pressing the Android back button or header back button on Success dismisses the modal rather than stepping backward to Confirmation.
    4. Verify that pressing Back on the first CountrySelection step calls Navigation.goBack() without dismissing external screens.

    What alternative solutions did you explore? (Optional)

    • Using Navigation.closeRHPFlow() was explored, but as noted, closeRHPFlow() only executes a single pop if other routes exist in the stack, which does not close multi-step sub-page flows.
    • Replacing routes via shouldReplaceRoute: true in useSubPage was explored, but that disables normal backward navigation between Country and Details during editing. Dismissing the modal on completion while keeping step navigation intact is the standard architecture across Expensify RHP flows.
  17. melvin-bot commented on Oct 21, 2026

    @melvin-bot

    ✅ Contributor details stored successfully. Thank you for contributing to Expensify!

  18. emkhalid commented on Oct 21, 2026

    @emkhalid
    Contributor

    Hi @juni2003 @camesenin @khizzcr7 @jloa-dev @Mannerless @RajGahoi thanks for your interest in contributing to Expensify!

    If you're human contributors and not automation bots, please read the Contributing Guidelines and wait for the Help Wanted label before posting proposals.

    4. Proposals must only be posted after the `Help Wanted` label is added. Any proposals submitted beforehand will be ignored and not reviewed. Do not post proposals in Slack. MelvinBot is an exception: it may post a proposal before `Help Wanted` is applied.

    Since you're new to the repo, I'd recommend going through the Contributing Guidelines before your next proposal.

    You can find issues actually open for proposals here:
    https://github.com/Expensify/App/issues?q=is%3Aissue+state%3Aopen+label%3A%22Help+Wanted%22

  19. juni2003 commented on Oct 21, 2026

    @juni2003

    Thanks for pointing that out, @emkhalid! I had read CONTRIBUTING.md but misunderstood and assumed the External label was the trigger to submit. I appreciate the clarification and will wait for the Help Wanted label on all future issues. Thanks again!

  20. brunovjk commented on Oct 22, 2026

    @brunovjk
    Contributor

    I can no longer reproduce the bug. @emkhalid, are you able to? Thanks.

  21. emkhalid commented on Oct 22, 2026

    @emkhalid
    Contributor

    @brunovjk , I was still able to reproduce the issue on my end. Here is the reproduction video:

    ReproDemo.webm

    Could you please double-check under these exact preconditions? If any of these are missing, the app diverts to a completely different bank account flow where the bug does not trigger .

    Preconditions:

    1. User Role: Must be logged in as a member who is not an admin of any workspace
    2. OldDot Workspace Setting: In OldDot, the admin must go to Workspace > Workflows > Enable "Collect bank account details" and select United States only.

    Reproduction Steps:

    1. Log in as the member from the preconditions.
    2. Go to Account Settings > Wallet.
    3. Click Add bank account (opens the Collect Deposit Account flow).
    4. Select United States > click Next.
    5. Fill in the required bank details and click Next.
    6. On the "Check your info" confirmation page, click Confirm.
    7. Once the "Personal bank account added!" success page appears, click Continue (or the back button).
    8. Observe: The RHP does not close; instead, an empty "Check your info" page appears. Clicking Confirm on that empty page triggers an unexpected error banner.

    Please let me know if you are able to reproduce it with these preconditions.

  22. brunovjk commented on Oct 26, 2026

    @brunovjk
    Contributor

    Thanks @emkhalid! Your finding about closeRHPFlow() is correct: with multiple routes in the RHP stack, it only pops one screen and would leave the original issue unresolved.
    While reviewing the current code, I noticed that #104434 introduced shouldReplaceRoute: true and Navigation.goBack(basePath) in this flow. These changes appear to address the original navigation issue. That PR reached production in 9.5.18-1 on October 23, after your latest reproduction report. Can you still reproduce it? Thanks for the hard work.

  23. emkhalid commented on Oct 26, 2026

    @emkhalid
    Contributor

    27. Thanks @emkhalid! Your finding about closeRHPFlow() is correct: with multiple routes in the RHP stack, it only pops one screen and would leave the original issue unresolved.
    While reviewing the current code, I noticed that #104434 introduced shouldReplaceRoute: true and Navigation.goBack(basePath) in this flow. These changes appear to address the original navigation issue. That PR reached production in 9.5.18-1 on October 23, after your latest reproduction report. Can you still reproduce it? Thanks for the hard work.

    On it, thanks!

  24. emkhalid commented on Oct 27, 2026

    @emkhalid
    Contributor

    @brunovjk I can no longer reproduce this issue, it seems to be fixed as you said, thanks!

  25. brunovjk commented on Oct 27, 2026

    @brunovjk
    Contributor

    Thanks a lot @emkhalid. I also can no longer reproduce. Asked for help here.

  26. Kabeer099 commented on Oct 29, 2026

    @Kabeer099

    Proposal

    Please re-state the problem that we are trying to solve in this issue.

    After a workspace member adds a bank account through the Collect Deposit Account flow (Account > Wallet > Add bank account), the RHP does not close upon completion. Instead, an empty "Check your info" (Confirmation) page appears in the RHP, and clicking Confirm on that empty screen shows an unexpected error message.

    What is the root cause of that problem?

    1. In src/pages/settings/Wallet/CollectDepositAccount/index.tsx (lines 58-67), useSubPage pushes each step (Country -> BankAccountDetails -> Confirmation -> Success) as a separate screen onto the RHP stack (shouldReplaceRoute defaults to false in src/hooks/useSubPage/index.tsx:38-44).
    2. When the bank account is created on Confirmation.tsx (lines 46-53), it advances to Success (onNext()) and immediately clears the draft form values (clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM)), leaving the mounted Confirmation screen underneath with empty form values.
    3. On the Success step (CollectDepositAccount/index.tsx:58-61), tapping Continue (or the back button) invokes onFinished (goBack):
      const goBack = () => {
          clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
          Navigation.goBack();
      };
      Because Navigation.goBack() is called without a target route or modal dismissal, it only pops the topmost Success screen off the RHP stack, exposing the cleared, empty Confirmation ("Check your info") screen underneath! Submitting that empty screen sends blank values to the backend, triggering walletPage.addBankAccountFailure.

    What changes do you think we should make in order to solve the problem?

    In src/pages/settings/Wallet/CollectDepositAccount/index.tsx (lines 58-61):

    1. When finishing the flow (onFinished) from Success (or closing the flow), dismiss the entire RHP flow via Navigation.closeRHPFlow() (or Navigation.dismissModal()) instead of calling a bare Navigation.goBack():
      const finishFlow = () => {
          clearDraftValues(ONYXKEYS.FORMS.COLLECT_DEPOSIT_ACCOUNT_FORM);
          Navigation.closeRHPFlow();
      };
    2. Pass onFinished: finishFlow to useSubPage so completing the Success step cleanly closes the entire Collect Deposit Account RHP stack whether the flow was launched from Account > Wallet or from the Home page task.

    What alternative solutions did you explore? (Optional)

    We also considered passing shouldReplaceRoute: true when transitioning from Confirmation to Success, but Country and BankAccountDetails would still remain underneath Success in the RHP stack unless Navigation.closeRHPFlow() is used on finish.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

BugSomething is broken. Auto assigns a BugZero manager.DailyKSv2ExternalAdded to denote the issue can be worked on by a contributor

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions