Coming from this proposal
Background
The application consists of several tabs:
• Home
• Inbox
• Reports
• Workspaces
• Account
Each of these tabs (without home) has its own nested navigation flow implemented using stack navigators.
Some tabs contain heavy screens, particularly Inbox, Reports, and Workspaces, where complex views and large datasets are rendered.
Currently, navigation uses a root stack navigator, where each top-level tab is pushed as a screen. As a result, switching between tabs repeatedly mounts and unmounts entire navigators, because every time we navigate to a tab, we are pushing a new screen.
This introduces unnecessary overhead and makes tab switching slower than expected, especially when moving frequently between heavy screens.
Problem
When users switch between tabs, the stack-based architecture recreates navigators and screens.
This leads to:
• unnecessary mounting and unmounting
• increased navigation latency
• reduced perceived responsiveness when switching between heavy screens
Solution
Introduce a Bottom Tab Navigator inside the root stack navigator to represent the main application areas.
The root stack navigator remains, and continues to handle global flows such as:
• modals
• RHP screens
• other global navigation states
Inside the root stack we introduce a Bottom Tab Navigator that contains the main areas of the app.
Navigation structure
Root Stack Navigator
│
├─ Bottom Tab Navigator
│ ├─ Home Stack
│ ├─ Inbox Stack
| ├─Report
│ ├─ Reports Stack
│ ├─ Workspaces Stack
| ├─Workspace initial page
│ └─ Settings Stack
│
├─ RHP Screens
└─ Modal ScreensEach tab keeps its existing stack navigator.
Because tab navigators keep screens mounted, switching between tabs does not recreate navigators, which significantly reduces navigation work.
Additional Improvements
This approach also allows us to:
• freeze screens when they lose focus to prevent background work
• centralize the top-level tab bar in one place
• reduce navigation overhead between heavy screens
• make tab transitions more predictable and consistent
Measured Improvements
Web: ~40% faster tab switching
iOS: ~80% faster tab switching
Android: ~80% faster tab switching
Result
This aligns the navigation architecture better with how the application is structured:
• tabs represent top-level areas of the app
• tab switching becomes significantly faster
• heavy screens (Inbox, Reports, Workspaces) no longer remount unnecessarily
• background screens are frozen when blurred
• navigation UI becomes more consistent
Overall, this should significantly improve responsiveness when switching between tabs.
Here is a draft PR. Please feel free to generate an ad-hoc build and test it. Tab switching should already be working. There are still some bugs that we are currently working on, but during testing you can focus mainly on verifying the tab switching.
Upwork Automation - Do Not Edit
- Upwork Job URL: https://www.upwork.com/jobs/~022032516596565029852
- Upwork Job ID: 2032516596565029852
- Last Price Increase: 2026-05-26
Issue Owner
Current Issue Owner: @sumo-slonik
Coming from this proposal
Background
The application consists of several tabs:
• Home
• Inbox
• Reports
• Workspaces
• Account
Each of these tabs (without home) has its own nested navigation flow implemented using stack navigators.
Some tabs contain heavy screens, particularly Inbox, Reports, and Workspaces, where complex views and large datasets are rendered.
Currently, navigation uses a root stack navigator, where each top-level tab is pushed as a screen. As a result, switching between tabs repeatedly mounts and unmounts entire navigators, because every time we navigate to a tab, we are pushing a new screen.
This introduces unnecessary overhead and makes tab switching slower than expected, especially when moving frequently between heavy screens.
Problem
When users switch between tabs, the stack-based architecture recreates navigators and screens.
This leads to:
• unnecessary mounting and unmounting
• increased navigation latency
• reduced perceived responsiveness when switching between heavy screens
Solution
Introduce a Bottom Tab Navigator inside the root stack navigator to represent the main application areas.
The root stack navigator remains, and continues to handle global flows such as:
• modals
• RHP screens
• other global navigation states
Inside the root stack we introduce a Bottom Tab Navigator that contains the main areas of the app.
Navigation structure
Because tab navigators keep screens mounted, switching between tabs does not recreate navigators, which significantly reduces navigation work.
Additional Improvements
This approach also allows us to:
• freeze screens when they lose focus to prevent background work
• centralize the top-level tab bar in one place
• reduce navigation overhead between heavy screens
• make tab transitions more predictable and consistent
Measured Improvements
Web: ~40% faster tab switching
iOS: ~80% faster tab switching
Android: ~80% faster tab switching
Result
This aligns the navigation architecture better with how the application is structured:
• tabs represent top-level areas of the app
• tab switching becomes significantly faster
• heavy screens (Inbox, Reports, Workspaces) no longer remount unnecessarily
• background screens are frozen when blurred
• navigation UI becomes more consistent
Overall, this should significantly improve responsiveness when switching between tabs.
Here is a draft PR. Please feel free to generate an ad-hoc build and test it. Tab switching should already be working. There are still some bugs that we are currently working on, but during testing you can focus mainly on verifying the tab switching.
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @sumo-slonik