import * as React from 'react'; import { Animated, View, StyleSheet, LayoutChangeEvent, Dimensions, Platform, ViewProps, } from 'react-native'; import { EdgeInsets } from 'react-native-safe-area-context'; // eslint-disable-next-line import/no-unresolved import { ScreenContainer, Screen, screensEnabled } from 'react-native-screens'; // Import with * as to prevent getters being called import { Route, StackNavigationState } from '@react-navigation/native'; import { getDefaultHeaderHeight } from '../Header/HeaderSegment'; import { Props as HeaderContainerProps } from '../Header/HeaderContainer'; import CardContainer from './CardContainer'; import { DefaultTransition, ModalTransition, } from '../../TransitionConfigs/TransitionPresets'; import { forNoAnimation as forNoAnimationHeader } from '../../TransitionConfigs/HeaderStyleInterpolators'; import { forNoAnimation as forNoAnimationCard } from '../../TransitionConfigs/CardStyleInterpolators'; import getDistanceForDirection from '../../utils/getDistanceForDirection'; import { Layout, StackHeaderMode, StackCardMode, Scene, StackDescriptorMap, StackNavigationOptions, StackDescriptor, } from '../../types'; type GestureValues = { [key: string]: Animated.Value; }; type Props = { mode: StackCardMode; insets: EdgeInsets; state: StackNavigationState; descriptors: StackDescriptorMap; routes: Route[]; openingRouteKeys: string[]; closingRouteKeys: string[]; onOpenRoute: (props: { route: Route }) => void; onCloseRoute: (props: { route: Route }) => void; getPreviousRoute: (props: { route: Route; }) => Route | undefined; getGesturesEnabled: (props: { route: Route }) => boolean; renderHeader: (props: HeaderContainerProps) => React.ReactNode; renderScene: (props: { route: Route }) => React.ReactNode; headerMode: StackHeaderMode; onTransitionStart: ( props: { route: Route }, closing: boolean ) => void; onTransitionEnd: (props: { route: Route }, closing: boolean) => void; onPageChangeStart?: () => void; onPageChangeConfirm?: () => void; onPageChangeCancel?: () => void; }; type State = { routes: Route[]; descriptors: StackDescriptorMap; scenes: Scene>[]; gestures: GestureValues; layout: Layout; headerHeights: Record; }; const EPSILON = 0.01; // The web implementation in react-native-screens seems buggy. // The view doesn't become visible after coming back in some cases. // So we use our custom implementation. class WebScreen extends React.Component< ViewProps & { active: number; children: React.ReactNode; } > { render() { const { active, style, ...rest } = this.props; return (