Skip to content

[Due for payment 2026-11-10] [$175] [Exploratory] Navigation - App keeps on loading when opening expense from email #100682

Closed

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.4.74-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/test-runs/72925117/folder/54013402/41237079/1738376027
Email or phone of affected tester (no customers): emady.syed1234+bhangra@gmail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Realme C21Y / Android 11
App Component: Chat Report View

Action Performed:

Precondition: Signed out of New Expensify.

  1. Put the device in offline mode.
  2. Open a magic link carrying exitTo, either by tapping an action link in an Expensify email or with: https://new.expensify.com/v/<accountID>/123456?exitTo=/r/<reportID>
  3. Wait 30 seconds.

Expected Result:

An offline message, the sign in page, or at minimum "This is taking longer than expected..." with a Go back button after 10 seconds.

Actual Result:

A bare centered spinner on an empty screen. No header, no error, no Go back button. The app stays unusable until the network returns.

Workaround:

Unknown

Platforms:

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

Screenshots/Videos

bug.mov

View all open jobs on GitHub

Applause Internal Information
Exported by: Julia Ponikarchuk
Bug ID: 7254670

Issue OwnerCurrent Issue Owner: @mallenexpensify
Upwork Automation - Do Not Edit

Activity

  1. applause-bot commented on Sep 9, 2026

    @applause-bot
    Author

    While Applause doesn't embed attachments for this bug, here are the links for quick view:
    https://platform.applause.com/services/links/v1/external/b238bf30ac9b96db288b490494d0973d6cd7880c0c3924630f7a83f345eada0d

  2. changed the title [-][Exploratory] Navigation- App keeps on loading when opening expense from email[/-] [+][Exploratory] Navigation - App keeps on loading when opening expense from email[/+] on Sep 9, 2026
  3. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Sep 24, 2026
  4. MelvinBot commented on Sep 24, 2026

    @MelvinBot
    Contributor

    Proposal

    What is the root cause of that problem?

    The expense report screen has a loading gate with no exit condition. It shows a skeleton whenever an expense report has a non-zero total but zero transactions in Onyx — with no timeout, no retry, and no error state.

    src/libs/MoneyRequestReportUtils.ts:163:

    const isStillLoadingData = transactions?.length === 0 && ((isReportLoadPending && !reportLoadingState?.hasOnceLoadedReportActions) || report?.total !== 0 || hasPendingDismissWrite);

    The report?.total !== 0 term is not tied to any in-flight request. Once it's true, the only way out is transactions arriving, the user going offline, or the total becoming 0.

    That exactly matches the repro. The WS owner already has the report row (with its total) from OpenApp, but not its transactions — those only arrive with OpenReport. Tapping the email link resumes the backgrounded app straight into /r/<reportID>. If that OpenReport never fires or its response never lands, src/pages/inbox/ReportActions.tsx:72 returns the skeleton forever. The report in this repro has two transactions, so total !== 0 is guaranteed.

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

    1. Make the gate request-driven, not total-driven. In shouldWaitForTransactions, only treat "no transactions yet" as loading while an OpenReport for that report is actually pending. Drop report?.total !== 0 as a standalone reason to wait, or pair it with the loading flag the way the first term already is.
    2. Add a bounded fallback. If transactions still haven't arrived after the request settles, render the report with an empty/error state rather than an indefinite skeleton. The same gate is used by src/components/MoneyRequestReportView/MoneyRequestReportView.tsx:156-158, so both call sites are covered by fixing the util.

    Regression coverage should assert that an expense report with total !== 0 and no transactions stops showing the skeleton once its OpenReport has resolved.

    Investigation details, alternatives considered, and what would confirm this

    Confidence: medium. The unbounded gate is confirmed in code and was byte-identical in the reported build (9.4.74-0 = 40f2e907). What is not confirmed is whether OpenReport fails to fire on the warm deep-link path or fires and returns without transactions.

    What would settle it: check whether an OpenReport request for that reportID was sent from the affected account right after the tap.

    • No request → the warm deep link never reached the fetch effect, and the navigation path is also at fault.
    • Request returned 200 → the response carried no transactions (or Onyx never merged them), and the gate above is the sole latch.

    There is also a [OpenReportStall] alert at src/pages/inbox/ReportFetchHandler.tsx:501-505 that fires after 30s when the loading flag never clears. Note it will not fire for this case if OpenReport succeeded — its absence is itself a signal.

    Alternatives ruled out:

    Separate defect found along the way (not this bug, worth its own issue): setInitialURL in src/components/InitialURLContextProvider.tsx:40-47 has no external callers, so initialURL is a mount-time-only snapshot that is never refreshed for a warm onNewIntent link. Combined with src/libs/SessionUtils.ts:11-41, where isLoggingInAsNewUser(undefined, email) returns true, a stale snapshot can sign a valid session out. The symptom there is a sign-out, not a hang, so it isn't this issue.

    Possibly related issues:


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


    view run

  5. added
    ExternalAdded to denote the issue can be worked on by a contributor
    on Sep 24, 2026
  6. melvin-bot commented on Sep 24, 2026

    @melvin-bot

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

  7. melvin-bot commented on Sep 24, 2026

    @melvin-bot

    Unable to auto-create job on Upwork. The BZ team member should create it manually for this issue.

  8. 50 remaining items

  9. added
    Awaiting PaymentAuto-added when associated PR is deployed to production
    and removed on Nov 9, 2026
  10. melvin-bot commented on Nov 9, 2026

    @melvin-bot

    Triggered auto assignment to @mallenexpensify (Awaiting Payment)

  11. melvin-bot commented on Nov 9, 2026

    @melvin-bot

    Payment Summary

    Resolving PRs:

    BugZero Checklist (@mallenexpensify)

    • I have confirmed assignees, roles, and Upwork contracts look correct
    • I have paid out Upwork contracts / manual NewDot requests
    • [BugZero Assignee] I have created a GH issue for creating/updating the regression test once above steps have been agreed upon
  12. melvin-bot commented on Nov 12, 2026

    @melvin-bot

    @mallenexpensify Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!

  13. mallenexpensify commented on Nov 13, 2026

    @mallenexpensify
    Contributor

    Payment Summary

    Contributor+: @mkhutornyi due $175 via NewDot

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

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionBugSomething is broken. Auto assigns a BugZero manager.DailyKSv2ExternalAdded to denote the issue can be worked on by a contributorNot a priority

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions