Version Number: 9.3.62-5+
Reproducible in staging?: Yes
Reproducible in production?: Unknown
Email or phone of affected tester (no customers): N/A
Issue reported by: Internal (found during investigation of #89028)
Device used: Android/iOS
Action Performed:
- Log in to the app
- Copy a conversation/chat link
- Log out from the app
- Open the conversation/chat link from step 2
- Log in to the app with the same account
- Observe the console
Expected Result:
Navigation to TabNavigator succeeds without errors; the user lands on the deep-linked report.
Actual Result:
Console error:
The action 'NAVIGATE' with payload {"name":"TabNavigator","params":{"initial":false,"screen":"ReportsSplitNavigator","params":{"pop":true,"initial":true,"screen":"Report","params":{"reportID":"..."},"path":"/r/..."},"pop":true},"pop":true} was not handled by any navigator.
Do you have a screen named 'TabNavigator'?
Root Cause Analysis
During the deep link login flow, openReportFromDeepLink awaits waitForProtectedRoutes(), which resolves when CONCIERGE appears in routeNames. However, TabNavigator is loaded lazily via getComponent, so there's a window where the RootStack has registered the screen name but the TabNavigator component hasn't fully mounted to handle the nested navigation action. The Navigation.navigate() call dispatches a NAVIGATE action targeting TabNavigator during this window, producing the unhandled action error.
Recommended Fix
Add NAVIGATORS.TAB_NAVIGATOR to the PROTECTED_SCREENS check (or add a separate readiness check that verifies TabNavigator is in the navigation state before resolving). This ensures waitForProtectedRoutes() doesn't resolve until TabNavigator is actually available to handle navigation.
Related Issues
Platforms:
Screenshots/Videos
Screenshot from situchan's investigation in #89028:
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @situchan
Version Number: 9.3.62-5+
Reproducible in staging?: Yes
Reproducible in production?: Unknown
Email or phone of affected tester (no customers): N/A
Issue reported by: Internal (found during investigation of #89028)
Device used: Android/iOS
Action Performed:
Expected Result:
Navigation to
TabNavigatorsucceeds without errors; the user lands on the deep-linked report.Actual Result:
Console error:
Root Cause Analysis
During the deep link login flow,
openReportFromDeepLinkawaitswaitForProtectedRoutes(), which resolves whenCONCIERGEappears inrouteNames. However,TabNavigatoris loaded lazily viagetComponent, so there's a window where the RootStack has registered the screen name but theTabNavigatorcomponent hasn't fully mounted to handle the nested navigation action. TheNavigation.navigate()call dispatches aNAVIGATEaction targetingTabNavigatorduring this window, producing the unhandled action error.Recommended Fix
Add
NAVIGATORS.TAB_NAVIGATORto thePROTECTED_SCREENScheck (or add a separate readiness check that verifiesTabNavigatoris in the navigation state before resolving). This ensureswaitForProtectedRoutes()doesn't resolve untilTabNavigatoris actually available to handle navigation.Related Issues
Platforms:
Screenshots/Videos
Screenshot from
situchan's investigation in #89028:Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @situchan