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
iOS - Bottom tab bar appears after delay after swiping back from workspace settings #104257
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:#101339 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: iPhone 17 Pro Max / iOS 27.0.1 App Component: Workspace Settings
Action Performed:
Launch Expensify app.
Go to Workspaces.
Open any workspace.
Open any settings.
Swipe back to previous page.
Expected Result:
Bottom tab bar will be shown immediately after swiping back from workspace settings.
Actual Result:
Bottom tab bar appears after delay after swiping back from workspace settings.
👋 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 in a follow-up. Don't revert. This is a cosmetic timing issue on a large feature that already has staging fixes cherry-picked on top. grgia has already removed DeployBlockerCash and closed this issue, and these findings support that.
Why it happens: On iOS, the tab-root pages no longer draw their own tab bar. Only the native tab bar is left, and it shows only after the swipe-back pop is committed to navigation state. A patch then animates it in, which adds more delay.
Investigation details
Why this PR
It replaced the JavaScript tab bar with a native iOS tab bar. Production still has the old bar, which matches "staging yes, production no, iOS only".
shouldShowNativeTabBar depends on isTabRouteAtRoot(activeTabRoute) (useNativeTabNavigator.ts:62-66). It becomes tabBarStyle.display (index.ios.ts:60). The native stack only commits the pop after the swipe animation ends, so the bar stays hidden during the whole swipe.
The PR's react-native-screens+4.28.0+002+animate-hiding-the-native-tab-bar.patch calls setTabBarHidden:animated:YES. After the pop, UIKit slides the bar in, which adds more delay.
This likely affects swiping back to any tab root, not just Workspaces.
Suggested fix
Add a hook to the tab-root pages that listens to the native stack's transitionStart event. When closing === false, set a shared "tab root appearing" flag. Clear it on closing === true (including a cancelled swipe) or transitionEnd. ScreenLayout.tsx:49-55 already subscribes to these events.
In useNativeTabNavigator, show the bar when isTabRouteAtRoot(activeTabRoute) || isTabRootAppearing.
Cheaper partial fix: in the patch, animate only when hiding (animated:(_tabBarHidden && ...)). This removes the slide-in but not the wait for the pop.
I did not test this on a device, because the bug needs native iOS swipe-back.
Next Steps: Reply with @MelvinBot implement this to create a draft PR, or @MelvinBot <your feedback> to refine this analysis.
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/e9dba6b81899cb3b9ed659e6d4e9562e872b94a7fa6bdc6dfb4a670277b01599
melvin-bot commentedon Oct 16, 2026
You have been assigned to this deploy blocker because you recently merged this PR: #101339
melvin-bot commentedon Oct 16, 2026
@grgia @ZhenjaHorbach you have been assigned to this deploy blocker because you reviewed the offending PR: #101339
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
@sumo-slonik you have been assigned to this deploy blocker because you authored the offending PR: #101339
melvin-bot commentedon Oct 16, 2026
💬 A slack conversation has been started in #expensify-open-source
MelvinBot commentedon Oct 16, 2026
Deploy Blocker Analysis
Causing PR: Add liquid glass bottom tab bar to iOS, Android and mWeb (high confidence).
Recommendation: Fix forward in a follow-up. Don't revert. This is a cosmetic timing issue on a large feature that already has staging fixes cherry-picked on top.
grgiahas already removedDeployBlockerCashand closed this issue, and these findings support that.Why it happens: On iOS, the tab-root pages no longer draw their own tab bar. Only the native tab bar is left, and it shows only after the swipe-back pop is committed to navigation state. A patch then animates it in, which adds more delay.
Investigation details
Why this PR
Mechanism
bottomContent. When you swiped back, the uncovered page already showed a bar.useTabRootScreenWrapperProps. On iOS, that hook returns nobottomContent(index.ios.tsx:27-30).shouldShowNativeTabBardepends onisTabRouteAtRoot(activeTabRoute)(useNativeTabNavigator.ts:62-66). It becomestabBarStyle.display(index.ios.ts:60). The native stack only commits the pop after the swipe animation ends, so the bar stays hidden during the whole swipe.react-native-screens+4.28.0+002+animate-hiding-the-native-tab-bar.patchcallssetTabBarHidden:animated:YES. After the pop, UIKit slides the bar in, which adds more delay.This likely affects swiping back to any tab root, not just Workspaces.
Suggested fix
transitionStartevent. Whenclosing === false, set a shared "tab root appearing" flag. Clear it onclosing === true(including a cancelled swipe) ortransitionEnd. ScreenLayout.tsx:49-55 already subscribes to these events.useNativeTabNavigator, show the bar whenisTabRouteAtRoot(activeTabRoute) || isTabRootAppearing.animated:(_tabBarHidden && ...)). This removes the slide-in but not the wait for the pop.I did not test this on a device, because the bug needs native iOS swipe-back.
Next Steps: Reply with
@MelvinBot implement thisto create a draft PR, or@MelvinBot <your feedback>to refine this analysis.view run