@@ -41,7 +41,7 @@ type Props = {
41
41
} ;
42
42
43
43
type Week = {
44
- id : number ;
44
+ startOfWeek : Date ;
45
45
bookings : number ;
46
46
} ;
47
47
@@ -83,8 +83,7 @@ const MakeBooking: React.FC<Props> = (props) => {
83
83
// Local state
84
84
const [ weeks , setWeeks ] = useState < Week [ ] > ( [ ] ) ;
85
85
const [ rows , setRows ] = useState < Row [ ] > ( [ ] ) ;
86
- const [ selectedWeek , setSelectedWeek ] = useState < Week | undefined > ( ) ;
87
- const [ selectedWeekLabel , setSelectedWeekLabel ] = useState < string | undefined > ( ) ;
86
+ const [ selectedWeek , setSelectedWeek ] = useState < number | undefined > ( ) ;
88
87
const [ buttonsLoading , setButtonsLoading ] = useState ( true ) ;
89
88
const [ slideConfirm , setSlideConfirm ] = useState ( false ) ;
90
89
const [ todayWithParking , setTodayWithParking ] = useState ( false ) ;
@@ -143,17 +142,17 @@ const MakeBooking: React.FC<Props> = (props) => {
143
142
office . slots . forEach ( ( s ) => {
144
143
// Get week
145
144
const date = parse ( s . date , 'y-MM-dd' , new Date ( ) , DATE_FNS_OPTIONS ) ;
146
- const week = parseInt ( format ( date , 'w' , DATE_FNS_OPTIONS ) ) ;
145
+ const weekStart = startOfWeek ( date , DATE_FNS_OPTIONS ) ;
147
146
148
147
// Is it already in the list?
149
- if ( ! weeks . find ( ( w ) => w . id === week ) ) {
148
+ if ( ! weeks . find ( ( w ) => w . startOfWeek . getTime ( ) === weekStart . getTime ( ) ) ) {
150
149
// Find total user bookings for this week
151
150
const userBookings = bookings . filter ( ( b ) =>
152
151
isSameWeek ( parse ( b . date , 'y-MM-dd' , new Date ( ) , DATE_FNS_OPTIONS ) , date , DATE_FNS_OPTIONS )
153
152
) ;
154
153
155
154
weeks . push ( {
156
- id : week ,
155
+ startOfWeek : weekStart ,
157
156
bookings : userBookings . length ,
158
157
} ) ;
159
158
}
@@ -166,42 +165,27 @@ const MakeBooking: React.FC<Props> = (props) => {
166
165
if ( weeks . length > 0 ) {
167
166
setButtonsLoading ( false ) ;
168
167
169
- if ( selectedWeek ) {
170
- // Reset selected week (to refresh total bookings)
171
- const index = weeks . findIndex ( ( w ) => w . id === selectedWeek . id ) ;
172
-
173
- if ( index !== - 1 ) {
174
- setSelectedWeek ( weeks [ index ] ) ;
175
- } else {
176
- setSelectedWeek ( weeks [ 0 ] ) ;
177
- }
178
- } else {
179
- // Default to first week
180
- setSelectedWeek ( weeks [ 0 ] ) ;
168
+ if ( selectedWeek === undefined ) {
169
+ setSelectedWeek ( 0 ) ;
181
170
}
182
171
}
183
172
} , [ selectedWeek , weeks ] ) ;
184
173
185
- useEffect ( ( ) => {
186
- if ( selectedWeek ) {
187
- // Calculate start and end of week
188
- const weekDate = parse ( selectedWeek . id . toString ( ) , 'w' , new Date ( ) , DATE_FNS_OPTIONS ) ;
189
-
190
- const startDate = startOfWeek ( weekDate , DATE_FNS_OPTIONS ) ;
191
- const endDate = endOfWeek ( startDate , DATE_FNS_OPTIONS ) ;
174
+ const getWeekLabel = ( week : Week ) => {
175
+ const startDate = week . startOfWeek ;
176
+ const endDate = endOfWeek ( startDate , DATE_FNS_OPTIONS ) ;
192
177
193
- // Are dates in the same month
194
- const sameMonth = isSameMonth ( startDate , endDate ) ;
178
+ // Are dates in the same month
179
+ const sameMonth = isSameMonth ( startDate , endDate ) ;
195
180
196
- // Set label
197
- const startLabel = format ( startDate , 'LLL d' , DATE_FNS_OPTIONS ) ;
198
- const endLabel = sameMonth
199
- ? format ( endDate , 'd' , DATE_FNS_OPTIONS )
200
- : format ( endDate , 'LLL d' , DATE_FNS_OPTIONS ) ;
181
+ // Set label
182
+ const startLabel = format ( startDate , 'LLL d' , DATE_FNS_OPTIONS ) ;
183
+ const endLabel = sameMonth
184
+ ? format ( endDate , 'd' , DATE_FNS_OPTIONS )
185
+ : format ( endDate , 'LLL d' , DATE_FNS_OPTIONS ) ;
201
186
202
- setSelectedWeekLabel ( `${ startLabel } - ${ endLabel } ` ) ;
203
- }
204
- } , [ selectedWeek , weeks ] ) ;
187
+ return `${ startLabel } - ${ endLabel } ` ;
188
+ } ;
205
189
206
190
useEffect ( ( ) => {
207
191
if ( user && weeks && weeks . length > 0 ) {
@@ -213,14 +197,8 @@ const MakeBooking: React.FC<Props> = (props) => {
213
197
// For each week
214
198
weeks . forEach ( ( w ) => {
215
199
// Find all days in the week
216
- const startDate = startOfWeek (
217
- parse ( w . id . toString ( ) , 'w' , new Date ( ) , DATE_FNS_OPTIONS ) ,
218
- DATE_FNS_OPTIONS
219
- ) ;
220
- const endDate = endOfWeek (
221
- parse ( w . id . toString ( ) , 'w' , new Date ( ) , DATE_FNS_OPTIONS ) ,
222
- DATE_FNS_OPTIONS
223
- ) ;
200
+ const startDate = w . startOfWeek ;
201
+ const endDate = endOfWeek ( w . startOfWeek , DATE_FNS_OPTIONS ) ;
224
202
225
203
const weekDays = eachDayOfInterval ( {
226
204
start : startDate ,
@@ -305,14 +283,14 @@ const MakeBooking: React.FC<Props> = (props) => {
305
283
// Handlers
306
284
const handleChangeWeek = ( direction : 'forward' | 'backward' ) => {
307
285
// Find index of current selected
308
- if ( selectedWeek ) {
309
- const index = weeks . findIndex ( ( w ) => w . id === selectedWeek . id ) ;
310
-
311
- if ( index !== - 1 ) {
312
- setSelectedWeek (
313
- weeks [ direction === 'forward' ? index + 1 : direction === 'backward' ? index - 1 : index ]
314
- ) ;
315
- }
286
+ if ( selectedWeek !== undefined ) {
287
+ setSelectedWeek (
288
+ direction === 'forward'
289
+ ? selectedWeek + 1
290
+ : direction === 'backward'
291
+ ? selectedWeek - 1
292
+ : selectedWeek
293
+ ) ;
316
294
}
317
295
} ;
318
296
@@ -462,37 +440,37 @@ const MakeBooking: React.FC<Props> = (props) => {
462
440
</ li >
463
441
</ ul >
464
442
465
- { weeks && weeks . length > 0 && selectedWeek && (
443
+ { weeks && weeks . length > 0 && selectedWeek !== undefined && (
466
444
< Paper square className = "bookings" >
467
445
< div className = "menu" >
468
446
< div className = "back" >
469
447
< IconButton
470
- disabled = { selectedWeek . id === weeks [ 0 ] . id }
448
+ disabled = { selectedWeek === 0 }
471
449
onClick = { ( ) => handleChangeWeek ( 'backward' ) }
472
450
size = "small"
473
451
>
474
452
< ArrowLeftIcon
475
453
fontSize = "inherit"
476
454
className = "icon"
477
- color = { selectedWeek . id === weeks [ 0 ] . id ? 'disabled' : 'secondary' }
455
+ color = { selectedWeek === 0 ? 'disabled' : 'secondary' }
478
456
/>
479
457
</ IconButton >
480
458
</ div >
481
459
482
460
< div className = "date" >
483
- < h3 > { selectedWeekLabel } </ h3 >
461
+ < h3 > { getWeekLabel ( weeks [ selectedWeek ] ) } </ h3 >
484
462
</ div >
485
463
486
464
< div className = "forward" >
487
465
< IconButton
488
- disabled = { selectedWeek . id === weeks [ weeks . length - 1 ] . id }
466
+ disabled = { selectedWeek === weeks . length - 1 }
489
467
onClick = { ( ) => handleChangeWeek ( 'forward' ) }
490
468
size = "small"
491
469
>
492
470
< ArrowRightIcon
493
471
fontSize = "inherit"
494
472
className = "icon"
495
- color = { selectedWeek . id === weeks [ weeks . length - 1 ] . id ? 'disabled' : 'secondary' }
473
+ color = { selectedWeek === weeks . length - 1 ? 'disabled' : 'secondary' }
496
474
/>
497
475
</ IconButton >
498
476
</ div >
@@ -516,8 +494,8 @@ const MakeBooking: React.FC<Props> = (props) => {
516
494
517
495
< div className = "details" >
518
496
< p className = "quota" >
519
- < span > { user . quota - selectedWeek . bookings } </ span > { ' ' }
520
- { user . quota - selectedWeek . bookings === 1 ? 'booking' : 'bookings' } remaining
497
+ < span > { user . quota - weeks [ selectedWeek ] . bookings } </ span > { ' ' }
498
+ { user . quota - weeks [ selectedWeek ] . bookings === 1 ? 'booking' : 'bookings' } remaining
521
499
</ p >
522
500
523
501
< p className = "upcoming-bookings" >
@@ -528,9 +506,9 @@ const MakeBooking: React.FC<Props> = (props) => {
528
506
</ div >
529
507
530
508
{ rows
531
- . filter ( ( row ) => selectedWeek . id === row . week . id )
532
- . map ( ( row ) => (
533
- < div key = { row . week . id } className = "grid" >
509
+ . filter ( ( row , index ) => selectedWeek === index )
510
+ . map ( ( row , weekIndex ) => (
511
+ < div key = { weekIndex } className = "grid" >
534
512
{ row . days . map ( ( day , dayIndex ) => (
535
513
< div
536
514
key = { dayIndex }
0 commit comments