@@ -11,12 +11,16 @@ import {
1111 Platform ,
1212 ListView ,
1313 RefreshControl ,
14+ View ,
1415} from 'react-native'
1516
17+ import groupBy from 'lodash/groupBy'
18+ import moment from 'moment-timezone'
1619import delay from 'delay'
1720import LoadingView from '../components/loading'
1821import qs from 'querystring'
1922import EventView from './event'
23+ import * as c from '../components/colors'
2024import { GOOGLE_CALENDAR_API_KEY } from '../../lib/config'
2125
2226type GoogleCalendarTimeType = {
@@ -36,7 +40,8 @@ export default class CalendarView extends React.Component {
3640
3741 state = {
3842 events : new ListView . DataSource ( {
39- rowHasChanged : this . _rowHasChanged ,
43+ rowHasChanged : this . rowHasChanged ,
44+ sectionHeaderHasChanged : this . sectionHeaderHasChanged ,
4045 } ) ,
4146 loaded : false ,
4247 refreshing : true ,
@@ -47,8 +52,12 @@ export default class CalendarView extends React.Component {
4752 this . refresh ( )
4853 }
4954
50- _rowHasChanged ( r1 : GoogleCalendarEventType , r2 : GoogleCalendarEventType ) {
51- return r1 . summary != r2 . summary
55+ rowHasChanged ( r1 : GoogleCalendarEventType , r2 : GoogleCalendarEventType ) {
56+ return r1 . summary !== r2 . summary
57+ }
58+
59+ sectionHeaderHasChanged ( h1 : number , h2 : number ) {
60+ return h1 !== h2
5261 }
5362
5463 buildCalendarUrl ( calendarId : string ) {
@@ -79,7 +88,12 @@ export default class CalendarView extends React.Component {
7988 }
8089
8190 if ( data ) {
82- this . setState ( { events : this . state . events . cloneWithRows ( data ) } )
91+ data . forEach ( event => {
92+ event . startTime = moment ( event . start . date || event . start . dateTime )
93+ event . endTime = moment ( event . end . date || event . end . dateTime )
94+ } )
95+ let grouped = groupBy ( data , event => event . startTime . format ( 'ddd MMM Do' ) )
96+ this . setState ( { events : this . state . events . cloneWithRowsAndSections ( grouped ) } )
8397 }
8498 if ( error ) {
8599 this . setState ( { error : error . message } )
@@ -102,6 +116,32 @@ export default class CalendarView extends React.Component {
102116 this . setState ( { refreshing : false } )
103117 }
104118
119+ renderRow = ( data : Object ) => {
120+ return (
121+ < EventView
122+ style = { styles . row }
123+ eventTitle = { data . summary }
124+ startTime = { data . startTime }
125+ endTime = { data . endTime }
126+ location = { data . location }
127+ />
128+ )
129+ }
130+
131+ renderSectionHeader = ( sectionData : Object , sectionIdentifier : any ) => {
132+ return (
133+ < View style = { styles . rowSectionHeader } >
134+ < Text style = { styles . rowSectionHeaderText } numberOfLines = { 1 } >
135+ { sectionIdentifier }
136+ </ Text >
137+ </ View >
138+ )
139+ }
140+
141+ renderSeparator = ( sectionID : any , rowID : any ) => {
142+ return < View key = { `${ sectionID } -${ rowID } ` } style = { styles . separator } />
143+ }
144+
105145 render ( ) {
106146 if ( ! this . state . loaded ) {
107147 return < LoadingView />
@@ -117,15 +157,9 @@ export default class CalendarView extends React.Component {
117157 contentInset = { { bottom : Platform . OS === 'ios' ? 49 : 0 } }
118158 dataSource = { this . state . events }
119159 pageSize = { 5 }
120- renderRow = { data =>
121- < EventView
122- style = { styles . row }
123- eventTitle = { data . summary }
124- startTime = { data . start . dateTime }
125- endTime = { data . end . dateTime }
126- location = { data . location }
127- />
128- }
160+ renderRow = { this . renderRow }
161+ renderSectionHeader = { this . renderSectionHeader }
162+ renderSeparator = { this . renderSeparator }
129163 refreshControl = {
130164 < RefreshControl
131165 refreshing = { this . state . refreshing }
@@ -143,10 +177,24 @@ let styles = StyleSheet.create({
143177 backgroundColor : '#ffffff' ,
144178 } ,
145179 row : {
146- minHeight : 88 ,
147- marginLeft : 10 ,
148- paddingRight : 10 ,
149- borderBottomWidth : 1 ,
180+ // marginLeft: 10,
181+ // paddingRight: 10,
182+ } ,
183+ separator : {
184+ borderBottomWidth : StyleSheet . hairlineWidth ,
150185 borderBottomColor : '#ebebeb' ,
151186 } ,
187+ rowSectionHeader : {
188+ backgroundColor : c . iosListSectionHeader ,
189+ paddingTop : 5 ,
190+ paddingBottom : 5 ,
191+ paddingLeft : 10 ,
192+ borderTopWidth : 1 ,
193+ borderBottomWidth : 1 ,
194+ borderColor : '#ebebeb' ,
195+ } ,
196+ rowSectionHeaderText : {
197+ color : 'black' ,
198+ fontWeight : 'bold' ,
199+ } ,
152200} )
0 commit comments