11import _ from 'lodash' ;
2+ import { StyleSheet } from 'react-native' ;
23import React , { Component } from 'react' ;
3- import { Incubator , View , Text } from 'react-native-ui-lib' ;
4+ import { Incubator , View , Text , Card , Colors } from 'react-native-ui-lib' ;
45import MockServer from './MockServer' ;
56
67export default class CalendarScreen extends Component {
78 pageIndex = 0 ;
9+ loadingEventsPromise ?: Promise < any [ ] > ;
810
911 state = {
10- date : new Date ( ) . getTime ( ) ,
12+ date : new Date ( /* '2025-01-12' */ ) . getTime ( ) ,
1113 events : [ ] as any [ ] ,
1214 showLoader : false
1315 } ;
@@ -16,17 +18,25 @@ export default class CalendarScreen extends Component {
1618 this . loadEvents ( this . state . date ) ;
1719 }
1820
19- loadEvents = async ( date : number ) => {
21+ // Note: we throttle event loading because initially the Agenda reach end and trigger extra event load
22+ loadEvents = ( async ( date : number ) => {
23+
24+ if ( this . loadingEventsPromise ) {
25+ return ;
26+ }
27+
2028 this . setState ( { showLoader : true } ) ;
2129 // const {events} = this.state;
22- const newEvents = await MockServer . getEvents ( date ) ;
30+ this . loadingEventsPromise = MockServer . getEvents ( date ) ;
31+ const newEvents = await this . loadingEventsPromise ;
32+ this . loadingEventsPromise = undefined ;
2333 this . pageIndex ++ ;
2434 // this.setState({events: _.uniqBy([...events, ...newEvents], e => e.id), showLoader: false});
2535 this . setState ( { events : newEvents , showLoader : false } ) ;
26- } ;
36+ } ) ;
2737
2838 onChangeDate = ( date : number ) => {
29- console . log ( 'Date change: ' , date ) ;
39+ /* console.log('Date change: ', date); */
3040 const { events} = this . state ;
3141 if ( date < events [ 0 ] ?. start || date > _ . last ( events ) ?. start ) {
3242 console . log ( 'Load new events' ) ;
@@ -41,28 +51,37 @@ export default class CalendarScreen extends Component {
4151
4252 // TODO: Fix type once we export them
4353 renderEvent = ( eventItem : any ) => {
54+ const makeEventBigger = new Date ( eventItem . start ) . getDay ( ) % 2 === 0 ;
55+ const startTime = new Date ( eventItem . start ) . toLocaleString ( 'en-GB' , {
56+ // month: 'short',
57+ // day: 'numeric',
58+ hour12 : false ,
59+ hour : '2-digit' ,
60+ minute : '2-digit'
61+ } ) ;
62+ const endTime = new Date ( eventItem . end ) . toLocaleString ( 'en-GB' , {
63+ hour12 : false ,
64+ hour : '2-digit' ,
65+ minute : '2-digit'
66+ } ) ;
4467 return (
45- < View marginH-10 padding-5 bg-blue70 >
46- < Text >
47- Item for
48- { new Date ( eventItem . start ) . toLocaleString ( 'en-GB' , {
49- month : 'short' ,
50- day : 'numeric' ,
51- hour12 : false ,
52- hour : '2-digit' ,
53- minute : '2-digit'
54- } ) }
55- -{ new Date ( eventItem . end ) . toLocaleString ( 'en-GB' , { hour12 : false , hour : '2-digit' , minute : '2-digit' } ) }
68+ < Card marginH-s5 marginB-s4 padding-s4 backgroundColor = { Colors . $backgroundGeneralLight } >
69+ < Text text70 > Event Title</ Text >
70+ { makeEventBigger && < Text > Event short description</ Text > }
71+ < Text marginT-s1 text90 >
72+ { startTime } -{ endTime }
5673 </ Text >
57- </ View >
74+ </ Card >
5875 ) ;
5976 } ;
6077
6178 // TODO: Fix type once we export them
6279 renderHeader = ( headerItem : any ) => {
6380 return (
64- < View centerV flex marginL-5 >
65- < Text > { headerItem . header } </ Text >
81+ < View bg-$backgroundDefault paddingH-s5 centerV flex paddingV-s2 style = { styles . sectionHeader } >
82+ < Text text70BO >
83+ { new Date ( headerItem . date ) . toLocaleString ( 'en-US' , { weekday : 'long' , day : 'numeric' , month : 'short' } ) }
84+ </ Text >
6685 </ View >
6786 ) ;
6887 } ;
@@ -71,15 +90,23 @@ export default class CalendarScreen extends Component {
7190 const { date, events, showLoader} = this . state ;
7291
7392 return (
74- < Incubator . Calendar data = { events } initialDate = { date } onChangeDate = { this . onChangeDate } staticHeader >
75- < Incubator . Calendar . Agenda
76- renderEvent = { this . renderEvent }
77- renderHeader = { this . renderHeader }
78- // itemHeight={30}
79- onEndReached = { this . onEndReached }
80- showLoader = { showLoader }
81- />
82- </ Incubator . Calendar >
93+ < View flex >
94+ < Incubator . Calendar data = { events } initialDate = { date } onChangeDate = { this . onChangeDate } staticHeader >
95+ < Incubator . Calendar . Agenda
96+ renderEvent = { this . renderEvent }
97+ renderHeader = { this . renderHeader }
98+ onEndReached = { this . onEndReached }
99+ showLoader = { showLoader }
100+ />
101+ </ Incubator . Calendar >
102+ < Incubator . Toast visible = { showLoader } message = "Loading events..." preset = "general" />
103+ </ View >
83104 ) ;
84105 }
85106}
107+
108+ const styles = StyleSheet . create ( {
109+ sectionHeader : {
110+ opacity : 0.9
111+ }
112+ } ) ;
0 commit comments