diff --git a/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.tsx b/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.tsx index 2474c4f35a61..772c51915d1d 100644 --- a/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.tsx +++ b/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.tsx @@ -17,7 +17,7 @@ import getTopmostBottomTabRoute from '@libs/Navigation/getTopmostBottomTabRoute' import getTopmostCentralPaneRoute from '@libs/Navigation/getTopmostCentralPaneRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {RootStackParamList, State} from '@libs/Navigation/types'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import {getChatTabBrickRoad} from '@libs/WorkspacesSettingsUtils'; import BottomTabAvatar from '@pages/home/sidebar/BottomTabAvatar'; import BottomTabBarFloatingActionButton from '@pages/home/sidebar/BottomTabBarFloatingActionButton'; diff --git a/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.website.tsx b/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.website.tsx index ecacedde16dd..90a7a0df056f 100644 --- a/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.website.tsx +++ b/src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.website.tsx @@ -17,7 +17,7 @@ import getTopmostBottomTabRoute from '@libs/Navigation/getTopmostBottomTabRoute' import getTopmostCentralPaneRoute from '@libs/Navigation/getTopmostCentralPaneRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {RootStackParamList, State} from '@libs/Navigation/types'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import {getChatTabBrickRoad} from '@libs/WorkspacesSettingsUtils'; import BottomTabAvatar from '@pages/home/sidebar/BottomTabAvatar'; import BottomTabBarFloatingActionButton from '@pages/home/sidebar/BottomTabBarFloatingActionButton'; diff --git a/src/libs/Navigation/AppNavigator/createCustomStackNavigator/CustomRouter.ts b/src/libs/Navigation/AppNavigator/createCustomStackNavigator/CustomRouter.ts index fa7e8a55d1fc..a1768df5e0d6 100644 --- a/src/libs/Navigation/AppNavigator/createCustomStackNavigator/CustomRouter.ts +++ b/src/libs/Navigation/AppNavigator/createCustomStackNavigator/CustomRouter.ts @@ -7,7 +7,7 @@ import getTopmostCentralPaneRoute from '@libs/Navigation/getTopmostCentralPaneRo import linkingConfig from '@libs/Navigation/linkingConfig'; import getAdaptedStateFromPath from '@libs/Navigation/linkingConfig/getAdaptedStateFromPath'; import type {NavigationPartialRoute, RootStackParamList, State} from '@libs/Navigation/types'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import NAVIGATORS from '@src/NAVIGATORS'; import SCREENS from '@src/SCREENS'; import type {ResponsiveStackNavigatorRouterOptions} from './types'; diff --git a/src/libs/Navigation/AppNavigator/createCustomStackNavigator/index.tsx b/src/libs/Navigation/AppNavigator/createCustomStackNavigator/index.tsx index 84123dbfa569..310766f80e9d 100644 --- a/src/libs/Navigation/AppNavigator/createCustomStackNavigator/index.tsx +++ b/src/libs/Navigation/AppNavigator/createCustomStackNavigator/index.tsx @@ -9,7 +9,7 @@ import useWindowDimensions from '@hooks/useWindowDimensions'; import getTopmostCentralPaneRoute from '@libs/Navigation/getTopmostCentralPaneRoute'; import navigationRef from '@libs/Navigation/navigationRef'; import type {RootStackParamList, State} from '@libs/Navigation/types'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import SCREENS from '@src/SCREENS'; import CustomRouter from './CustomRouter'; import type {ResponsiveStackNavigatorProps, ResponsiveStackNavigatorRouterOptions} from './types'; diff --git a/src/libs/Navigation/Navigation.ts b/src/libs/Navigation/Navigation.ts index 5a7182405681..e9bfb7227403 100644 --- a/src/libs/Navigation/Navigation.ts +++ b/src/libs/Navigation/Navigation.ts @@ -4,7 +4,7 @@ import {CommonActions, getPathFromState, StackActions} from '@react-navigation/n import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import Log from '@libs/Log'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName, removePolicyIDParamFromState} from '@libs/NavigationUtils'; import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import NAVIGATORS from '@src/NAVIGATORS'; @@ -129,7 +129,9 @@ function getDistanceFromPathInRootNavigator(path?: string): number { break; } - const pathFromState = getPathFromState(currentState, linkingConfig.config); + // When comparing path and pathFromState, the policyID parameter isn't included in the comparison + const currentStateWithoutPolicyID = removePolicyIDParamFromState(currentState as State); + const pathFromState = getPathFromState(currentStateWithoutPolicyID, linkingConfig.config); if (path === pathFromState.substring(1)) { return index; } diff --git a/src/libs/Navigation/dismissModalWithReport.ts b/src/libs/Navigation/dismissModalWithReport.ts index 1bb939f5230f..1579a0565726 100644 --- a/src/libs/Navigation/dismissModalWithReport.ts +++ b/src/libs/Navigation/dismissModalWithReport.ts @@ -4,7 +4,7 @@ import {StackActions} from '@react-navigation/native'; import {findLastIndex} from 'lodash'; import type {OnyxEntry} from 'react-native-onyx'; import Log from '@libs/Log'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import getPolicyEmployeeAccountIDs from '@libs/PolicyEmployeeListUtils'; import {doesReportBelongToWorkspace} from '@libs/ReportUtils'; import NAVIGATORS from '@src/NAVIGATORS'; diff --git a/src/libs/Navigation/getTopmostCentralPaneRoute.ts b/src/libs/Navigation/getTopmostCentralPaneRoute.ts index 977f23cd3cd7..5ac72281eaf6 100644 --- a/src/libs/Navigation/getTopmostCentralPaneRoute.ts +++ b/src/libs/Navigation/getTopmostCentralPaneRoute.ts @@ -1,4 +1,4 @@ -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import type {CentralPaneName, NavigationPartialRoute, RootStackParamList, State} from './types'; // Get the name of topmost central pane route in the navigation stack. diff --git a/src/libs/Navigation/getTopmostReportActionID.ts b/src/libs/Navigation/getTopmostReportActionID.ts index ade982c87b7d..d3c6e41887d8 100644 --- a/src/libs/Navigation/getTopmostReportActionID.ts +++ b/src/libs/Navigation/getTopmostReportActionID.ts @@ -1,5 +1,5 @@ import type {NavigationState, PartialState} from '@react-navigation/native'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import SCREENS from '@src/SCREENS'; import type {RootStackParamList} from './types'; diff --git a/src/libs/Navigation/getTopmostReportId.ts b/src/libs/Navigation/getTopmostReportId.ts index 19bf24f1ba74..dc53d040f087 100644 --- a/src/libs/Navigation/getTopmostReportId.ts +++ b/src/libs/Navigation/getTopmostReportId.ts @@ -1,5 +1,5 @@ import type {NavigationState, PartialState} from '@react-navigation/native'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import SCREENS from '@src/SCREENS'; import type {RootStackParamList} from './types'; diff --git a/src/libs/Navigation/linkTo/getActionForBottomTabNavigator.ts b/src/libs/Navigation/linkTo/getActionForBottomTabNavigator.ts index 8af683e273d6..85580d068ad7 100644 --- a/src/libs/Navigation/linkTo/getActionForBottomTabNavigator.ts +++ b/src/libs/Navigation/linkTo/getActionForBottomTabNavigator.ts @@ -13,7 +13,6 @@ function getActionForBottomTabNavigator( shouldNavigate?: boolean, ): Writable | undefined { const bottomTabNavigatorRoute = state.routes.at(0); - if (!bottomTabNavigatorRoute || bottomTabNavigatorRoute.state === undefined || !action || action.type !== CONST.NAVIGATION.ACTION_TYPE.NAVIGATE) { return; } @@ -22,10 +21,10 @@ function getActionForBottomTabNavigator( let payloadParams = params.params as Record; const screen = params.screen; - if (!payloadParams) { - payloadParams = {policyID}; - } else if (!('policyID' in payloadParams && !!payloadParams?.policyID)) { + if (policyID && !payloadParams?.policyID) { payloadParams = {...payloadParams, policyID}; + } else if (!policyID) { + delete payloadParams?.policyID; } // Check if the current bottom tab is the same as the one we want to navigate to. If it is, we don't need to do anything. diff --git a/src/libs/Navigation/linkTo/index.ts b/src/libs/Navigation/linkTo/index.ts index 3c4608d6b5de..2c23cf573248 100644 --- a/src/libs/Navigation/linkTo/index.ts +++ b/src/libs/Navigation/linkTo/index.ts @@ -4,7 +4,7 @@ import {findFocusedRoute} from '@react-navigation/native'; import {omitBy} from 'lodash'; import getIsNarrowLayout from '@libs/getIsNarrowLayout'; import extractPolicyIDsFromState from '@libs/Navigation/linkingConfig/extractPolicyIDsFromState'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import shallowCompare from '@libs/ObjectUtils'; import {extractPolicyIDFromPath, getPathWithoutPolicyID} from '@libs/PolicyUtils'; import getActionsFromPartialDiff from '@navigation/AppNavigator/getActionsFromPartialDiff'; diff --git a/src/libs/Navigation/linkingConfig/customGetPathFromState.ts b/src/libs/Navigation/linkingConfig/customGetPathFromState.ts index 3ae1ed245ec6..a9c9b6f23b19 100644 --- a/src/libs/Navigation/linkingConfig/customGetPathFromState.ts +++ b/src/libs/Navigation/linkingConfig/customGetPathFromState.ts @@ -1,22 +1,13 @@ import {getPathFromState} from '@react-navigation/native'; -import _ from 'lodash'; import getPolicyIDFromState from '@libs/Navigation/getPolicyIDFromState'; import getTopmostBottomTabRoute from '@libs/Navigation/getTopmostBottomTabRoute'; import type {BottomTabName, RootStackParamList, State} from '@libs/Navigation/types'; +import {removePolicyIDParamFromState} from '@libs/NavigationUtils'; import SCREENS from '@src/SCREENS'; // The policy ID parameter should be included in the URL when any of these pages is opened in the bottom tab. const SCREENS_WITH_POLICY_ID_IN_URL: BottomTabName[] = [SCREENS.HOME] as const; -const removePolicyIDParamFromState = (state: State) => { - const stateCopy = _.cloneDeep(state); - const bottomTabRoute = getTopmostBottomTabRoute(stateCopy); - if (bottomTabRoute?.params && 'policyID' in bottomTabRoute.params) { - delete bottomTabRoute.params.policyID; - } - return stateCopy; -}; - const customGetPathFromState: typeof getPathFromState = (state, options) => { // For the Home and Settings pages we should remove policyID from the params, because on small screens it's displayed twice in the URL const stateWithoutPolicyID = removePolicyIDParamFromState(state as State); diff --git a/src/libs/Navigation/linkingConfig/getAdaptedStateFromPath.ts b/src/libs/Navigation/linkingConfig/getAdaptedStateFromPath.ts index 17ea0e17d1b9..2b057bf5edaa 100644 --- a/src/libs/Navigation/linkingConfig/getAdaptedStateFromPath.ts +++ b/src/libs/Navigation/linkingConfig/getAdaptedStateFromPath.ts @@ -4,7 +4,7 @@ import type {TupleToUnion} from 'type-fest'; import {isAnonymousUser} from '@libs/actions/Session'; import getIsNarrowLayout from '@libs/getIsNarrowLayout'; import type {BottomTabName, CentralPaneName, FullScreenName, NavigationPartialRoute, RootStackParamList} from '@libs/Navigation/types'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import {extractPolicyIDFromPath, getPathWithoutPolicyID} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import NAVIGATORS from '@src/NAVIGATORS'; diff --git a/src/libs/Navigation/linkingConfig/getMatchingBottomTabRouteForState.ts b/src/libs/Navigation/linkingConfig/getMatchingBottomTabRouteForState.ts index 4b4ed25959f0..67d76de4932d 100644 --- a/src/libs/Navigation/linkingConfig/getMatchingBottomTabRouteForState.ts +++ b/src/libs/Navigation/linkingConfig/getMatchingBottomTabRouteForState.ts @@ -23,7 +23,7 @@ function getMatchingBottomTabRouteForState(state: State, pol const tabName = CENTRAL_PANE_TO_TAB_MAPPING[topmostCentralPaneRoute.name]; if (tabName === SCREENS.SEARCH.BOTTOM_TAB) { - const topmostCentralPaneRouteParams = topmostCentralPaneRoute.params as Record; + const topmostCentralPaneRouteParams = {...topmostCentralPaneRoute.params} as Record; delete topmostCentralPaneRouteParams?.policyIDs; if (policyID) { topmostCentralPaneRouteParams.policyID = policyID; diff --git a/src/libs/Navigation/switchPolicyID.ts b/src/libs/Navigation/switchPolicyID.ts index 59461bfc3c8f..0f6477a9ee0e 100644 --- a/src/libs/Navigation/switchPolicyID.ts +++ b/src/libs/Navigation/switchPolicyID.ts @@ -3,7 +3,7 @@ import type {NavigationAction, NavigationContainerRef, NavigationState, PartialS import {getPathFromState} from '@react-navigation/native'; import type {Writable} from 'type-fest'; import getIsNarrowLayout from '@libs/getIsNarrowLayout'; -import isCentralPaneName from '@libs/NavigationUtils'; +import {isCentralPaneName} from '@libs/NavigationUtils'; import CONST from '@src/CONST'; import type {Route} from '@src/ROUTES'; import ROUTES from '@src/ROUTES'; diff --git a/src/libs/NavigationUtils.ts b/src/libs/NavigationUtils.ts index 4fdc03c3d334..34fc0b971ef6 100644 --- a/src/libs/NavigationUtils.ts +++ b/src/libs/NavigationUtils.ts @@ -1,5 +1,7 @@ +import cloneDeep from 'lodash/cloneDeep'; import SCREENS from '@src/SCREENS'; -import type {CentralPaneName} from './Navigation/types'; +import getTopmostBottomTabRoute from './Navigation/getTopmostBottomTabRoute'; +import type {CentralPaneName, RootStackParamList, State} from './Navigation/types'; const CENTRAL_PANE_SCREEN_NAMES = new Set([ SCREENS.SETTINGS.WORKSPACES, @@ -23,4 +25,13 @@ function isCentralPaneName(screen: string | undefined): screen is CentralPaneNam return CENTRAL_PANE_SCREEN_NAMES.has(screen as CentralPaneName); } -export default isCentralPaneName; +const removePolicyIDParamFromState = (state: State) => { + const stateCopy = cloneDeep(state); + const bottomTabRoute = getTopmostBottomTabRoute(stateCopy); + if (bottomTabRoute?.params && 'policyID' in bottomTabRoute.params) { + delete bottomTabRoute.params.policyID; + } + return stateCopy; +}; + +export {isCentralPaneName, removePolicyIDParamFromState};