Skip to content
This repository was archived by the owner on Feb 25, 2020. It is now read-only.

Commit 16823e3

Browse files
tchayensatya164
authored andcommitted
feat: allow specifying style interpolators in navigationOptions (#155)
1 parent 7cecfcf commit 16823e3

File tree

8 files changed

+68
-77
lines changed

8 files changed

+68
-77
lines changed

example/src/HeaderBackgrounds.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,18 @@ function createHeaderBackgroundExample(options = {}) {
9494
);
9595
}
9696
export const HeaderBackgroundDefault = createHeaderBackgroundExample({
97-
...TransitionPresets.SlideFromRightIOS,
98-
headerStyleInterpolator: HeaderStyleInterpolators.forUIKit,
97+
defaultNavigationOptions: {
98+
...TransitionPresets.SlideFromRightIOS,
99+
headerStyleInterpolator: HeaderStyleInterpolators.forUIKit,
100+
},
99101
headerMode: 'float',
100102
});
101103

102104
export const HeaderBackgroundFade = createHeaderBackgroundExample({
103-
...TransitionPresets.SlideFromRightIOS,
104-
headerStyleInterpolator: HeaderStyleInterpolators.forFade,
105+
defaultNavigationOptions: {
106+
...TransitionPresets.SlideFromRightIOS,
107+
headerStyleInterpolator: HeaderStyleInterpolators.forFade,
108+
},
105109
headerMode: 'float',
106110
});
107111

example/src/HeaderPreset.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ const StackWithHeaderPreset = createStackNavigator(
105105
ScreenWithLongTitle: ScreenWithLongTitle,
106106
},
107107
{
108-
...TransitionPresets.SlideFromRightIOS,
109-
headerStyleInterpolator: HeaderStyleInterpolators.forUIKit,
110108
headerMode: 'float',
111109
defaultNavigationOptions: {
110+
...TransitionPresets.SlideFromRightIOS,
111+
headerStyleInterpolator: HeaderStyleInterpolators.forUIKit,
112112
gesturesEnabled: true,
113113
},
114114
}

example/src/ModalPresentation.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ export default createStackNavigator(
6464
Details: DetailsScreen,
6565
},
6666
{
67-
...TransitionPresets.ModalPresentationIOS,
6867
mode: 'modal',
6968
defaultNavigationOptions: {
69+
...TransitionPresets.ModalPresentationIOS,
7070
cardOverlayEnabled: true,
7171
gesturesEnabled: true,
7272
},

example/src/WipeStack.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,8 @@ export default createStackNavigator(
153153
initialRouteName: 'List',
154154
headerMode: 'screen',
155155
defaultNavigationOptions: {
156+
...TransitionPresets.WipeFromBottomAndroid,
156157
cardOverlayEnabled: true,
157158
},
158-
...TransitionPresets.WipeFromBottomAndroid,
159159
}
160160
);

src/types.tsx

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,24 @@ export type HeaderProps = {
9393
styleInterpolator: HeaderStyleInterpolator;
9494
};
9595

