diff --git a/packages/stack/src/views/Header/Header.tsx b/packages/stack/src/views/Header/Header.tsx index eb82e01d..9b56a550 100644 --- a/packages/stack/src/views/Header/Header.tsx +++ b/packages/stack/src/views/Header/Header.tsx @@ -1,5 +1,5 @@ import { getHeaderTitle, HeaderShownContext } from '@react-navigation/elements'; -import { StackActions, useNavigationState } from '@react-navigation/native'; +import { StackActions } from '@react-navigation/native'; import * as React from 'react'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; @@ -44,14 +44,11 @@ export default React.memo(function Header({ const isModal = React.useContext(ModalPresentationContext); const isParentHeaderShown = React.useContext(HeaderShownContext); - const isFirstRouteInParent = useNavigationState( - (state) => state.routes[0].key === route.key - ); const statusBarHeight = options.headerStatusBarHeight !== undefined ? options.headerStatusBarHeight - : (isModal && !isFirstRouteInParent) || isParentHeaderShown + : isModal || isParentHeaderShown ? 0 : insets.top; @@ -60,7 +57,6 @@ export default React.memo(function Header({ {...options} title={getHeaderTitle(options, route.name)} progress={progress} - insets={insets} layout={layout} modal={isModal} headerBackTitle={ diff --git a/packages/stack/src/views/Header/HeaderSegment.tsx b/packages/stack/src/views/Header/HeaderSegment.tsx index 2798f457..df5211a2 100644 --- a/packages/stack/src/views/Header/HeaderSegment.tsx +++ b/packages/stack/src/views/Header/HeaderSegment.tsx @@ -3,7 +3,6 @@ import { Header, HeaderBackButton, HeaderBackButtonProps, - HeaderShownContext, HeaderTitle, } from '@react-navigation/elements'; import * as React from 'react'; @@ -14,7 +13,6 @@ import { StyleSheet, ViewStyle, } from 'react-native'; -import type { EdgeInsets } from 'react-native-safe-area-context'; import type { Layout, @@ -24,10 +22,10 @@ import type { } from '../../types'; import memoize from '../../utils/memoize'; -type Props = StackHeaderOptions & { +type Props = Omit & { + headerStatusBarHeight: number; layout: Layout; title: string; - insets: EdgeInsets; modal: boolean; onGoBack?: () => void; progress: SceneProgress; @@ -35,8 +33,6 @@ type Props = StackHeaderOptions & { }; export default function HeaderSegment(props: Props) { - const isParentHeaderShown = React.useContext(HeaderShownContext); - const [leftLabelLayout, setLeftLabelLayout] = React.useState(undefined); @@ -100,7 +96,6 @@ export default function HeaderSegment(props: Props) { const { progress, - insets, layout, modal, onGoBack, @@ -121,7 +116,7 @@ export default function HeaderSegment(props: Props) { headerRightContainerStyle, headerBackgroundContainerStyle, headerStyle: customHeaderStyle, - headerStatusBarHeight = isParentHeaderShown ? 0 : insets.top, + headerStatusBarHeight, styleInterpolator, ...rest } = props; diff --git a/packages/stack/src/views/Stack/CardContainer.tsx b/packages/stack/src/views/Stack/CardContainer.tsx index a893cfc6..c73a2a12 100644 --- a/packages/stack/src/views/Stack/CardContainer.tsx +++ b/packages/stack/src/views/Stack/CardContainer.tsx @@ -277,31 +277,31 @@ function CardContainer({ ]} > - - - - + + + - {renderScene({ route: scene.descriptor.route })} - - - - - {headerMode !== 'float' ? ( - - {renderHeader({ - mode: 'screen', - layout, - scenes: [previousScene, scene], - getPreviousScene, - getFocusedRoute, - onContentHeightChange: onHeaderHeightChange, - })} - - ) : null} + + {renderScene({ route: scene.descriptor.route })} + + + + + {headerMode !== 'float' + ? renderHeader({ + mode: 'screen', + layout, + scenes: [previousScene, scene], + getPreviousScene, + getFocusedRoute, + onContentHeightChange: onHeaderHeightChange, + }) + : null} + ); diff --git a/packages/stack/src/views/Stack/CardStack.tsx b/packages/stack/src/views/Stack/CardStack.tsx index 3e112627..b9cc12c8 100755 --- a/packages/stack/src/views/Stack/CardStack.tsx +++ b/packages/stack/src/views/Stack/CardStack.tsx @@ -60,6 +60,7 @@ type Props = { renderHeader: (props: HeaderContainerProps) => React.ReactNode; renderScene: (props: { route: Route }) => React.ReactNode; isParentHeaderShown: boolean; + isParentModal: boolean; onTransitionStart: ( props: { route: Route }, closing: boolean @@ -118,7 +119,15 @@ const getIsModalPresentation = ( ); }; -const getIsModal = (scene: Scene, interpolationIndex: number) => { +const getIsModal = ( + scene: Scene, + interpolationIndex: number, + isParentModal: boolean +) => { + if (isParentModal) { + return true; + } + const { cardStyleInterpolator } = scene.descriptor.options; const isModalPresentation = getIsModalPresentation(cardStyleInterpolator); const isModal = isModalPresentation && interpolationIndex !== 0; @@ -130,6 +139,7 @@ const getHeaderHeights = ( scenes: Scene[], insets: EdgeInsets, isParentHeaderShown: boolean, + isParentModal: boolean, layout: Layout, previous: Record ) => { @@ -147,7 +157,7 @@ const getHeaderHeights = ( : previous[curr.route.key]; const interpolationIndex = getInterpolationIndex(scenes, index); - const isModal = getIsModal(curr, interpolationIndex); + const isModal = getIsModal(curr, interpolationIndex, isParentModal); acc[curr.route.key] = typeof height === 'number' @@ -374,6 +384,7 @@ export default class CardStack extends React.Component { scenes, props.insets, props.isParentHeaderShown, + props.isParentModal, state.layout, state.headerHeights ), @@ -414,6 +425,7 @@ export default class CardStack extends React.Component { state.scenes, props.insets, props.isParentHeaderShown, + props.isParentModal, layout, state.headerHeights ), @@ -478,6 +490,7 @@ export default class CardStack extends React.Component { renderHeader, renderScene, isParentHeaderShown, + isParentModal, onTransitionStart, onTransitionEnd, onGestureStart, @@ -621,7 +634,11 @@ export default class CardStack extends React.Component { // Start from current card and count backwards the number of cards with same interpolation const interpolationIndex = getInterpolationIndex(scenes, index); - const isModal = getIsModal(scene, interpolationIndex); + const isModal = getIsModal( + scene, + interpolationIndex, + isParentModal + ); const isNextScreenTransparent = scenes[index + 1]?.descriptor.options.presentation === diff --git a/packages/stack/src/views/Stack/StackView.tsx b/packages/stack/src/views/Stack/StackView.tsx index 95f90363..6bbce108 100644 --- a/packages/stack/src/views/Stack/StackView.tsx +++ b/packages/stack/src/views/Stack/StackView.tsx @@ -20,6 +20,7 @@ import type { StackNavigationConfig, StackNavigationHelpers, } from '../../types'; +import ModalPresentationContext from '../../utils/ModalPresentationContext'; import { GestureHandlerRootView } from '../GestureHandler'; import HeaderContainer, { Props as HeaderContainerProps, @@ -429,30 +430,35 @@ export default class StackView extends React.Component { {(insets) => ( - - {(isParentHeaderShown) => ( - + + {(isParentModal) => ( + + {(isParentHeaderShown) => ( + + )} + )} - + )}