9
9
10
10
'use strict' ;
11
11
12
- import React from ' react' ;
12
+ import * as React from " react" ;
13
13
import { Image ,
14
14
StyleSheet ,
15
15
Text ,
16
- TouchableWithoutFeedback ,
17
- TouchableOpacity ,
18
- View ,
16
+ View ,
19
17
SafeAreaView ,
20
- Platform } from 'react-native'
18
+ } from 'react-native'
21
19
22
20
import ViewPagerAndroid from '@react-native-community/viewpager' ;
23
- import { PAGES , BGCOLOR , IMAGE_URIS , createPage } from "./Common " ;
21
+ import { PAGES , BGCOLOR , IMAGE_URIS , createPage } from "./utils " ;
24
22
import { Button } from "./src/component/Button" ;
25
23
import { LikeCount } from "./src/component/LikeCount" ;
26
24
import { ProgressBar } from "./src/component/ProgressBar" ;
25
+ import type { CreatePage } from "./utils"
26
+ import type { PageScrollEvent , PageScrollState , PageScrollStateChangedEvent , PageSelectedEvent } from "../js" ;
27
27
28
- export default class ViewPagerExample extends React . Component {
29
- constructor ( props ) {
28
+ type State = {
29
+ page : number ,
30
+ animationsAreEnabled : boolean ,
31
+ scrollEnabled : boolean ,
32
+ progress : {
33
+ position : number ,
34
+ offset : number ,
35
+ } ,
36
+ pages : Array < CreatePage > ,
37
+ scrollState : PageScrollState
38
+ } ;
39
+
40
+ export default class ViewPagerExample extends React . Component < * , State > {
41
+
42
+ viewPager : React . Ref < typeof ViewPagerAndroid > ;
43
+
44
+ constructor ( props : any ) {
30
45
super ( props ) ;
31
46
32
47
const pages = [ ] ;
33
48
for ( let i = 0 ; i < PAGES ; i ++ ) {
34
- pages . push ( this . createPage ( i ) ) ;
49
+ pages . push ( createPage ( i ) ) ;
35
50
}
36
-
51
+
37
52
this . state = {
38
53
page : 0 ,
39
54
animationsAreEnabled : true ,
@@ -42,52 +57,47 @@ export default class ViewPagerExample extends React.Component {
42
57
position : 0 ,
43
58
offset : 0 ,
44
59
} ,
45
- pages
60
+ pages : pages ,
61
+ scrollState : 'idle'
46
62
} ;
63
+ this . viewPager = React . createRef ( ) ;
47
64
} ;
48
65
49
- onPageSelected = e => {
66
+ onPageSelected = ( e : PageSelectedEvent ) = > {
50
67
this . setState ( { page : e . nativeEvent . position } ) ;
51
68
} ;
52
69
53
- onPageScroll = e => {
54
- this . setState ( { progress : e . nativeEvent } ) ;
70
+ onPageScroll = ( e : PageScrollEvent ) = > {
71
+ this . setState ( { progress : {
72
+ position : e . nativeEvent . position ,
73
+ offset : e . nativeEvent . offset ,
74
+ } } ) ;
55
75
} ;
56
76
57
- onPageScrollStateChanged = e => {
77
+ onPageScrollStateChanged = ( e : PageScrollStateChangedEvent ) = > {
58
78
this . setState ( { scrollState : e . nativeEvent . pageScrollState } ) ;
59
79
} ;
60
80
61
- addPage = e => {
62
- this . setState ( prevState => ( { pages : [ ...prevState . pages , this . createPage ( prevState . pages . length ) ] } ) ) ;
63
- }
81
+ addPage = ( ) = > {
82
+ this . setState ( prevState => ( { pages : [ ...prevState . pages , createPage ( prevState . pages . length ) ] } ) ) ;
83
+ } ;
64
84
65
- move = delta => {
85
+ move = ( delta : number ) = > {
66
86
const page = this . state . page + delta ;
67
87
this . go ( page ) ;
68
88
} ;
69
89
70
- go = page => {
90
+ go = ( page : number ) => {
71
91
if ( this . state . animationsAreEnabled ) {
72
- this . viewPager . setPage ( page ) ;
92
+ /* $FlowFixMe we need to update flow to support React.Ref and createRef() */
93
+ this . viewPager . current . setPage ( page ) ;
73
94
} else {
74
- this . viewPager . setPageWithoutAnimation ( page ) ;
95
+ /* $FlowFixMe we need to update flow to support React.Ref and createRef() */
96
+ this . viewPager . current . setPageWithoutAnimation ( page ) ;
75
97
}
76
98
} ;
77
99
78
- createPage ( key ) {
79
- return {
80
- key : key ,
81
- style : {
82
- backgroundColor : BGCOLOR [ key % BGCOLOR . length ] ,
83
- alignItems : 'center' ,
84
- padding : 20 ,
85
- } ,
86
- imgSource : { uri : IMAGE_URIS [ key % BGCOLOR . length ] }
87
- }
88
- } ;
89
-
90
- renderPage ( page ) {
100
+ renderPage ( page : CreatePage ) {
91
101
return (
92
102
< View key = { page . key } style = { page . style } collapsable = { false } >
93
103
< Image
@@ -111,9 +121,7 @@ export default class ViewPagerExample extends React.Component {
111
121
onPageSelected = { this . onPageSelected }
112
122
onPageScrollStateChanged = { this . onPageScrollStateChanged }
113
123
pageMargin = { 10 }
114
- ref = { viewPager => {
115
- this . viewPager = viewPager ;
116
- } } >
124
+ ref = { this . viewPager } >
117
125
{ pages . map ( page => this . renderPage ( page ) ) }
118
126
</ ViewPagerAndroid >
119
127
< View style = { styles . buttons } >
@@ -166,7 +174,7 @@ export default class ViewPagerExample extends React.Component {
166
174
</ View >
167
175
< View style = { styles . progress } >
168
176
< Text style = { styles . buttonText } > Page { page + 1 } / { pages . length } </ Text >
169
- < ProgressBar numberOfPages = { pages . length } size = { 300 } progress = { this . state . progress } />
177
+ < ProgressBar numberOfPages = { pages . length } size = { 300 } progress = { this . state . progress } />
170
178
</ View >
171
179
</ SafeAreaView >
172
180
) ;
0 commit comments