@@ -11,14 +11,15 @@ import { ScreenContainer, NativeScreen } from 'react-native-screens';
1111import { getDefaultHeaderHeight } from '../Header/HeaderSegment' ;
1212import { Props as HeaderContainerProps } from '../Header/HeaderContainer' ;
1313import StackItem from './StackItem' ;
14+ import {
15+ DefaultTransition ,
16+ ModalSlideFromBottomIOS ,
17+ } from '../../TransitionConfigs/TransitionPresets' ;
18+ import { forNoAnimation } from '../../TransitionConfigs/HeaderStyleInterpolators' ;
1419import {
1520 Route ,
1621 Layout ,
17- TransitionSpec ,
18- CardStyleInterpolator ,
19- HeaderStyleInterpolator ,
2022 HeaderMode ,
21- GestureDirection ,
2223 SceneDescriptor ,
2324 NavigationProp ,
2425 HeaderScene ,
@@ -29,6 +30,7 @@ type ProgressValues = {
2930} ;
3031
3132type Props = {
33+ mode : 'card' | 'modal' ;
3234 navigation : NavigationProp ;
3335 descriptors : { [ key : string ] : SceneDescriptor } ;
3436 routes : Route [ ] ;
@@ -42,20 +44,13 @@ type Props = {
4244 renderHeader : ( props : HeaderContainerProps ) => React . ReactNode ;
4345 renderScene : ( props : { route : Route } ) => React . ReactNode ;
4446 headerMode : HeaderMode ;
45- direction : GestureDirection ;
4647 onTransitionStart ?: (
4748 curr : { index : number } ,
4849 prev : { index : number }
4950 ) => void ;
5051 onGestureBegin ?: ( ) => void ;
5152 onGestureCanceled ?: ( ) => void ;
5253 onGestureEnd ?: ( ) => void ;
53- transitionSpec : {
54- open : TransitionSpec ;
55- close : TransitionSpec ;
56- } ;
57- cardStyleInterpolator : CardStyleInterpolator ;
58- headerStyleInterpolator : HeaderStyleInterpolator ;
5954} ;
6055
6156type State = {
@@ -187,6 +182,7 @@ export default class Stack extends React.Component<Props, State> {
187182
188183 render ( ) {
189184 const {
185+ mode,
190186 descriptors,
191187 navigation,
192188 routes,
@@ -199,18 +195,28 @@ export default class Stack extends React.Component<Props, State> {
199195 renderHeader,
200196 renderScene,
201197 headerMode,
202- direction,
203198 onTransitionStart,
204199 onGestureBegin,
205200 onGestureCanceled,
206201 onGestureEnd,
207- transitionSpec,
208- cardStyleInterpolator,
209- headerStyleInterpolator,
210202 } = this . props ;
211203
212204 const { scenes, layout, progress, floaingHeaderHeight } = this . state ;
205+
213206 const focusedRoute = navigation . state . routes [ navigation . state . index ] ;
207+ const focusedOptions = descriptors [ focusedRoute . key ] . options ;
208+
209+ let defaultTransitionPreset =
210+ mode === 'modal' && Platform . OS === 'ios'
211+ ? ModalSlideFromBottomIOS
212+ : DefaultTransition ;
213+
214+ if ( headerMode === 'screen' ) {
215+ defaultTransitionPreset = {
216+ ...defaultTransitionPreset ,
217+ headerStyleInterpolator : forNoAnimation ,
218+ } ;
219+ }
214220
215221 return (
216222 < React . Fragment >
@@ -242,6 +248,10 @@ export default class Stack extends React.Component<Props, State> {
242248 cardOverlayEnabled,
243249 cardStyle,
244250 gestureResponseDistance,
251+ direction = defaultTransitionPreset . direction ,
252+ transitionSpec = defaultTransitionPreset . transitionSpec ,
253+ cardStyleInterpolator = defaultTransitionPreset . cardStyleInterpolator ,
254+ headerStyleInterpolator = defaultTransitionPreset . headerStyleInterpolator ,
245255 } = descriptor . options ;
246256
247257 return (
@@ -261,7 +271,6 @@ export default class Stack extends React.Component<Props, State> {
261271 scene = { scene }
262272 previousScene = { scenes [ index - 1 ] }
263273 navigation = { navigation }
264- direction = { direction }
265274 cardTransparent = { cardTransparent }
266275 cardOverlayEnabled = { cardOverlayEnabled }
267276 cardShadowEnabled = { cardShadowEnabled }
@@ -271,9 +280,6 @@ export default class Stack extends React.Component<Props, State> {
271280 onGestureCanceled = { onGestureCanceled }
272281 onGestureEnd = { onGestureEnd }
273282 gestureResponseDistance = { gestureResponseDistance }
274- transitionSpec = { transitionSpec }
275- headerStyleInterpolator = { headerStyleInterpolator }
276- cardStyleInterpolator = { cardStyleInterpolator }
277283 floaingHeaderHeight = { floaingHeaderHeight }
278284 hasCustomHeader = { header === null }
279285 getPreviousRoute = { getPreviousRoute }
@@ -285,6 +291,10 @@ export default class Stack extends React.Component<Props, State> {
285291 onCloseRoute = { onCloseRoute }
286292 onTransitionStart = { onTransitionStart }
287293 onGoBack = { onGoBack }
294+ direction = { direction }
295+ transitionSpec = { transitionSpec }
296+ cardStyleInterpolator = { cardStyleInterpolator }
297+ headerStyleInterpolator = { headerStyleInterpolator }
288298 />
289299 </ AnimatedScreen >
290300 ) ;
@@ -298,7 +308,10 @@ export default class Stack extends React.Component<Props, State> {
298308 navigation,
299309 getPreviousRoute,
300310 onLayout : this . handleFloatingHeaderLayout ,
301- styleInterpolator : headerStyleInterpolator ,
311+ styleInterpolator :
312+ focusedOptions . headerStyleInterpolator !== undefined
313+ ? focusedOptions . headerStyleInterpolator
314+ : defaultTransitionPreset . headerStyleInterpolator ,
302315 style : [ styles . header , styles . floating ] ,
303316 } )
304317 : null }
0 commit comments