1- import XDate from 'xdate' ;
21import React , { Component } from 'react' ;
32import { Alert } from 'react-native' ;
4- import { ExpandableCalendar , Timeline , CalendarProvider , TimelineProps } from 'react-native-calendars' ;
5- import { sameDate } from '../../../src/dateutils' ;
3+ import {
4+ ExpandableCalendar ,
5+ TimelineEventProps ,
6+ TimelineList ,
7+ CalendarProvider ,
8+ TimelineProps ,
9+ CalendarUtils
10+ } from 'react-native-calendars' ;
11+ import _ from 'lodash' ;
612
7- const EVENTS = [
13+ const EVENTS : TimelineEventProps [ ] = [
814 {
915 start : '2017-09-06 01:30:00' ,
1016 end : '2017-09-06 02:30:00' ,
@@ -82,7 +88,9 @@ export default class TimelineCalendarScreen extends Component {
8288 state = {
8389 currentDate : '2017-09-10' ,
8490 events : EVENTS ,
85- newEvent : undefined
91+ eventsByDate : _ . groupBy ( EVENTS , e => CalendarUtils . getCalendarDateString ( e . start ) ) as {
92+ [ key : string ] : TimelineEventProps [ ] ;
93+ }
8694 } ;
8795
8896 marked = {
@@ -103,45 +111,78 @@ export default class TimelineCalendarScreen extends Component {
103111 } ;
104112
105113 createNewEvent : TimelineProps [ 'onBackgroundLongPress' ] = ( timeString , timeObject ) => {
114+ const { eventsByDate} = this . state ;
106115 const hourString = `${ ( timeObject . hour + 1 ) . toString ( ) . padStart ( 2 , '0' ) } ` ;
107116 const minutesString = `${ timeObject . minutes . toString ( ) . padStart ( 2 , '0' ) } ` ;
108117
109118 const newEvent = {
119+ id : 'draft' ,
110120 start : `${ timeString } ` ,
111121 end : `${ timeObject . date } ${ hourString } :${ minutesString } :00` ,
112122 title : 'New Event' ,
113123 color : '#ffffff'
114124 } ;
115125
116- this . setState ( { newEvent} ) ;
126+ if ( timeObject . date ) {
127+ if ( eventsByDate [ timeObject . date ] ) {
128+ eventsByDate [ timeObject . date ] = [ ...eventsByDate [ timeObject . date ] , newEvent ] ;
129+ this . setState ( { eventsByDate} ) ;
130+ } else {
131+ eventsByDate [ timeObject . date ] = [ newEvent ] ;
132+ this . setState ( { eventsByDate : { ...eventsByDate } } ) ;
133+ }
134+ }
117135 } ;
118136
119- approveNewEvent = ( ) => {
137+ approveNewEvent : TimelineProps [ 'onBackgroundLongPressOut' ] = ( _timeString , timeObject ) => {
138+ const { eventsByDate} = this . state ;
139+
120140 Alert . prompt ( 'New Event' , 'Enter event title' , [
121141 {
122142 text : 'Cancel' ,
123143 onPress : ( ) => {
124- this . setState ( {
125- newEvent : undefined
126- } ) ;
144+ if ( timeObject . date ) {
145+ eventsByDate [ timeObject . date ] = _ . filter ( eventsByDate [ timeObject . date ] , e => e . id !== 'draft' ) ;
146+
147+ this . setState ( {
148+ eventsByDate
149+ } ) ;
150+ }
127151 }
128152 } ,
129153 {
130154 text : 'Create' ,
131155 onPress : eventTitle => {
132- const { newEvent = { } , events} = this . state ;
133- this . setState ( {
134- newEvent : undefined ,
135- events : [ ...events , { ...newEvent , title : eventTitle ?? 'New Event' , color : '#d8ade6' } ]
136- } ) ;
156+ if ( timeObject . date ) {
157+ const draftEvent = _ . find ( eventsByDate [ timeObject . date ] , { id : 'draft' } ) ;
158+ if ( draftEvent ) {
159+ draftEvent . id = undefined ;
160+ draftEvent . title = eventTitle ?? 'New Event' ;
161+ draftEvent . color = '#d8ade6' ;
162+ eventsByDate [ timeObject . date ] = [ ...eventsByDate [ timeObject . date ] ] ;
163+
164+ this . setState ( {
165+ eventsByDate
166+ } ) ;
167+ }
168+ }
137169 }
138170 }
139171 ] ) ;
140172 } ;
141173
174+ private timelineProps = {
175+ format24h : true ,
176+ onBackgroundLongPress : this . createNewEvent ,
177+ onBackgroundLongPressOut : this . approveNewEvent
178+ // scrollToFirst: true,
179+ // start: 0,
180+ // end: 24
181+ } ;
182+
142183 render ( ) {
143- const { currentDate, events , newEvent } = this . state ;
144- const timelineEvents = newEvent ? [ ... events , newEvent ] : events ;
184+ const { currentDate, eventsByDate } = this . state ;
185+
145186 return (
146187 < CalendarProvider
147188 date = { currentDate }
@@ -156,18 +197,7 @@ export default class TimelineCalendarScreen extends Component {
156197 rightArrowImageSource = { require ( '../img/next.png' ) }
157198 markedDates = { this . marked }
158199 />
159- < Timeline
160- date = { currentDate }
161- format24h = { true }
162- eventTapped = { e => e }
163- events = { timelineEvents . filter ( event => sameDate ( new XDate ( event . start ) , new XDate ( this . state . currentDate ) ) ) }
164- scrollToFirst
165- onBackgroundLongPress = { this . createNewEvent }
166- onBackgroundLongPressOut = { this . approveNewEvent }
167- showNowIndicator
168- // start={0}
169- // end={24}
170- />
200+ < TimelineList events = { eventsByDate } timelineProps = { this . timelineProps } />
171201 </ CalendarProvider >
172202 ) ;
173203 }
0 commit comments