Skip to content

[Due for payment 2026-10-26] Android & iOS - Spend - No skeleton loader when loading #104277

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.5.13-0
Reproducible in staging?: Yes
Reproducible in production?: No
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/79083052/folder/57529651/41237503/1869288954?q=spend&issue_type=jira&sort=-identifier
Email or phone of affected tester (no customers): [email protected]
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Samsung Galaxy S25 FE / Android 16
App Component: Search

Action Performed:

  1. Launch Expensify app.
  2. Go offline.
  3. Go to Account > Troubleshoot > Clear cache and restart > Reset and refresh.
  4. Go to Spend > Expenses.
  5. Go online.

Expected Result:

Skeleton loader will be shown when Spend tab is loading.

Actual Result:

Skeleton loader is not shown when Spend tab is loading.

Workaround:

Unknown

Platforms:

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

Screenshots/Videos

Bug7288186_1792161456344.Screen_Recording_20261016_223505_Expensify.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Svetlana Lazutkina
Bug ID: 7288186

Issue OwnerCurrent Issue Owner: @ZhenjaHorbach

Activity

  1. added
    DeployBlockerCashThis issue or pull request should block deployment
    BugSomething is broken. Auto assigns a BugZero manager.
    on Oct 16, 2026
  2. applause-bot commented on Oct 16, 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/f71d5c7dd43f427102bf34dfaeed63a51bd3834c810dba6c1388f693bfcaa181

  3. melvin-bot commented on Oct 16, 2026

    @melvin-bot

    Triggered auto assignment to @arosiclair (DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.

  4. github-actions commented on Oct 16, 2026

    @github-actions
    Contributor

    👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:

    1. Identify the pull request that introduced this issue and revert it.
    2. Find someone who can quickly fix the issue.
    3. Fix the issue yourself.
  5. melvin-bot commented on Oct 16, 2026

    @melvin-bot

    💬 A slack conversation has been started in #expensify-open-source

  6. MelvinBot commented on Oct 16, 2026

    @MelvinBot
    Contributor

    Deploy Blocker Investigation

    Causing PR: Add liquid glass bottom tab bar to iOS, Android and mWeb (author sumo-slonik, merged 2026-10-15, included in 9.5.13-0).

    Classification: Frontend bug in Expensify/App.

    Recommendation: Fix forward. Don't revert, and keep this as a blocker. The PR touches 95 files and already has a fix-forward CP in flight: [CP Staging] Fix liquid glass bottom tab bar issues. Demote only if no fix is ready in time. There's no data loss.

    Confidence: High, based on code reading only. I didn't test on a device, because this bug only affects native apps.

    Root cause: The new native tab navigator builds the Spend tab at app startup, before the user opens it. Production only built it when opened. A Spend page built in the background starts in "static rendering" mode, and that mode skips the page-level loading skeleton. After Reset and refresh there are no cached results. Once you open Spend and go online, the list mounts with no data, the offline message disappears, and nothing shows until results arrive.

    Suggested fix: In static mode, show SearchLoadingSkeleton when shouldShowLoadingSkeleton is true, the same way non-static mode already does. Then confirm the submit-expense deferred-write flow still works.

    Investigation details
    1. Production used a lazy JS tab navigator (TabNavigator.native.tsx:43). Staging uses createNativeBottomTabNavigator, which builds every tab at startup (TabNavigator.native.tsx:31, useHasTabBeenShown.ts:23-27).
    2. If the page isn't focused when it's built, it picks static rendering (SearchPageNarrow/index.tsx:190-195). That mode was meant for the post-submit flow, where results already exist.
    3. The page works out shouldShowLoadingSkeleton (SearchPageNarrow/index.tsx:96) but only uses it when static rendering is off (L384-385). With static rendering on, once the tab is focused, <Search> mounts whether or not data has arrived (L344-359). The SearchRowSkeleton the PR added (L360-365) only shows before focus.
    4. Without results, Search falls through to FullPageOfflineBlockingView (Search/index.tsx:1299-1303). That view only has content while offline (FullPageOfflineBlockingView.tsx:24-37). Going online leaves the screen blank.

    Alternatives ruled out: The other search-related PRs on staging (#103937, #103682, #102438, #103486) only touch null checks or suggestion logic. #104238 came after 9.5.13-0.

    Other blockers from the same PR (all closed):

    Suggested owners: sumo-slonik (author), plus the approving reviewers ZhenjaHorbach and grgia.


    view run

  7. arosiclair commented on Oct 17, 2026

    @arosiclair
    Contributor

    Having trouble reproducing since v9.5.13-0 is not available in Test Flight atm

  8. arosiclair commented on Oct 17, 2026

    @arosiclair
    Contributor

    Okay I reproduced in Android v9.5.13-3 and not in v9.5.12-1. Overall, this bug seems pretty minor so I'm going to demote it. cc @sumo-slonik @ZhenjaHorbach @grgia in case #101339 really is the root cause.

  9. 5 remaining items

  10. m-natarajan commented on Oct 19, 2026

    @m-natarajan

    Passed, Xiaomi Redmi Note 10 / Android 12, App 9.5.13-5

    Screenrecorder-2026-10-19-15-53-36-768.mp4
  11. grgia commented on Oct 19, 2026

    @grgia
    Contributor

    Closing!

  12. changed the title [-]Android & iOS - Spend - No skeleton loader when loading[/-] [+][Due for payment 2026-10-26] Android & iOS - Spend - No skeleton loader when loading[/+] on Oct 19, 2026
  13. melvin-bot commented on Oct 19, 2026

    @melvin-bot

    @ZhenjaHorbach

    The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.13-6 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

    If no regressions arise, payment will be issued on 2026-10-26. 🎊

    The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]

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

Metadata

Metadata

Labels

BugSomething is broken. Auto assigns a BugZero manager.DailyKSv2

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions