Skip to content

Commit 8a0bed1

Browse files
authored
Merge pull request #18 from bamlab/feature/unweak-flow
Unweak the main view flow
2 parents 2f5023f + 74ce73c commit 8a0bed1

1 file changed

Lines changed: 112 additions & 82 deletions

File tree

src/ImageHeaderScrollView.js

Lines changed: 112 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,61 @@
1-
// @flow weak
1+
// @flow
22
import React, { Component } from 'react';
33
import { Animated, ScrollView, StyleSheet, View } from 'react-native';
44
import _ from 'lodash';
55

6-
const styles = StyleSheet.create({
7-
container: {
8-
flex: 1,
9-
},
10-
header: {
11-
position: 'absolute',
12-
top: 0,
13-
left: 0,
14-
right: 0,
15-
overflow: 'hidden',
16-
},
17-
headerChildren: {
18-
backgroundColor: 'transparent',
19-
justifyContent: 'center',
20-
},
21-
overlay: {
22-
position: 'absolute',
23-
top: 0,
24-
right: 0,
25-
left: 0,
26-
bottom: 0,
27-
zIndex: 100,
28-
},
29-
fixedForeground: {
30-
position: 'absolute',
31-
top: 0,
32-
right: 0,
33-
left: 0,
34-
bottom: 0,
35-
zIndex: 101,
36-
},
37-
touchableFixedForeground: {
38-
zIndex: 102,
39-
},
40-
});
6+
export type Props = {
7+
children: React.Element<any>,
8+
childrenStyle: any,
9+
overlayColor: string,
10+
fadeOutForeground: boolean,
11+
foregroundParallaxRatio: number,
12+
maxHeight: number,
13+
maxOverlayOpacity: number,
14+
minHeight: number,
15+
minOverlayOpacity: number,
16+
renderFixedForeground: () => React.Element<any>,
17+
renderForeground: () => React.Element<any>,
18+
renderHeader: () => React.Element<any>,
19+
renderTouchableFixedForeground: () => React.Element<any>,
20+
};
4121

