@@ -10,8 +10,10 @@ import {
1010 Text ,
1111 Platform ,
1212 ListView ,
13+ RefreshControl ,
1314} from 'react-native'
1415
16+ import delay from 'delay'
1517import LoadingView from '../components/loading'
1618import qs from 'querystring'
1719import EventView from './event'
@@ -26,46 +28,29 @@ type GoogleCalendarEventType = {
2628 end : GoogleCalendarTimeType ,
2729 location : string ,
2830} ;
29- type StateType = {
30- events : null | GoogleCalendarResponseType ,
31- loaded : boolean ,
32- error : null | string ,
33- } ;
34- type GoogleCalendarResponseType = {
35- items : GoogleCalendarEventType [ ] ,
36- } ;
3731
3832export default class CalendarView extends React . Component {
3933 static propTypes = {
40- source : React . PropTypes . oneOf ( [ 'master' , 'oleville' ] ) . isRequired ,
34+ calendarId : React . PropTypes . string . isRequired ,
4135 }
4236
43- state : StateType = {
44- events : null ,
37+ state = {
38+ events : new ListView . DataSource ( {
39+ rowHasChanged : this . _rowHasChanged ,
40+ } ) ,
4541 loaded : false ,
42+ refreshing : true ,
4643 error : null ,
4744 }
4845
4946 componentWillMount ( ) {
50- if ( this . props . source === 'master' ) {
51- this . getMasterEvents ( )
52- } else {
53- this . getOlevilleEvents ( )
54- }
47+ this . refresh ( )
5548 }
5649
5750 _rowHasChanged ( r1 : GoogleCalendarEventType , r2 : GoogleCalendarEventType ) {
5851 return r1 . summary != r2 . summary
5952 }
6053
61- async getMasterEvents ( ) {
62- this . getEvents ( 'le6tdd9i38vgb7fcmha0hu66u9gjus2e%40import.calendar.google.com' )
63- }
64-
65- async getOlevilleEvents ( ) {
66- this . getEvents ( '[email protected] ' ) 67- }
68-
6954 buildCalendarUrl ( calendarId : string ) {
7055 let calendarUrl = `https://www.googleapis.com/calendar/v3/calendars/${ calendarId } /events`
7156 let params = {
@@ -79,9 +64,8 @@ export default class CalendarView extends React.Component {
7964 return `${ calendarUrl } ?${ qs . stringify ( params ) } `
8065 }
8166
82- async getEvents ( calendarId : string ) {
83- let url = this . buildCalendarUrl ( calendarId )
84- console . log ( url )
67+ getEvents = async ( ) => {
68+ let url = this . buildCalendarUrl ( this . props . calendarId )
8569
8670 let data = null
8771 let error = null
@@ -90,41 +74,49 @@ export default class CalendarView extends React.Component {
9074 error = result . error
9175 data = result . items
9276 } catch ( error ) {
93- this . setState ( { error : 'Error!' } )
77+ this . setState ( { error : error . message } )
9478 console . error ( error )
9579 }
9680
9781 if ( data ) {
98- this . setState ( { events : data } )
82+ this . setState ( { events : this . state . events . cloneWithRows ( data ) } )
9983 }
10084 if ( error ) {
10185 this . setState ( { error : error . message } )
10286 }
10387 this . setState ( { loaded : true } )
10488 }
10589
90+ refresh = async ( ) => {
91+ let start = Date . now ( )
92+ this . setState ( { refreshing : true } )
93+
94+ await this . getEvents ( )
95+
96+ // wait 0.5 seconds – if we let it go at normal speed, it feels broken.
97+ let elapsed = start - Date . now ( )
98+ if ( elapsed < 500 ) {
99+ await delay ( 500 - elapsed )
100+ }
101+
102+ this . setState ( { refreshing : false } )
103+ }
104+
106105 render ( ) {
107- if ( ! this . state . events ) {
106+ if ( ! this . state . loaded ) {
108107 return < LoadingView />
109108 }
110109
111110 if ( this . state . error ) {
112- return (
113- < Text >
114- { this . state . error }
115- </ Text >
116- )
111+ return < Text > { this . state . error } </ Text >
117112 }
118113
119- let ds = new ListView . DataSource ( {
120- rowHasChanged : this . _rowHasChanged ,
121- } )
122-
123114 return (
124115 < ListView
125116 style = { styles . container }
126117 contentInset = { { bottom : Platform . OS === 'ios' ? 49 : 0 } }
127- dataSource = { ds . cloneWithRows ( this . state . events ) }
118+ dataSource = { this . state . events }
119+ pageSize = { 5 }
128120 renderRow = { data =>
129121 < EventView
130122 style = { styles . row }
@@ -134,6 +126,12 @@ export default class CalendarView extends React.Component {
134126 location = { data . location }
135127 />
136128 }
129+ refreshControl = {
130+ < RefreshControl
131+ refreshing = { this . state . refreshing }
132+ onRefresh = { this . refresh }
133+ />
134+ }
137135 />
138136 )
139137 }
@@ -147,7 +145,7 @@ let styles = StyleSheet.create({
147145 row : {
148146 minHeight : 88 ,
149147 marginLeft : 10 ,
150- marginRight : 10 ,
148+ paddingRight : 10 ,
151149 borderBottomWidth : 1 ,
152150 borderBottomColor : '#ebebeb' ,
153151 } ,
0 commit comments