96-
export type NavigationStackOptions = HeaderOptions & {
97-
title?: string;
98-
header?: null | ((props: HeaderProps) => React.ReactNode);
99-
cardShadowEnabled?: boolean;
100-
cardOverlayEnabled?: boolean;
101-
cardTransparent?: boolean;
102-
cardStyle?: StyleProp<ViewStyle>;
103-
animationEnabled?: boolean;
104-
gesturesEnabled?: boolean;
105-
gestureResponseDistance?: {
106-
vertical?: number;
107-
horizontal?: number;
96+
export type NavigationStackOptions = HeaderOptions &
97+
Partial<TransitionPreset> & {
98+
title?: string;
99+
header?: null | ((props: HeaderProps) => React.ReactNode);
100+
cardShadowEnabled?: boolean;
101+
cardOverlayEnabled?: boolean;
102+
cardTransparent?: boolean;
103+
cardStyle?: StyleProp<ViewStyle>;
104+
animationEnabled?: boolean;
105+
gesturesEnabled?: boolean;
106+
gestureResponseDistance?: {
107+
vertical?: number;
108+
horizontal?: number;
109+
};
110+
disableKeyboardHandling?: boolean;
108111
};
109-
disableKeyboardHandling?: boolean;
110-
};
111112

112-
export type NavigationConfig = TransitionPreset & {
113+
export type NavigationConfig = {
113114
mode: 'card' | 'modal';
114115
headerMode: HeaderMode;
115116
};

src/views/Stack/Stack.tsx

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ import { ScreenContainer, NativeScreen } from 'react-native-screens';
1111
import { getDefaultHeaderHeight } from '../Header/HeaderSegment';
1212
import { Props as HeaderContainerProps } from '../Header/HeaderContainer';
1313
import StackItem from './StackItem';
14+
import {
15+
DefaultTransition,
16+
ModalSlideFromBottomIOS,
17+
} from '../../TransitionConfigs/TransitionPresets';
18+
import { forNoAnimation } from '../../TransitionConfigs/HeaderStyleInterpolators';
1419
import {
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

3132
type 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

6156
type 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}

src/views/Stack/StackItem.tsx

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,13 @@ import Card from './Card';
66
import {
77
Route,
88
HeaderScene,
9-
GestureDirection,
109
Layout,
11-
TransitionSpec,
12-
CardStyleInterpolator,
1310
HeaderMode,
1411
NavigationProp,
15-
HeaderStyleInterpolator,
12+
TransitionPreset,
1613
} from '../../types';
1714

18-
type Props = {
15+
type Props = TransitionPreset & {
1916
index: number;
2017
active: boolean;
2118
focused: boolean;
@@ -30,7 +27,6 @@ type Props = {
3027
cardShadowEnabled?: boolean;
3128
cardStyle?: StyleProp<ViewStyle>;
3229
gesturesEnabled?: boolean;
33-
direction: GestureDirection;
3430
getPreviousRoute: (props: { route: Route }) => Route | undefined;
3531
renderHeader: (props: HeaderContainerProps) => React.ReactNode;
3632
renderScene: (props: { route: Route }) => React.ReactNode;
@@ -48,12 +44,6 @@ type Props = {
4844
vertical?: number;
4945
horizontal?: number;
5046
};
51-
transitionSpec: {
52-
open: TransitionSpec;
53-
close: TransitionSpec;
54-
};
55-
headerStyleInterpolator: HeaderStyleInterpolator;
56-
cardStyleInterpolator: CardStyleInterpolator;
5747
headerMode: HeaderMode;
5848
headerTransparent?: boolean;
5949
floaingHeaderHeight: number;
@@ -87,7 +77,6 @@ export default class StackItem extends React.PureComponent<Props> {
8777
navigation,
8878
scene,
8979
previousScene,
90-
direction,
9180
cardTransparent,
9281
cardOverlayEnabled,
9382
cardShadowEnabled,
@@ -97,16 +86,17 @@ export default class StackItem extends React.PureComponent<Props> {
9786
onGestureCanceled,
9887
onGestureEnd,
9988
gestureResponseDistance,
100-
transitionSpec,
101-
headerStyleInterpolator,
102-
cardStyleInterpolator,
10389
floaingHeaderHeight,
10490
hasCustomHeader,
10591
getPreviousRoute,
10692
headerMode,
10793
headerTransparent,
10894
renderHeader,
10995
renderScene,
96+
direction,
97+
transitionSpec,
98+
cardStyleInterpolator,
99+
headerStyleInterpolator,
110100
} = this.props;
111101

112102
return (

src/views/Stack/StackView.tsx

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ import Stack from './Stack';
55
import HeaderContainer, {
66
Props as HeaderContainerProps,
77
} from '../Header/HeaderContainer';
8-
import {
9-
DefaultTransition,
10-
ModalSlideFromBottomIOS,
11-
} from '../../TransitionConfigs/TransitionPresets';
12-
import { forNoAnimation } from '../../TransitionConfigs/HeaderStyleInterpolators';
138
import {
149
NavigationProp,
1510
SceneDescriptor,
@@ -283,20 +278,9 @@ class StackView extends React.Component<Props, State> {
283278
const headerMode =
284279
mode !== 'modal' && Platform.OS === 'ios' ? 'float' : 'screen';
285280

286-
let transitionPreset =
287-
mode === 'modal' && Platform.OS === 'ios'
288-
? ModalSlideFromBottomIOS
289-
: DefaultTransition;
290-
291-
if (headerMode === 'screen') {
292-
transitionPreset = {
293-
...transitionPreset,
294-
headerStyleInterpolator: forNoAnimation,
295-
};
296-
}
297-
298281
return (
299282
<Stack
283+
mode={mode}
300284
getPreviousRoute={this.getPreviousRoute}
301285
getGesturesEnabled={this.getGesturesEnabled}
302286
routes={routes}
@@ -314,7 +298,6 @@ class StackView extends React.Component<Props, State> {
314298
headerMode={headerMode}
315299
navigation={navigation}
316300
descriptors={descriptors}
317-
{...transitionPreset}
318301
{...config}
319302
/>
320303
);

0 commit comments

Comments
 (0)