42-
class ImageHeaderScrollView extends Component<*, *, *> {
22+
export type DefaultProps = {
23+
overlayColor: string,
24+
fadeOutForeground: boolean,
25+
foregroundParallaxRatio: number,
26+
maxHeight: number,
27+
maxOverlayOpacity: number,
28+
minHeight: number,
29+
minOverlayOpacity: number,
30+
renderFixedForeground: () => React.Element<any>,
31+
renderForeground: () => React.Element<any>,
32+
renderHeader: () => React.Element<any>,
33+
};
34+
35+
export type State = {
36+
scrollY: Animated.Value,
37+
pageY: number,
38+
};
39+
40+
class ImageHeaderScrollView extends Component<DefaultProps, Props, State> {
4341
container: *;
4442
scrollViewRef: ScrollView;
43+
state: State;
44+
45+
static defaultProps: DefaultProps = {
46+
overlayColor: 'black',
47+
fadeOutForeground: false,
48+
foregroundParallaxRatio: 1,
49+
maxHeight: 125,
50+
maxOverlayOpacity: 0.3,
51+
minHeight: 80,
52+
minOverlayOpacity: 0,
53+
renderFixedForeground: () => <View />,
54+
renderForeground: () => <View />,
55+
renderHeader: () => <View />,
56+
};
4557

46-
constructor(props) {
58+
constructor(props: Props) {
4759
super(props);
4860
this.state = {
4961
scrollY: new Animated.Value(0),
@@ -71,10 +83,10 @@ class ImageHeaderScrollView extends Component<*, *, *> {
7183
getInnerViewNode() {
7284
return this.getScrollResponder().getInnerViewNode();
7385
}
74-
setNativeProps(props) {
86+
setNativeProps(props: Props) {
7587
this.scrollViewRef.setNativeProps(props);
7688
}
77-
scrollTo(...args) {
89+
scrollTo(...args: *) {
7890
this.getScrollResponder().scrollTo(...args);
7991
}
8092

@@ -111,10 +123,10 @@ class ImageHeaderScrollView extends Component<*, *, *> {
111123

112124
return (
113125
<Animated.View style={[styles.header, headerTransformStyle]}>
114-
{this.props.renderHeader(this.state.scrollY)}
126+
{this.props.renderHeader()}
115127
<Animated.View style={overlayStyle} />
116128
<View style={styles.fixedForeground}>
117-
{this.props.renderFixedForeground(this.state.scrollY)}
129+
{this.props.renderFixedForeground()}
118130
</View>
119131
</Animated.View>
120132
);
@@ -160,24 +172,36 @@ class ImageHeaderScrollView extends Component<*, *, *> {
160172

161173
return (
162174
<Animated.View style={[styles.header, styles.touchableFixedForeground, headerTransformStyle]}>
163-
{this.props.renderTouchableFixedForeground(this.state.scrollY)}
175+
{this.props.renderTouchableFixedForeground()}
164176
</Animated.View>
165177
);
166178
}
167179

168180
render() {
169-
const scrollViewProps = _.pick(this.props, _.keys(ScrollView.propTypes));
181+
const {
182+
children,
183+
childrenStyle,
184+
overlayColor,
185+
fadeOutForeground,
186+
foregroundParallaxRatio,
187+
maxHeight,
188+
maxOverlayOpacity,
189+
minHeight,
190+
minOverlayOpacity,
191+
renderFixedForeground,
192+
renderForeground,
193+
renderHeader,
194+
renderTouchableFixedForeground,
195+
...scrollViewProps
196+
} = this.props;
170197

171-
const headerScrollDistance = this.interpolateOnImageHeight([
172-
this.props.maxHeight,
173-
this.props.maxHeight - this.props.minHeight,
174-
]);
175-
const topMargin = this.interpolateOnImageHeight([0, this.props.minHeight]);
198+
const headerScrollDistance = this.interpolateOnImageHeight([maxHeight, maxHeight - minHeight]);
199+
const topMargin = this.interpolateOnImageHeight([0, minHeight]);
176200

177201
const childrenContainerStyle = StyleSheet.flatten([
178202
{ transform: [{ translateY: headerScrollDistance }] },
179-
{ backgroundColor: 'white', paddingBottom: this.props.maxHeight },
180-
this.props.childrenStyle,
203+
{ backgroundColor: 'white', paddingBottom: maxHeight },
204+
childrenStyle,
181205
]);
182206

183207
return (
@@ -198,7 +222,7 @@ class ImageHeaderScrollView extends Component<*, *, *> {
198222
{...scrollViewProps}
199223
>
200224
<Animated.View style={childrenContainerStyle}>
201-
{this.props.children}
225+
{children}
202226
</Animated.View>
203227
</ScrollView>
204228
</Animated.View>
@@ -209,39 +233,45 @@ class ImageHeaderScrollView extends Component<*, *, *> {
209233
}
210234
}
211235

212-
ImageHeaderScrollView.propTypes = {
213-
children: React.PropTypes.node || React.PropTypes.arrayOf(React.PropTypes.node),
214-
childrenStyle: React.PropTypes.any,
215-
overlayColor: React.PropTypes.string,
216-
fadeOutForeground: React.PropTypes.bool,
217-
foregroundParallaxRatio: React.PropTypes.number,
218-
maxHeight: React.PropTypes.number,
219-
maxOverlayOpacity: React.PropTypes.number,
220-
minHeight: React.PropTypes.number,
221-
minOverlayOpacity: React.PropTypes.number,
222-
renderFixedForeground: React.PropTypes.func,
223-
renderForeground: React.PropTypes.func,
224-
renderHeader: React.PropTypes.func,
225-
renderTouchableFixedForeground: React.PropTypes.func,
226-
...ScrollView.propTypes,
227-
};
228-
229-
ImageHeaderScrollView.defaultProps = {
230-
overlayColor: 'black',
231-
fadeOutForeground: false,
232-
foregroundParallaxRatio: 1,
233-
maxHeight: 125,
234-
maxOverlayOpacity: 0.3,
235-
minHeight: 80,
236-
minOverlayOpacity: 0,
237-
renderFixedForeground: () => <View />,
238-
renderForeground: () => <View />,
239-
renderHeader: () => <View />,
240-
};
241-
242236
ImageHeaderScrollView.childContextTypes = {
243237
scrollY: React.PropTypes.instanceOf(Animated.Value),
244238
scrollPageY: React.PropTypes.number,
245239
};
246240

241+
const styles = StyleSheet.create({
242+
container: {
243+
flex: 1,
244+
},
245+
header: {
246+
position: 'absolute',
247+
top: 0,
248+
left: 0,
249+
right: 0,
250+
overflow: 'hidden',
251+
},
252+
headerChildren: {
253+
backgroundColor: 'transparent',
254+
justifyContent: 'center',
255+
},
256+
overlay: {
257+
position: 'absolute',
258+
top: 0,
259+
right: 0,
260+
left: 0,
261+
bottom: 0,
262+
zIndex: 100,
263+
},
264+
fixedForeground: {
265+
position: 'absolute',
266+
top: 0,
267+
right: 0,
268+
left: 0,
269+
bottom: 0,
270+
zIndex: 101,
271+
},
272+
touchableFixedForeground: {
273+
zIndex: 102,
274+
},
275+
});
276+
247277
export default ImageHeaderScrollView;

0 commit comments

Comments
 (0)