diff --git a/src/components/MoneyRequestHeader.js b/src/components/MoneyRequestHeader.js index a0e0fc3b70ad..93d31a1390f4 100644 --- a/src/components/MoneyRequestHeader.js +++ b/src/components/MoneyRequestHeader.js @@ -109,7 +109,7 @@ function MoneyRequestHeader(props) { policies={props.policies} personalDetails={props.personalDetails} shouldShowBackButton={props.isSmallScreenWidth} - onBackButtonPress={() => Navigation.goBack(ROUTES.HOME)} + onBackButtonPress={() => Navigation.goBack(ROUTES.HOME, false, true)} /> {props.translate('common.to')} diff --git a/src/libs/Navigation/Navigation.js b/src/libs/Navigation/Navigation.js index 167f2d9eea96..c6719e29632e 100644 --- a/src/libs/Navigation/Navigation.js +++ b/src/libs/Navigation/Navigation.js @@ -19,6 +19,15 @@ const navigationIsReadyPromise = new Promise((resolve) => { let pendingRoute = null; +let shouldPopAllStateOnUP = false; + +/** + * Inform the navigation that next time user presses UP we should pop all the state back to LHN. + */ +function setShouldPopAllStateOnUP() { + shouldPopAllStateOnUP = true; +} + /** * @param {String} methodName * @param {Object} params @@ -84,12 +93,21 @@ function navigate(route = ROUTES.HOME, type) { /** * @param {String} fallbackRoute - Fallback route if pop/goBack action should, but is not possible within RHP * @param {Bool} shouldEnforceFallback - Enforces navigation to fallback route + * @param {Bool} shouldPopToTop - Should we navigate to LHN on back press */ -function goBack(fallbackRoute = ROUTES.HOME, shouldEnforceFallback = false) { +function goBack(fallbackRoute = ROUTES.HOME, shouldEnforceFallback = false, shouldPopToTop = false) { if (!canNavigate('goBack')) { return; } + if (shouldPopToTop) { + if (shouldPopAllStateOnUP) { + shouldPopAllStateOnUP = false; + navigationRef.current.dispatch(StackActions.popToTop()); + return; + } + } + if (!navigationRef.current.canGoBack()) { Log.hmmm('[Navigation] Unable to go back'); return; @@ -215,6 +233,7 @@ function setIsNavigationReady() { } export default { + setShouldPopAllStateOnUP, canNavigate, navigate, setParams, diff --git a/src/libs/Navigation/NavigationRoot.js b/src/libs/Navigation/NavigationRoot.js index ee389e530d0f..ee4affa81a36 100644 --- a/src/libs/Navigation/NavigationRoot.js +++ b/src/libs/Navigation/NavigationRoot.js @@ -1,4 +1,4 @@ -import React, {useRef} from 'react'; +import React, {useRef, useEffect} from 'react'; import PropTypes from 'prop-types'; import {NavigationContainer, DefaultTheme, getPathFromState} from '@react-navigation/native'; import {useFlipper} from '@react-navigation/devtools'; @@ -55,6 +55,21 @@ function parseAndLogRoute(state) { function NavigationRoot(props) { useFlipper(navigationRef); const navigationStateRef = useRef(undefined); + const firstRenderRef = useRef(true); + + useEffect(() => { + if (firstRenderRef.current) { + // we don't want to make the report back button go back to LHN if the user + // started on the small screen so we don't set it on the first render + // making it only work on consecutive changes of the screen size + firstRenderRef.current = false; + return; + } + if (!props.isSmallScreenWidth) { + return; + } + Navigation.setShouldPopAllStateOnUP(); + }, [props.isSmallScreenWidth]); const updateSavedNavigationStateAndLogRoute = (state) => { if (!state) { diff --git a/src/pages/home/ReportScreen.js b/src/pages/home/ReportScreen.js index e9229698d3d2..679e6c33db2d 100644 --- a/src/pages/home/ReportScreen.js +++ b/src/pages/home/ReportScreen.js @@ -281,7 +281,7 @@ class ReportScreen extends React.Component { ) : ( Navigation.goBack(ROUTES.HOME)} + onNavigationMenuButtonClicked={() => Navigation.goBack(ROUTES.HOME, false, true)} personalDetails={this.props.personalDetails} report={this.props.report} />