feat: allow specifying style interpolators in navigationOptions (#155)

This commit is contained in:
Tomasz Czajęcki
2019-07-06 12:41:34 +02:00
committed by satyajit.happy
parent 1cf7dc5f47
commit 282cfe538b
4 changed files with 56 additions and 69 deletions

View File

@@ -93,23 +93,24 @@ export type HeaderProps = {
styleInterpolator: HeaderStyleInterpolator;
};
export type NavigationStackOptions = HeaderOptions & {
title?: string;
header?: null | ((props: HeaderProps) => React.ReactNode);
cardShadowEnabled?: boolean;
cardOverlayEnabled?: boolean;
cardTransparent?: boolean;
cardStyle?: StyleProp<ViewStyle>;
animationEnabled?: boolean;
gesturesEnabled?: boolean;
gestureResponseDistance?: {
vertical?: number;
horizontal?: number;
export type NavigationStackOptions = HeaderOptions &
Partial<TransitionPreset> & {
title?: string;
header?: null | ((props: HeaderProps) => React.ReactNode);
cardShadowEnabled?: boolean;
cardOverlayEnabled?: boolean;
cardTransparent?: boolean;
cardStyle?: StyleProp<ViewStyle>;
animationEnabled?: boolean;
gesturesEnabled?: boolean;
gestureResponseDistance?: {
vertical?: number;
horizontal?: number;
};
disableKeyboardHandling?: boolean;
};
disableKeyboardHandling?: boolean;
};
export type NavigationConfig = TransitionPreset & {
export type NavigationConfig = {
mode: 'card' | 'modal';
headerMode: HeaderMode;
};

View File

@@ -11,14 +11,15 @@ import { ScreenContainer, NativeScreen } from 'react-native-screens';
import { getDefaultHeaderHeight } from '../Header/HeaderSegment';
import { Props as HeaderContainerProps } from '../Header/HeaderContainer';
import StackItem from './StackItem';
import {
DefaultTransition,
ModalSlideFromBottomIOS,
} from '../../TransitionConfigs/TransitionPresets';
import { forNoAnimation } from '../../TransitionConfigs/HeaderStyleInterpolators';
import {
Route,
Layout,
TransitionSpec,
CardStyleInterpolator,
HeaderStyleInterpolator,
HeaderMode,
GestureDirection,
SceneDescriptor,
NavigationProp,
HeaderScene,
@@ -29,6 +30,7 @@ type ProgressValues = {
};
type Props = {
mode: 'card' | 'modal';
navigation: NavigationProp;
descriptors: { [key: string]: SceneDescriptor };
routes: Route[];
@@ -42,7 +44,6 @@ type Props = {
renderHeader: (props: HeaderContainerProps) => React.ReactNode;
renderScene: (props: { route: Route }) => React.ReactNode;
headerMode: HeaderMode;
direction: GestureDirection;
onTransitionStart?: (
curr: { index: number },
prev: { index: number }
@@ -50,12 +51,6 @@ type Props = {
onGestureBegin?: () => void;
onGestureCanceled?: () => void;
onGestureEnd?: () => void;
transitionSpec: {
open: TransitionSpec;
close: TransitionSpec;
};
cardStyleInterpolator: CardStyleInterpolator;
headerStyleInterpolator: HeaderStyleInterpolator;
};
type State = {
@@ -187,6 +182,7 @@ export default class Stack extends React.Component<Props, State> {
render() {
const {
mode,
descriptors,
navigation,
routes,
@@ -199,18 +195,28 @@ export default class Stack extends React.Component<Props, State> {
renderHeader,
renderScene,
headerMode,
direction,
onTransitionStart,
onGestureBegin,
onGestureCanceled,
onGestureEnd,
transitionSpec,
cardStyleInterpolator,
headerStyleInterpolator,
} = this.props;
const { scenes, layout, progress, floaingHeaderHeight } = this.state;
const focusedRoute = navigation.state.routes[navigation.state.index];
const focusedOptions = descriptors[focusedRoute.key].options;
let defaultTransitionPreset =
mode === 'modal' && Platform.OS === 'ios'
? ModalSlideFromBottomIOS
: DefaultTransition;
if (headerMode === 'screen') {
defaultTransitionPreset = {
...defaultTransitionPreset,
headerStyleInterpolator: forNoAnimation,
};
}
return (
<React.Fragment>
@@ -242,6 +248,10 @@ export default class Stack extends React.Component<Props, State> {
cardOverlayEnabled,
cardStyle,
gestureResponseDistance,
direction = defaultTransitionPreset.direction,
transitionSpec = defaultTransitionPreset.transitionSpec,
cardStyleInterpolator = defaultTransitionPreset.cardStyleInterpolator,
headerStyleInterpolator = defaultTransitionPreset.headerStyleInterpolator,
} = descriptor.options;
return (
@@ -261,7 +271,6 @@ export default class Stack extends React.Component<Props, State> {
scene={scene}
previousScene={scenes[index - 1]}
navigation={navigation}
direction={direction}
cardTransparent={cardTransparent}
cardOverlayEnabled={cardOverlayEnabled}
cardShadowEnabled={cardShadowEnabled}
@@ -271,9 +280,6 @@ export default class Stack extends React.Component<Props, State> {
onGestureCanceled={onGestureCanceled}
onGestureEnd={onGestureEnd}
gestureResponseDistance={gestureResponseDistance}
transitionSpec={transitionSpec}
headerStyleInterpolator={headerStyleInterpolator}
cardStyleInterpolator={cardStyleInterpolator}
floaingHeaderHeight={floaingHeaderHeight}
hasCustomHeader={header === null}
getPreviousRoute={getPreviousRoute}
@@ -285,6 +291,10 @@ export default class Stack extends React.Component<Props, State> {
onCloseRoute={onCloseRoute}
onTransitionStart={onTransitionStart}
onGoBack={onGoBack}
direction={direction}
transitionSpec={transitionSpec}
cardStyleInterpolator={cardStyleInterpolator}
headerStyleInterpolator={headerStyleInterpolator}
/>
</AnimatedScreen>
);
@@ -298,7 +308,10 @@ export default class Stack extends React.Component<Props, State> {
navigation,
getPreviousRoute,
onLayout: this.handleFloatingHeaderLayout,
styleInterpolator: headerStyleInterpolator,
styleInterpolator:
focusedOptions.headerStyleInterpolator !== undefined
? focusedOptions.headerStyleInterpolator
: defaultTransitionPreset.headerStyleInterpolator,
style: [styles.header, styles.floating],
})
: null}

View File

@@ -6,16 +6,13 @@ import Card from './Card';
import {
Route,
HeaderScene,
GestureDirection,
Layout,
TransitionSpec,
CardStyleInterpolator,
HeaderMode,
NavigationProp,
HeaderStyleInterpolator,
TransitionPreset,
} from '../../types';
type Props = {
type Props = TransitionPreset & {
index: number;
active: boolean;
focused: boolean;
@@ -30,7 +27,6 @@ type Props = {
cardShadowEnabled?: boolean;
cardStyle?: StyleProp<ViewStyle>;
gesturesEnabled?: boolean;
direction: GestureDirection;
getPreviousRoute: (props: { route: Route }) => Route | undefined;
renderHeader: (props: HeaderContainerProps) => React.ReactNode;
renderScene: (props: { route: Route }) => React.ReactNode;
@@ -48,12 +44,6 @@ type Props = {
vertical?: number;
horizontal?: number;
};
transitionSpec: {
open: TransitionSpec;
close: TransitionSpec;
};
headerStyleInterpolator: HeaderStyleInterpolator;
cardStyleInterpolator: CardStyleInterpolator;
headerMode: HeaderMode;
headerTransparent?: boolean;
floaingHeaderHeight: number;
@@ -87,7 +77,6 @@ export default class StackItem extends React.PureComponent<Props> {
navigation,
scene,
previousScene,
direction,
cardTransparent,
cardOverlayEnabled,
cardShadowEnabled,
@@ -97,9 +86,6 @@ export default class StackItem extends React.PureComponent<Props> {
onGestureCanceled,
onGestureEnd,
gestureResponseDistance,
transitionSpec,
headerStyleInterpolator,
cardStyleInterpolator,
floaingHeaderHeight,
hasCustomHeader,
getPreviousRoute,
@@ -107,6 +93,10 @@ export default class StackItem extends React.PureComponent<Props> {
headerTransparent,
renderHeader,
renderScene,
direction,
transitionSpec,
cardStyleInterpolator,
headerStyleInterpolator,
} = this.props;
return (

View File

@@ -5,11 +5,6 @@ import Stack from './Stack';
import HeaderContainer, {
Props as HeaderContainerProps,
} from '../Header/HeaderContainer';
import {
DefaultTransition,
ModalSlideFromBottomIOS,
} from '../../TransitionConfigs/TransitionPresets';
import { forNoAnimation } from '../../TransitionConfigs/HeaderStyleInterpolators';
import {
NavigationProp,
SceneDescriptor,
@@ -283,20 +278,9 @@ class StackView extends React.Component<Props, State> {
const headerMode =
mode !== 'modal' && Platform.OS === 'ios' ? 'float' : 'screen';
let transitionPreset =
mode === 'modal' && Platform.OS === 'ios'
? ModalSlideFromBottomIOS
: DefaultTransition;
if (headerMode === 'screen') {
transitionPreset = {
...transitionPreset,
headerStyleInterpolator: forNoAnimation,
};
}
return (
<Stack
mode={mode}
getPreviousRoute={this.getPreviousRoute}
getGesturesEnabled={this.getGesturesEnabled}
routes={routes}
@@ -314,7 +298,6 @@ class StackView extends React.Component<Props, State> {
headerMode={headerMode}
navigation={navigation}
descriptors={descriptors}
{...transitionPreset}
{...config}
/>
);