import { NavigationContext, NavigationProp, NavigationRouteContext, ParamListBase, RouteProp, } from '@react-navigation/native'; import * as React from 'react'; import { StyleProp, StyleSheet, View, ViewStyle } from 'react-native'; import { useSafeAreaFrame, useSafeAreaInsets, } from 'react-native-safe-area-context'; import Background from './Background'; import getDefaultHeaderHeight from './Header/getDefaultHeaderHeight'; import HeaderHeightContext from './Header/HeaderHeightContext'; import HeaderShownContext from './Header/HeaderShownContext'; type Props = { focused: boolean; modal?: boolean; navigation: NavigationProp; route: RouteProp; header: React.ReactNode; headerShown?: boolean; headerStatusBarHeight?: number; headerTransparent?: boolean; style?: StyleProp; children: React.ReactNode; }; export default function Screen(props: Props) { const dimensions = useSafeAreaFrame(); const insets = useSafeAreaInsets(); const isParentHeaderShown = React.useContext(HeaderShownContext); const parentHeaderHeight = React.useContext(HeaderHeightContext); const { focused, modal = false, header, headerShown = true, headerTransparent, headerStatusBarHeight = isParentHeaderShown ? 0 : insets.top, navigation, route, children, style, } = props; const [headerHeight, setHeaderHeight] = React.useState(() => getDefaultHeaderHeight(dimensions, modal, headerStatusBarHeight) ); return ( {children} {headerShown ? ( { const { height } = e.nativeEvent.layout; setHeaderHeight(height); }} style={headerTransparent ? styles.absolute : null} > {header} ) : null} ); } const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'column-reverse', }, // This is necessary to avoid applying 'column-reverse' to screen content content: { flex: 1, }, absolute: { position: 'absolute', top: 0, left: 0, right: 0, }, });