mirror of
https://github.com/expo/ex-navigation.git
synced 2026-11-14 10:08:10 -10:00
98 lines
2.4 KiB
JavaScript
98 lines
2.4 KiB
JavaScript
import React from 'react';
|
|
import { Animated, StyleSheet } from 'react-native';
|
|
import PropTypes from 'prop-types';
|
|
|
|
import PureComponent from './utils/PureComponent';
|
|
|
|
import * as NavigationStyles from './ExNavigationStyles';
|
|
|
|
class SceneView extends React.Component<any, SceneViewProps, any> {
|
|
static propTypes = {
|
|
sceneRenderer: PropTypes.func.isRequired,
|
|
// sceneRendererProps: NavigationPropTypes.SceneRenderer,
|
|
};
|
|
|
|
static childContextTypes = {
|
|
scene: PropTypes.object,
|
|
};
|
|
|
|
getChildContext() {
|
|
return {
|
|
scene: this.props.sceneRendererProps.scene,
|
|
};
|
|
}
|
|
|
|
shouldComponentUpdate(nextProps: SceneViewProps, nextState: any): boolean {
|
|
return (
|
|
nextProps.sceneRendererProps.scene.route !==
|
|
this.props.sceneRendererProps.scene.route
|
|
);
|
|
}
|
|
|
|
render(): ?ReactElement<any> {
|
|
return this.props.sceneRenderer(this.props.sceneRendererProps);
|
|
}
|
|
}
|
|
|
|
export default class ExNavigationStackItem extends PureComponent {
|
|
render() {
|
|
let {
|
|
sceneAnimations,
|
|
gestures,
|
|
renderScene,
|
|
style,
|
|
navigationState,
|
|
scene,
|
|
...props
|
|
} = this.props;
|
|
|
|
if (sceneAnimations === undefined) {
|
|
// fall back to default style.
|
|
sceneAnimations = NavigationStyles.SlideHorizontal.sceneAnimations(
|
|
this.props
|
|
);
|
|
} else {
|
|
sceneAnimations = sceneAnimations(this.props);
|
|
}
|
|
if (gestures === undefined) {
|
|
// fall back to default pan handlers.
|
|
gestures =
|
|
NavigationStyles.SlideHorizontal.gestures &&
|
|
NavigationStyles.SlideHorizontal.gestures(this.props);
|
|
} else if (typeof gestures === 'function') {
|
|
gestures = gestures(this.props);
|
|
}
|
|
|
|
const interactive = navigationState.index === scene.index && !scene.isStale;
|
|
const pointerEvents = interactive ? 'auto' : 'none';
|
|
|
|
return (
|
|
<Animated.View
|
|
{...gestures}
|
|
needsOffscreenAlphaCompositing
|
|
style={[styles.main, style, sceneAnimations]}
|
|
pointerEvents={pointerEvents}>
|
|
<SceneView
|
|
sceneRenderer={renderScene}
|
|
sceneRendererProps={{ ...props, scene }}
|
|
/>
|
|
</Animated.View>
|
|
);
|
|
}
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
main: {
|
|
backgroundColor: 'white',
|
|
bottom: 0,
|
|
left: 0,
|
|
position: 'absolute',
|
|
right: 0,
|
|
shadowColor: 'black',
|
|
shadowOffset: { width: 0, height: 0 },
|
|
shadowOpacity: 0.4,
|
|
shadowRadius: 10,
|
|
top: 0,
|
|
},
|
|
});
|