diff --git a/example/src/Screens/ModalPresentationStack.tsx b/example/src/Screens/ModalPresentationStack.tsx index 04719a18..2bbd162a 100644 --- a/example/src/Screens/ModalPresentationStack.tsx +++ b/example/src/Screens/ModalPresentationStack.tsx @@ -6,7 +6,6 @@ import { createStackNavigator, StackScreenProps, StackNavigationOptions, - TransitionPresets, } from '@react-navigation/stack'; import Article from '../Shared/Article'; import Albums from '../Shared/Albums'; @@ -88,17 +87,17 @@ export default function SimpleStackScreen({ navigation, options }: Props) { return ( ({ - ...TransitionPresets.ModalPresentationIOS, - cardOverlayEnabled: true, - gestureEnabled: true, - headerStatusBarHeight: - navigation - .dangerouslyGetState() - .routes.findIndex((r: any) => r.key === route.key) > 0 - ? 0 - : undefined, - })} + // screenOptions={({ route, navigation }) => ({ + // ...TransitionPresets.ModalPresentationIOS, + // cardOverlayEnabled: true, + // gestureEnabled: true, + // headerStatusBarHeight: + // navigation + // .dangerouslyGetState() + // .routes.findIndex((r: any) => r.key === route.key) > 0 + // ? 0 + // : undefined, + // })} {...options} > state.routes[0].key === scene.route.key + ); + + const statusBarHeight = + (isModal && !isFirstRouteInParent) || isParentHeaderShown ? 0 : insets.top; + return ( : options.headerTitle } + headerStatusBarHeight={statusBarHeight} onGoBack={previous ? goBack : undefined} styleInterpolator={styleInterpolator} /> diff --git a/packages/stack/src/views/Header/HeaderSegment.tsx b/packages/stack/src/views/Header/HeaderSegment.tsx index 91e7817d..8bbd4759 100644 --- a/packages/stack/src/views/Header/HeaderSegment.tsx +++ b/packages/stack/src/views/Header/HeaderSegment.tsx @@ -11,7 +11,6 @@ import type { EdgeInsets } from 'react-native-safe-area-context'; import type { Route } from '@react-navigation/native'; import HeaderBackButton from './HeaderBackButton'; import HeaderBackground from './HeaderBackground'; -import HeaderShownContext from '../../utils/HeaderShownContext'; import memoize from '../../utils/memoize'; import type { Layout, @@ -22,8 +21,12 @@ import type { Scene, } from '../../types'; -type Props = StackHeaderOptions & { +type Props = Omit< + StackHeaderOptions, + 'headerTitle' | 'headerStatusBarHeight' +> & { headerTitle: (props: StackHeaderTitleProps) => React.ReactNode; + headerStatusBarHeight: number; layout: Layout; insets: EdgeInsets; onGoBack?: () => void; @@ -81,8 +84,6 @@ export default function HeaderSegment(props: Props) { undefined ); - const isParentHeaderShown = React.useContext(HeaderShownContext); - const handleTitleLayout = (e: LayoutChangeEvent) => { const { height, width } = e.nativeEvent.layout; @@ -171,7 +172,7 @@ export default function HeaderSegment(props: Props) { headerRightContainerStyle: rightContainerStyle, headerTitleContainerStyle: titleContainerStyle, headerStyle: customHeaderStyle, - headerStatusBarHeight = isParentHeaderShown ? 0 : insets.top, + headerStatusBarHeight, styleInterpolator, } = props; diff --git a/packages/stack/src/views/Stack/Card.tsx b/packages/stack/src/views/Stack/Card.tsx index 6217af4d..cd4f6656 100755 --- a/packages/stack/src/views/Stack/Card.tsx +++ b/packages/stack/src/views/Stack/Card.tsx @@ -90,7 +90,6 @@ const hasOpacityStyle = (style: any) => { export default class Card extends React.Component { static defaultProps = { - overlayEnabled: Platform.OS !== 'ios', shadowEnabled: true, gestureEnabled: true, gestureVelocityImpact: GESTURE_VELOCITY_IMPACT, diff --git a/packages/stack/src/views/Stack/CardContainer.tsx b/packages/stack/src/views/Stack/CardContainer.tsx index fee555ec..b5506095 100644 --- a/packages/stack/src/views/Stack/CardContainer.tsx +++ b/packages/stack/src/views/Stack/CardContainer.tsx @@ -3,9 +3,11 @@ import { Animated, View, StyleSheet, StyleProp, ViewStyle } from 'react-native'; import { Route, useTheme } from '@react-navigation/native'; import type { Props as HeaderContainerProps } from '../Header/HeaderContainer'; import Card from './Card'; +import { forModalPresentationIOS } from '../../TransitionConfigs/CardStyleInterpolators'; import HeaderHeightContext from '../../utils/HeaderHeightContext'; import HeaderShownContext from '../../utils/HeaderShownContext'; import PreviousSceneContext from '../../utils/PreviousSceneContext'; +import ModalPresentationContext from '../../utils/ModalPresentationContext'; import type { Scene, Layout, @@ -29,7 +31,7 @@ type Props = TransitionPreset & { cardOverlay?: (props: { style: Animated.WithAnimatedValue>; }) => React.ReactNode; - cardOverlayEnabled?: boolean; + cardOverlayEnabled: boolean; cardShadowEnabled?: boolean; cardStyle?: StyleProp; getPreviousScene: (props: { @@ -184,6 +186,7 @@ function CardContainer({ }, [pointerEvents, scene.progress.next]); const previousScene = getPreviousScene({ route: scene.route }); + const isModalPresentation = cardStyleInterpolator === forModalPresentationIOS; return ( - {headerMode !== 'float' - ? renderHeader({ + {headerMode !== 'float' ? ( + + {renderHeader({ mode: 'screen', layout, insets, @@ -247,8 +251,9 @@ function CardContainer({ gestureDirection, styleInterpolator: headerStyleInterpolator, onContentHeightChange: onHeaderHeightChange, - }) - : null} + })} + + ) : null} ); diff --git a/packages/stack/src/views/Stack/CardStack.tsx b/packages/stack/src/views/Stack/CardStack.tsx index 4b4c9a77..dde41e42 100755 --- a/packages/stack/src/views/Stack/CardStack.tsx +++ b/packages/stack/src/views/Stack/CardStack.tsx @@ -4,6 +4,7 @@ import { StyleSheet, LayoutChangeEvent, Dimensions, + Platform, } from 'react-native'; import type { EdgeInsets } from 'react-native-safe-area-context'; import type { @@ -542,7 +543,7 @@ export default class CardStack extends React.Component { headerShown = true, headerTransparent, cardShadowEnabled, - cardOverlayEnabled, + cardOverlayEnabled = Platform.OS !== 'ios' || mode === 'modal', cardOverlay, cardStyle, animationEnabled,