1- // @flow weak
1+ // @flow
22import React , { Component } from 'react' ;
33import { Animated , ScrollView , StyleSheet , View } from 'react-native' ;
44import _ 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-
242236ImageHeaderScrollView . 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+
247277export default ImageHeaderScrollView ;
0 commit comments