From fc95d7a256846b6a4fa999fbbe3fed2051972b42 Mon Sep 17 00:00:00 2001 From: Satyajit Sahoo Date: Thu, 25 Jun 2020 11:42:19 +0200 Subject: [PATCH] fix: fix showing back button with headerMode=screen. fixes #8508 --- .../src/views/Header/HeaderContainer.tsx | 6 +--- .../stack/src/views/Stack/CardContainer.tsx | 3 +- packages/stack/src/views/Stack/CardStack.tsx | 28 ++++++------------- 3 files changed, 11 insertions(+), 26 deletions(-) diff --git a/packages/stack/src/views/Header/HeaderContainer.tsx b/packages/stack/src/views/Header/HeaderContainer.tsx index ff150fb2..d31829c5 100644 --- a/packages/stack/src/views/Header/HeaderContainer.tsx +++ b/packages/stack/src/views/Header/HeaderContainer.tsx @@ -32,7 +32,6 @@ export type Props = { scenes: (Scene> | undefined)[]; getPreviousScene: (props: { route: Route; - index: number; }) => Scene> | undefined; getFocusedRoute: () => Route; onContentHeightChange?: (props: { @@ -79,10 +78,7 @@ export default function HeaderContainer({ const isFocused = focusedRoute.key === scene.route.key; const previous = - getPreviousScene({ - route: scene.route, - index: i, - }) ?? parentPreviousScene; + getPreviousScene({ route: scene.route }) ?? parentPreviousScene; // If the screen is next to a headerless screen, we need to make the header appear static // This makes the header look like it's moving with the screen diff --git a/packages/stack/src/views/Stack/CardContainer.tsx b/packages/stack/src/views/Stack/CardContainer.tsx index 92cdfb10..965ef7e4 100644 --- a/packages/stack/src/views/Stack/CardContainer.tsx +++ b/packages/stack/src/views/Stack/CardContainer.tsx @@ -32,7 +32,6 @@ type Props = TransitionPreset & { cardStyle?: StyleProp; getPreviousScene: (props: { route: Route; - index: number; }) => Scene> | undefined; getFocusedRoute: () => Route; renderHeader: (props: HeaderContainerProps) => React.ReactNode; @@ -162,7 +161,7 @@ function CardContainer({ const isParentHeaderShown = React.useContext(HeaderShownContext); const isCurrentHeaderShown = headerMode !== 'none' && headerShown !== false; - const previousScene = getPreviousScene({ route: scene.route, index }); + const previousScene = getPreviousScene({ route: scene.route }); return ( { return state.routes[state.index]; }; - private getPreviousScene = ({ - route, - index, - }: { - route: Route; - index: number; - }) => { - const previousRoute = this.props.getPreviousRoute({ route }); + private getPreviousScene = ({ route }: { route: Route }) => { + const { getPreviousRoute } = this.props; + const { scenes } = this.state; - let previous: Scene> | undefined; + const previousRoute = getPreviousRoute({ route }); if (previousRoute) { - // The previous scene will be shortly before the current scene in the array - // So loop back from current index to avoid looping over the full array - for (let j = index - 1; j >= 0; j--) { - const s = this.state.scenes[j]; + const previousScene = scenes.find( + (scene) => scene.route.key === previousRoute.key + ); - if (s && s.route.key === previousRoute.key) { - previous = s; - break; - } - } + return previousScene; } - return previous; + return undefined; }; render() {