/* @flow */ import * as React from 'react'; import { NativeModules } from 'react-native'; import CardStack from './CardStack'; import CardStackStyleInterpolator from './CardStackStyleInterpolator'; import Transitioner from '../Transitioner'; import TransitionConfigs from './TransitionConfigs'; import type { NavigationSceneRenderer, NavigationScreenProp, NavigationStackScreenOptions, NavigationState, NavigationTransitionProps, NavigationNavigatorProps, NavigationRouter, HeaderMode, ViewStyleProp, TransitionConfig, } from '../../TypeDefinition'; const NativeAnimatedModule = NativeModules && NativeModules.NativeAnimatedModule; type Props = { headerMode: HeaderMode, mode: 'card' | 'modal', router: NavigationRouter, cardStyle?: ViewStyleProp, onTransitionStart?: () => void, onTransitionEnd?: () => void, /** * Optional custom animation when transitioning between screens. */ transitionConfig?: () => TransitionConfig, } & NavigationNavigatorProps; class CardStackTransitioner extends React.Component { _render: NavigationSceneRenderer; static defaultProps = { mode: 'card', }; render() { return ( ); } _configureTransition = ( // props for the new screen transitionProps: NavigationTransitionProps, // props for the old screen prevTransitionProps: ?NavigationTransitionProps ) => { const isModal = this.props.mode === 'modal'; // Copy the object so we can assign useNativeDriver below // (avoid Flow error, transitionSpec is of type NavigationTransitionSpec). const transitionSpec = { ...TransitionConfigs.getTransitionConfig( this.props.transitionConfig, transitionProps, prevTransitionProps, isModal ).transitionSpec, }; if ( !!NativeAnimatedModule && // Native animation support also depends on the transforms used: CardStackStyleInterpolator.canUseNativeDriver() ) { // Internal undocumented prop transitionSpec.useNativeDriver = true; } return transitionSpec; }; _render = (props: NavigationTransitionProps): React.Node => { const { screenProps, headerMode, mode, router, cardStyle, transitionConfig, } = this.props; return ( ); }; } export default CardStackTransitioner;