From ec01bc3b5a390ca067ad2ac785f74573d6ab15d9 Mon Sep 17 00:00:00 2001 From: borys3kk Date: Wed, 21 May 2025 16:56:36 +0200 Subject: [PATCH 1/8] refactor redundant code of push action handlers / remove unnecessary sets / update rootstackrouter with new handlePushAction --- .../Navigation/AppNavigator/AuthScreens.tsx | 19 ++-- .../GetStateForActionHandlers.ts | 98 +++++-------------- .../RootStackRouter.ts | 16 +-- 3 files changed, 32 insertions(+), 101 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index ce1abb6722db..bc8dfe4e28d5 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -62,12 +62,7 @@ import type {SelectedTimezone, Timezone} from '@src/types/onyx/PersonalDetails'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import type ReactComponentModule from '@src/types/utils/ReactComponentModule'; import createRootStackNavigator from './createRootStackNavigator'; -import { - reportsSplitsWithEnteringAnimation, - searchFullscreenWithEnteringAnimation, - settingsSplitWithEnteringAnimation, - workspaceSplitsWithoutEnteringAnimation, -} from './createRootStackNavigator/GetStateForActionHandlers'; +import {screensWithEnteringAnimation, workspaceSplitsWithoutEnteringAnimation} from './createRootStackNavigator/GetStateForActionHandlers'; import defaultScreenOptions from './defaultScreenOptions'; import {ShareModalStackNavigator} from './ModalStackNavigators'; import ExplanationModalNavigator from './Navigators/ExplanationModalNavigator'; @@ -477,7 +472,6 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie } // On the narrow screen, we want to animate this navigator if pushed SplitNavigator includes desired screen const animationEnabled = routesWithEnteringAnimation.has(route.key); - return { ...defaultOptions, animation: animationEnabled ? Animations.SLIDE_FROM_RIGHT : Animations.NONE, @@ -485,13 +479,16 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie }; // Animation is enabled when navigating to the report screen - const getReportsSplitNavigatorOptions = getFullScreenNavigatorOptions(reportsSplitsWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); + const getReportsSplitNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); // Animation is enabled when navigating to any screen different than SCREENS.SETTINGS.ROOT - const getSettingsSplitNavigatorOptions = getFullScreenNavigatorOptions(settingsSplitWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); + const getSettingsSplitNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); + + // Animation is enabled when navigating to any screen different than SCREENS.WORKSPACE_HUB.ROOT + const getWorkspaceHubSplitNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); // Animation is enabled when navigating to SCREENS.SEARCH.MONEY_REQUEST_REPORT - const getSearchFullscreenNavigatorOptions = getFullScreenNavigatorOptions(searchFullscreenWithEnteringAnimation, rootNavigatorScreenOptions.fullScreen); + const getSearchFullscreenNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.fullScreen); const clearStatus = () => { User.clearCustomStatus(); @@ -547,7 +544,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie /> screen === SCREENS.REPORT, // ReportScreen should always be opened with an animation + [NAVIGATORS.SETTINGS_SPLIT_NAVIGATOR]: (screen: string | undefined) => screen !== SCREENS.SETTINGS.ROOT, // Transitioning to all central screens in settings should be animated + [NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR]: (screen: string | undefined) => screen === SCREENS.SEARCH.MONEY_REQUEST_REPORT, // Transitioning to SCREENS.SEARCH.MONEY_REQUEST_REPORT should be animated + [NAVIGATORS.WORKSPACE_HUB_SPLIT_NAVIGATOR]: (screen: string | undefined) => screen !== SCREENS.WORKSPACE_HUB.ROOT, // Transitioning to all central screens in workspace hub should be animated +}; + const workspaceSplitsWithoutEnteringAnimation = new Set(); -const reportsSplitsWithEnteringAnimation = new Set(); -const settingsSplitWithEnteringAnimation = new Set(); -const searchFullscreenWithEnteringAnimation = new Set(); + +const screensWithEnteringAnimation = new Set(); /** * Handles the OPEN_WORKSPACE_SPLIT action. * If the user is on other tab than workspaces and the workspace split is "remembered", this action will be called after pressing the settings tab. @@ -140,84 +146,28 @@ function handleSwitchPolicyIDAction( return null; } -/** - * If a new ReportSplitNavigator is opened, it is necessary to check whether workspace is currently selected in the application. - * If so, the id of the current policy has to be passed to the new ReportSplitNavigator. - */ -function handlePushReportSplitAction( - state: StackNavigationState, - action: PushActionType, - configOptions: RouterConfigOptions, - stackRouter: Router, CommonActions.Action | StackActionType>, -) { - const stateWithReportsSplitNavigator = stackRouter.getStateForAction(state, action, configOptions); - - if (!stateWithReportsSplitNavigator) { - Log.hmmm('[handlePushReportAction] ReportsSplitNavigator has not been found in the navigation state.'); - return null; - } - - const lastFullScreenRoute = stateWithReportsSplitNavigator.routes.at(-1); - const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? action.payload?.params?.screen : undefined; - - // ReportScreen should always be opened with an animation - if (actionPayloadScreen === SCREENS.REPORT && lastFullScreenRoute?.key) { - reportsSplitsWithEnteringAnimation.add(lastFullScreenRoute.key); - } - - return stateWithReportsSplitNavigator; -} - -function handlePushSettingsSplitAction( - state: StackNavigationState, - action: PushActionType, - configOptions: RouterConfigOptions, - stackRouter: Router, CommonActions.Action | StackActionType>, -) { - const stateWithSettingsSplitNavigator = stackRouter.getStateForAction(state, action, configOptions); - - if (!stateWithSettingsSplitNavigator) { - Log.hmmm('[handlePushSettingsAction] SettingsSplitNavigator has not been found in the navigation state.'); - return null; - } - - const lastFullScreenRoute = stateWithSettingsSplitNavigator.routes.at(-1); - const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? action.payload?.params?.screen : undefined; - - // Transitioning to all central screens in settings should be animated - if (actionPayloadScreen !== SCREENS.SETTINGS.ROOT && lastFullScreenRoute?.key) { - settingsSplitWithEnteringAnimation.add(lastFullScreenRoute.key); - } - - return stateWithSettingsSplitNavigator; -} - -/** - * If a new Search page is opened, it is necessary to check whether workspace is currently selected in the application. - * If so, the id of the current policy has to be passed to the new Search page - */ -function handlePushSearchPageAction( +function handlePushAction( state: StackNavigationState, action: PushActionType, configOptions: RouterConfigOptions, stackRouter: Router, CommonActions.Action | StackActionType>, ) { - const stateWithSearchFullscreenNavigator = stackRouter.getStateForAction(state, action, configOptions); + const stateWithNavigator = stackRouter.getStateForAction(state, action, configOptions); + const navigatorName = action.payload.name; - if (!stateWithSearchFullscreenNavigator) { - Log.hmmm('[handlePushSettingsAction] SearchFullscreenNavigator has not been found in the navigation state.'); + if (!stateWithNavigator) { + Log.hmmm(`[handlePushAction] ${navigatorName} has not been found in the navigation state.`); return null; } - const lastFullScreenRoute = stateWithSearchFullscreenNavigator.routes.at(-1); - const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? action.payload?.params?.screen : undefined; + const lastFullScreenRoute = stateWithNavigator.routes.at(-1); + const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? (action.payload?.params?.screen as string) : undefined; - // Transitioning to SCREENS.SEARCH.MONEY_REQUEST_REPORT should be animated - if (actionPayloadScreen === SCREENS.SEARCH.MONEY_REQUEST_REPORT && lastFullScreenRoute?.key) { - searchFullscreenWithEnteringAnimation.add(lastFullScreenRoute.key); + if (lastFullScreenRoute?.key && navigatorName in SPLIT_TO_CONDITION && SPLIT_TO_CONDITION[navigatorName as keyof typeof SPLIT_TO_CONDITION](actionPayloadScreen)) { + screensWithEnteringAnimation.add(lastFullScreenRoute.key); } - return stateWithSearchFullscreenNavigator; + return stateWithNavigator; } function handleReplaceReportsSplitNavigatorAction( @@ -237,7 +187,7 @@ function handleReplaceReportsSplitNavigatorAction( // ReportScreen should always be opened with an animation when replacing the navigator if (lastReportsSplitNavigator?.key) { - reportsSplitsWithEnteringAnimation.add(lastReportsSplitNavigator.key); + screensWithEnteringAnimation.add(lastReportsSplitNavigator.key); } return stateWithReportsSplitNavigator; @@ -280,14 +230,10 @@ export { handleDismissModalAction, handleNavigatingToModalFromModal, handleOpenWorkspaceSplitAction, - handlePushReportSplitAction, - handlePushSearchPageAction, - handlePushSettingsSplitAction, + handlePushAction, + screensWithEnteringAnimation, handleReplaceReportsSplitNavigatorAction, handleSwitchPolicyIDAction, handleSwitchPolicyIDFromSearchAction, - reportsSplitsWithEnteringAnimation, - searchFullscreenWithEnteringAnimation, - settingsSplitWithEnteringAnimation, workspaceSplitsWithoutEnteringAnimation, }; diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts index 3261029f2775..906f7f2e45a7 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts @@ -13,9 +13,7 @@ import { handleDismissModalAction, handleNavigatingToModalFromModal, handleOpenWorkspaceSplitAction, - handlePushReportSplitAction, - handlePushSearchPageAction, - handlePushSettingsSplitAction, + handlePushAction, handleReplaceReportsSplitNavigatorAction, handleSwitchPolicyIDAction, } from './GetStateForActionHandlers'; @@ -106,17 +104,7 @@ function RootStackRouter(options: RootStackNavigatorRouterOptions) { } if (isPushAction(action)) { - if (action.payload.name === NAVIGATORS.REPORTS_SPLIT_NAVIGATOR) { - return handlePushReportSplitAction(state, action, configOptions, stackRouter); - } - - if (action.payload.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR) { - return handlePushSearchPageAction(state, action, configOptions, stackRouter); - } - - if (action.payload.name === NAVIGATORS.SETTINGS_SPLIT_NAVIGATOR) { - return handlePushSettingsSplitAction(state, action, configOptions, stackRouter); - } + return handlePushAction(state, action, configOptions, stackRouter); } // Don't let the user navigate back to a non-onboarding screen if they are currently on an onboarding screen and it's not finished. From d578efbf2ef101951ac74a00b66d2082251c269c Mon Sep 17 00:00:00 2001 From: borys3kk Date: Thu, 22 May 2025 10:43:32 +0200 Subject: [PATCH 2/8] remove unnecessary map / reuse SPLIT_DO_SIDEBAR / restore handlePushSeachPageAction --- .../GetStateForActionHandlers.ts | 40 ++++++++++++++----- .../RootStackRouter.ts | 8 +++- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts index dc308d560878..75886b296ae9 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts @@ -2,6 +2,7 @@ import type {CommonActions, RouterConfigOptions, StackActionType, StackNavigatio import {StackActions} from '@react-navigation/native'; import type {ParamListBase, Router} from '@react-navigation/routers'; import Log from '@libs/Log'; +import {SPLIT_TO_SIDEBAR} from '@libs/Navigation/linkingConfig/RELATIONS'; import type {RootNavigatorParamList} from '@libs/Navigation/types'; import * as SearchQueryUtils from '@libs/SearchQueryUtils'; import NAVIGATORS from '@src/NAVIGATORS'; @@ -25,13 +26,6 @@ const MODAL_ROUTES_TO_DISMISS: string[] = [ SCREENS.CONCIERGE, ]; -const SPLIT_TO_CONDITION = { - [NAVIGATORS.REPORTS_SPLIT_NAVIGATOR]: (screen: string | undefined) => screen === SCREENS.REPORT, // ReportScreen should always be opened with an animation - [NAVIGATORS.SETTINGS_SPLIT_NAVIGATOR]: (screen: string | undefined) => screen !== SCREENS.SETTINGS.ROOT, // Transitioning to all central screens in settings should be animated - [NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR]: (screen: string | undefined) => screen === SCREENS.SEARCH.MONEY_REQUEST_REPORT, // Transitioning to SCREENS.SEARCH.MONEY_REQUEST_REPORT should be animated - [NAVIGATORS.WORKSPACE_HUB_SPLIT_NAVIGATOR]: (screen: string | undefined) => screen !== SCREENS.WORKSPACE_HUB.ROOT, // Transitioning to all central screens in workspace hub should be animated -}; - const workspaceSplitsWithoutEnteringAnimation = new Set(); const screensWithEnteringAnimation = new Set(); @@ -146,7 +140,7 @@ function handleSwitchPolicyIDAction( return null; } -function handlePushAction( +function handlePushSplitAction( state: StackNavigationState, action: PushActionType, configOptions: RouterConfigOptions, @@ -163,13 +157,38 @@ function handlePushAction( const lastFullScreenRoute = stateWithNavigator.routes.at(-1); const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? (action.payload?.params?.screen as string) : undefined; - if (lastFullScreenRoute?.key && navigatorName in SPLIT_TO_CONDITION && SPLIT_TO_CONDITION[navigatorName as keyof typeof SPLIT_TO_CONDITION](actionPayloadScreen)) { + // Transitioning to all central screens in each split should be animated + if (lastFullScreenRoute?.key && navigatorName in SPLIT_TO_SIDEBAR && SPLIT_TO_SIDEBAR[navigatorName as keyof typeof SPLIT_TO_SIDEBAR] !== actionPayloadScreen) { screensWithEnteringAnimation.add(lastFullScreenRoute.key); } return stateWithNavigator; } +function handlePushSearchPageAction( + state: StackNavigationState, + action: PushActionType, + configOptions: RouterConfigOptions, + stackRouter: Router, CommonActions.Action | StackActionType>, +) { + const stateWithSearchFullscreenNavigator = stackRouter.getStateForAction(state, action, configOptions); + + if (!stateWithSearchFullscreenNavigator) { + Log.hmmm('[handlePushSettingsAction] SearchFullscreenNavigator has not been found in the navigation state.'); + return null; + } + + const lastFullScreenRoute = stateWithSearchFullscreenNavigator.routes.at(-1); + const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? action.payload?.params?.screen : undefined; + + // Transitioning to SCREENS.SEARCH.MONEY_REQUEST_REPORT should be animated + if (actionPayloadScreen === SCREENS.SEARCH.MONEY_REQUEST_REPORT && lastFullScreenRoute?.key) { + screensWithEnteringAnimation.add(lastFullScreenRoute.key); + } + + return stateWithSearchFullscreenNavigator; +} + function handleReplaceReportsSplitNavigatorAction( state: StackNavigationState, action: ReplaceActionType, @@ -230,7 +249,8 @@ export { handleDismissModalAction, handleNavigatingToModalFromModal, handleOpenWorkspaceSplitAction, - handlePushAction, + handlePushSplitAction, + handlePushSearchPageAction, screensWithEnteringAnimation, handleReplaceReportsSplitNavigatorAction, handleSwitchPolicyIDAction, diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts index 906f7f2e45a7..7c8c699d4fd7 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts @@ -13,7 +13,8 @@ import { handleDismissModalAction, handleNavigatingToModalFromModal, handleOpenWorkspaceSplitAction, - handlePushAction, + handlePushSearchPageAction, + handlePushSplitAction, handleReplaceReportsSplitNavigatorAction, handleSwitchPolicyIDAction, } from './GetStateForActionHandlers'; @@ -104,7 +105,10 @@ function RootStackRouter(options: RootStackNavigatorRouterOptions) { } if (isPushAction(action)) { - return handlePushAction(state, action, configOptions, stackRouter); + if (action.payload.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR) { + return handlePushSearchPageAction(state, action, configOptions, stackRouter); + } + return handlePushSplitAction(state, action, configOptions, stackRouter); } // Don't let the user navigate back to a non-onboarding screen if they are currently on an onboarding screen and it's not finished. From 23a7d07c98c05a761b394d6ac1feed13603efad2 Mon Sep 17 00:00:00 2001 From: borys3kk Date: Fri, 23 May 2025 16:04:47 +0200 Subject: [PATCH 3/8] flattened styles to only use .splitNavigator options --- .../Navigation/AppNavigator/AuthScreens.tsx | 47 +++++++------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index bc8dfe4e28d5..981cc5942723 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -30,7 +30,6 @@ import getCurrentUrl from '@libs/Navigation/currentUrl'; import Navigation from '@libs/Navigation/Navigation'; import Animations from '@libs/Navigation/PlatformStackNavigation/navigationOptions/animation'; import Presentation from '@libs/Navigation/PlatformStackNavigation/navigationOptions/presentation'; -import type {PlatformStackNavigationOptions} from '@libs/Navigation/PlatformStackNavigation/types'; import type {AuthScreensParamList} from '@libs/Navigation/types'; import NetworkConnection from '@libs/NetworkConnection'; import onyxSubscribe from '@libs/onyxSubscribe'; @@ -463,32 +462,20 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie }; }; - const getFullScreenNavigatorOptions = - (routesWithEnteringAnimation: Set, defaultOptions: PlatformStackNavigationOptions) => - ({route}: {route: RouteProp}) => { - // We don't need to do anything special for the wide screen. - if (!shouldUseNarrowLayout) { - return defaultOptions; - } - // On the narrow screen, we want to animate this navigator if pushed SplitNavigator includes desired screen - const animationEnabled = routesWithEnteringAnimation.has(route.key); - return { - ...defaultOptions, - animation: animationEnabled ? Animations.SLIDE_FROM_RIGHT : Animations.NONE, - }; - }; - - // Animation is enabled when navigating to the report screen - const getReportsSplitNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); - - // Animation is enabled when navigating to any screen different than SCREENS.SETTINGS.ROOT - const getSettingsSplitNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); - - // Animation is enabled when navigating to any screen different than SCREENS.WORKSPACE_HUB.ROOT - const getWorkspaceHubSplitNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.splitNavigator); + // Animation is enabled when navigating to any screen different than split central screen + const getFullscreenNavigatorOptions = ({route}: {route: RouteProp}) => { + // We don't need to do anything special for the wide screen. + if (!shouldUseNarrowLayout) { + return rootNavigatorScreenOptions.splitNavigator; + } - // Animation is enabled when navigating to SCREENS.SEARCH.MONEY_REQUEST_REPORT - const getSearchFullscreenNavigatorOptions = getFullScreenNavigatorOptions(screensWithEnteringAnimation, rootNavigatorScreenOptions.fullScreen); + // On the narrow screen, we want to animate this navigator if pushed SplitNavigator includes desired screen + const animationEnabled = screensWithEnteringAnimation.has(route.key); + return { + ...rootNavigatorScreenOptions.splitNavigator, + animation: animationEnabled ? Animations.SLIDE_FROM_RIGHT : Animations.NONE, + }; + }; const clearStatus = () => { User.clearCustomStatus(); @@ -529,22 +516,22 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie {/* This has to be the first navigator in auth screens. */} Date: Fri, 23 May 2025 16:07:00 +0200 Subject: [PATCH 4/8] remove unnecesary handlers --- .../GetStateForActionHandlers.ts | 35 +++---------------- .../RootStackRouter.ts | 13 +++---- 2 files changed, 10 insertions(+), 38 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts index 75886b296ae9..b31c48fe47d4 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts @@ -1,8 +1,8 @@ import type {CommonActions, RouterConfigOptions, StackActionType, StackNavigationState} from '@react-navigation/native'; import {StackActions} from '@react-navigation/native'; import type {ParamListBase, Router} from '@react-navigation/routers'; +import SCREENS_WITH_NAVIGATION_TAB_BAR from '@components/Navigation/TopLevelNavigationTabBar/SCREENS_WITH_NAVIGATION_TAB_BAR'; import Log from '@libs/Log'; -import {SPLIT_TO_SIDEBAR} from '@libs/Navigation/linkingConfig/RELATIONS'; import type {RootNavigatorParamList} from '@libs/Navigation/types'; import * as SearchQueryUtils from '@libs/SearchQueryUtils'; import NAVIGATORS from '@src/NAVIGATORS'; @@ -140,7 +140,7 @@ function handleSwitchPolicyIDAction( return null; } -function handlePushSplitAction( +function handlePushFullscreenAction( state: StackNavigationState, action: PushActionType, configOptions: RouterConfigOptions, @@ -158,37 +158,13 @@ function handlePushSplitAction( const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? (action.payload?.params?.screen as string) : undefined; // Transitioning to all central screens in each split should be animated - if (lastFullScreenRoute?.key && navigatorName in SPLIT_TO_SIDEBAR && SPLIT_TO_SIDEBAR[navigatorName as keyof typeof SPLIT_TO_SIDEBAR] !== actionPayloadScreen) { + if (lastFullScreenRoute?.key && actionPayloadScreen && !SCREENS_WITH_NAVIGATION_TAB_BAR.includes(actionPayloadScreen)) { screensWithEnteringAnimation.add(lastFullScreenRoute.key); } return stateWithNavigator; } -function handlePushSearchPageAction( - state: StackNavigationState, - action: PushActionType, - configOptions: RouterConfigOptions, - stackRouter: Router, CommonActions.Action | StackActionType>, -) { - const stateWithSearchFullscreenNavigator = stackRouter.getStateForAction(state, action, configOptions); - - if (!stateWithSearchFullscreenNavigator) { - Log.hmmm('[handlePushSettingsAction] SearchFullscreenNavigator has not been found in the navigation state.'); - return null; - } - - const lastFullScreenRoute = stateWithSearchFullscreenNavigator.routes.at(-1); - const actionPayloadScreen = action.payload?.params && 'screen' in action.payload.params ? action.payload?.params?.screen : undefined; - - // Transitioning to SCREENS.SEARCH.MONEY_REQUEST_REPORT should be animated - if (actionPayloadScreen === SCREENS.SEARCH.MONEY_REQUEST_REPORT && lastFullScreenRoute?.key) { - screensWithEnteringAnimation.add(lastFullScreenRoute.key); - } - - return stateWithSearchFullscreenNavigator; -} - function handleReplaceReportsSplitNavigatorAction( state: StackNavigationState, action: ReplaceActionType, @@ -249,11 +225,10 @@ export { handleDismissModalAction, handleNavigatingToModalFromModal, handleOpenWorkspaceSplitAction, - handlePushSplitAction, - handlePushSearchPageAction, - screensWithEnteringAnimation, + handlePushFullscreenAction, handleReplaceReportsSplitNavigatorAction, handleSwitchPolicyIDAction, handleSwitchPolicyIDFromSearchAction, + screensWithEnteringAnimation, workspaceSplitsWithoutEnteringAnimation, }; diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts index 7c8c699d4fd7..3905f23ac66e 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts @@ -1,10 +1,11 @@ +/* eslint-disable no-console */ import type {CommonActions, RouterConfigOptions, StackActionType, StackNavigationState} from '@react-navigation/native'; import {findFocusedRoute, StackRouter} from '@react-navigation/native'; import type {ParamListBase} from '@react-navigation/routers'; import useActiveWorkspace from '@hooks/useActiveWorkspace'; import {updateLastAccessedWorkspaceSwitcher} from '@libs/actions/Policy/Policy'; import * as Localize from '@libs/Localize'; -import {isOnboardingFlowName} from '@libs/Navigation/helpers/isNavigatorName'; +import {isFullScreenName, isOnboardingFlowName} from '@libs/Navigation/helpers/isNavigatorName'; import isSideModalNavigator from '@libs/Navigation/helpers/isSideModalNavigator'; import * as Welcome from '@userActions/Welcome'; import CONST from '@src/CONST'; @@ -13,8 +14,7 @@ import { handleDismissModalAction, handleNavigatingToModalFromModal, handleOpenWorkspaceSplitAction, - handlePushSearchPageAction, - handlePushSplitAction, + handlePushFullscreenAction, handleReplaceReportsSplitNavigatorAction, handleSwitchPolicyIDAction, } from './GetStateForActionHandlers'; @@ -104,11 +104,8 @@ function RootStackRouter(options: RootStackNavigatorRouterOptions) { return handleReplaceReportsSplitNavigatorAction(state, action, configOptions, stackRouter); } - if (isPushAction(action)) { - if (action.payload.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR) { - return handlePushSearchPageAction(state, action, configOptions, stackRouter); - } - return handlePushSplitAction(state, action, configOptions, stackRouter); + if (isPushAction(action) && isFullScreenName(action.payload.name)) { + return handlePushFullscreenAction(state, action, configOptions, stackRouter); } // Don't let the user navigate back to a non-onboarding screen if they are currently on an onboarding screen and it's not finished. From 112d0b4c0b25e77c63c6578a907976ec50b116fc Mon Sep 17 00:00:00 2001 From: borys3kk Date: Mon, 26 May 2025 12:37:37 +0200 Subject: [PATCH 5/8] remove unnecessary eslint rule --- .../AppNavigator/createRootStackNavigator/RootStackRouter.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts index 3905f23ac66e..efef247fcdab 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import type {CommonActions, RouterConfigOptions, StackActionType, StackNavigationState} from '@react-navigation/native'; import {findFocusedRoute, StackRouter} from '@react-navigation/native'; import type {ParamListBase} from '@react-navigation/routers'; From 3c0ad3decd9d2732ddf34e1b652d462f920d3573 Mon Sep 17 00:00:00 2001 From: borys3kk Date: Mon, 26 May 2025 14:02:18 +0200 Subject: [PATCH 6/8] add comment explaining changes / update comment in authscreens --- src/libs/Navigation/AppNavigator/AuthScreens.tsx | 2 +- .../AppNavigator/createRootStackNavigator/RootStackRouter.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/AuthScreens.tsx b/src/libs/Navigation/AppNavigator/AuthScreens.tsx index 981cc5942723..ccf36378d10d 100644 --- a/src/libs/Navigation/AppNavigator/AuthScreens.tsx +++ b/src/libs/Navigation/AppNavigator/AuthScreens.tsx @@ -462,7 +462,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie }; }; - // Animation is enabled when navigating to any screen different than split central screen + // Animation is enabled when navigating to any screen different than split sidebar screen const getFullscreenNavigatorOptions = ({route}: {route: RouteProp}) => { // We don't need to do anything special for the wide screen. if (!shouldUseNarrowLayout) { diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts index efef247fcdab..11528d931ea4 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts @@ -103,7 +103,10 @@ function RootStackRouter(options: RootStackNavigatorRouterOptions) { return handleReplaceReportsSplitNavigatorAction(state, action, configOptions, stackRouter); } - if (isPushAction(action) && isFullScreenName(action.payload.name)) { + // When navigating to specific Workspace from WorkspaceListPage there should be entering animation for it's sidebar (only case where we want animation for sidebar) + // That's why we have separate handler for opening it called handleOpenWorkspaceSplitAction + // options for WorkspaceSplit can be found in AuthScreens.tsx > getWorkspaceSplitNavigatorOptions + if (isPushAction(action) && isFullScreenName(action.payload.name) && action.payload.name !== NAVIGATORS.WORKSPACE_SPLIT_NAVIGATOR) { return handlePushFullscreenAction(state, action, configOptions, stackRouter); } From 1b24af220133d738ff780ea9afad4237b7298aaa Mon Sep 17 00:00:00 2001 From: borys3kk Date: Mon, 26 May 2025 16:31:52 +0200 Subject: [PATCH 7/8] modify comment --- .../createRootStackNavigator/RootStackRouter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts index 11528d931ea4..2e688b31063f 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/RootStackRouter.ts @@ -103,9 +103,9 @@ function RootStackRouter(options: RootStackNavigatorRouterOptions) { return handleReplaceReportsSplitNavigatorAction(state, action, configOptions, stackRouter); } - // When navigating to specific Workspace from WorkspaceListPage there should be entering animation for it's sidebar (only case where we want animation for sidebar) - // That's why we have separate handler for opening it called handleOpenWorkspaceSplitAction - // options for WorkspaceSplit can be found in AuthScreens.tsx > getWorkspaceSplitNavigatorOptions + // When navigating to a specific workspace from WorkspaceListPage there should be entering animation for its sidebar (only case where we want animation for sidebar) + // That's why we have a separate handler for opening it called handleOpenWorkspaceSplitAction + // options for WorkspaceSplitNavigator can be found in AuthScreens.tsx > getWorkspaceSplitNavigatorOptions if (isPushAction(action) && isFullScreenName(action.payload.name) && action.payload.name !== NAVIGATORS.WORKSPACE_SPLIT_NAVIGATOR) { return handlePushFullscreenAction(state, action, configOptions, stackRouter); } From 7a227424c402dbdb2c7ff77b6f48f2cb3b3b7318 Mon Sep 17 00:00:00 2001 From: borys3kk Date: Wed, 28 May 2025 10:59:12 +0200 Subject: [PATCH 8/8] fix post merge issues --- .../createRootStackNavigator/GetStateForActionHandlers.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts b/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts index 2031bdfdadcd..2ecfcd3eb3b0 100644 --- a/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts +++ b/src/libs/Navigation/AppNavigator/createRootStackNavigator/GetStateForActionHandlers.ts @@ -162,8 +162,6 @@ export { handleOpenWorkspaceSplitAction, handlePushFullscreenAction, handleReplaceReportsSplitNavigatorAction, - handleSwitchPolicyIDAction, - handleSwitchPolicyIDFromSearchAction, screensWithEnteringAnimation, workspaceSplitsWithoutEnteringAnimation, };