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-10-26] Android & iOS - Spend - No skeleton loader when loading #104277
👋 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:
Identify the pull request that introduced this issue and revert it.
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.
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.
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.
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.
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.
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
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]
Activity
applause-bot commentedon Oct 16, 2026
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
melvin-bot commentedon Oct 16, 2026
Triggered auto assignment to @arosiclair (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.github-actions commentedon Oct 16, 2026
👋 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:
melvin-bot commentedon Oct 16, 2026
💬 A slack conversation has been started in #expensify-open-source
MelvinBot commentedon Oct 16, 2026
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
SearchLoadingSkeletonwhenshouldShowLoadingSkeletonis true, the same way non-static mode already does. Then confirm the submit-expense deferred-write flow still works.Investigation details
createNativeBottomTabNavigator, which builds every tab at startup (TabNavigator.native.tsx:31, useHasTabBeenShown.ts:23-27).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). TheSearchRowSkeletonthe PR added (L360-365) only shows before focus.Searchfalls through toFullPageOfflineBlockingView(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 reviewersZhenjaHorbachandgrgia.view run
arosiclair commentedon Oct 17, 2026
Having trouble reproducing since v9.5.13-0 is not available in Test Flight atm
arosiclair commentedon Oct 17, 2026
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.
5 remaining items
m-natarajan commentedon Oct 19, 2026
Passed, Xiaomi Redmi Note 10 / Android 12, App 9.5.13-5
Screenrecorder-2026-10-19-15-53-36-768.mp4
grgia commentedon Oct 19, 2026
Closing!
[-]Android & iOS - Spend - No skeleton loader when loading[/-][+][Due for payment 2026-10-26] Android & iOS - Spend - No skeleton loader when loading[/+]melvin-bot commentedon Oct 19, 2026
@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:
Spendtab #104338If 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]