Skip to content

Commit dafa58e

Browse files
Merge pull request #124 from o2Labs/fix-year-change
Fix issue with dates showing up after new year
2 parents 528ce63 + 789e93d commit dafa58e

File tree

4 files changed

+1240
-1370
lines changed

4 files changed

+1240
-1370
lines changed

client/src/components/App/Admin/CreateBooking.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ const AdminCreateBooking: React.FC<RouteComponentProps> = () => {
179179
(slot) =>
180180
slot && {
181181
...slot,
182-
booked: slot.booked += 1,
182+
booked: (slot.booked += 1),
183183
bookedParking: parking ? (slot.bookedParking += 1) : slot.bookedParking,
184184
}
185185
);

client/src/components/App/Home/MakeBooking.tsx

+40-62
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type Props = {
4141
};
4242

4343
type Week = {
44-
id: number;
44+
startOfWeek: Date;
4545
bookings: number;
4646
};
4747

@@ -83,8 +83,7 @@ const MakeBooking: React.FC<Props> = (props) => {
8383
// Local state
8484
const [weeks, setWeeks] = useState<Week[]>([]);
8585
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>();
8887
const [buttonsLoading, setButtonsLoading] = useState(true);
8988
const [slideConfirm, setSlideConfirm] = useState(false);
9089
const [todayWithParking, setTodayWithParking] = useState(false);
@@ -143,17 +142,17 @@ const MakeBooking: React.FC<Props> = (props) => {
143142
office.slots.forEach((s) => {
144143
// Get week
145144
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);
147146

148147
// Is it already in the list?
149-
if (!weeks.find((w) => w.id === week)) {
148+
if (!weeks.find((w) => w.startOfWeek.getTime() === weekStart.getTime())) {
150149
// Find total user bookings for this week
151150
const userBookings = bookings.filter((b) =>
152151
isSameWeek(parse(b.date, 'y-MM-dd', new Date(), DATE_FNS_OPTIONS), date, DATE_FNS_OPTIONS)
153152
);
154153

155154
weeks.push({
156-
id: week,
155+
startOfWeek: weekStart,
157156
bookings: userBookings.length,
158157
});
159158
}
@@ -166,42 +165,27 @@ const MakeBooking: React.FC<Props> = (props) => {
166165
if (weeks.length > 0) {
167166
setButtonsLoading(false);
168167

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);
181170
}
182171
}
183172
}, [selectedWeek, weeks]);
184173

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);
192177

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);
195180

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);
201186

202-
setSelectedWeekLabel(`${startLabel} - ${endLabel}`);
203-
}
204-
}, [selectedWeek, weeks]);
187+
return `${startLabel} - ${endLabel}`;
188+
};
205189

206190
useEffect(() => {
207191
if (user && weeks && weeks.length > 0) {
@@ -213,14 +197,8 @@ const MakeBooking: React.FC<Props> = (props) => {
213197
// For each week
214198
weeks.forEach((w) => {
215199
// 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);
224202

225203
const weekDays = eachDayOfInterval({
226204
start: startDate,
@@ -305,14 +283,14 @@ const MakeBooking: React.FC<Props> = (props) => {
305283
// Handlers
306284
const handleChangeWeek = (direction: 'forward' | 'backward') => {
307285
// 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+
);
316294
}
317295
};
318296

@@ -462,37 +440,37 @@ const MakeBooking: React.FC<Props> = (props) => {
462440
</li>
463441
</ul>
464442

465-
{weeks && weeks.length > 0 && selectedWeek && (
443+
{weeks && weeks.length > 0 && selectedWeek !== undefined && (
466444
<Paper square className="bookings">
467445
<div className="menu">
468446
<div className="back">
469447
<IconButton
470-
disabled={selectedWeek.id === weeks[0].id}
448+
disabled={selectedWeek === 0}
471449
onClick={() => handleChangeWeek('backward')}
472450
size="small"
473451
>
474452
<ArrowLeftIcon
475453
fontSize="inherit"
476454
className="icon"
477-
color={selectedWeek.id === weeks[0].id ? 'disabled' : 'secondary'}
455+
color={selectedWeek === 0 ? 'disabled' : 'secondary'}
478456
/>
479457
</IconButton>
480458
</div>
481459

482460
<div className="date">
483-
<h3>{selectedWeekLabel}</h3>
461+
<h3>{getWeekLabel(weeks[selectedWeek])}</h3>
484462
</div>
485463

486464
<div className="forward">
487465
<IconButton
488-
disabled={selectedWeek.id === weeks[weeks.length - 1].id}
466+
disabled={selectedWeek === weeks.length - 1}
489467
onClick={() => handleChangeWeek('forward')}
490468
size="small"
491469
>
492470
<ArrowRightIcon
493471
fontSize="inherit"
494472
className="icon"
495-
color={selectedWeek.id === weeks[weeks.length - 1].id ? 'disabled' : 'secondary'}
473+
color={selectedWeek === weeks.length - 1 ? 'disabled' : 'secondary'}
496474
/>
497475
</IconButton>
498476
</div>
@@ -516,8 +494,8 @@ const MakeBooking: React.FC<Props> = (props) => {
516494

517495
<div className="details">
518496
<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
521499
</p>
522500

523501
<p className="upcoming-bookings">
@@ -528,9 +506,9 @@ const MakeBooking: React.FC<Props> = (props) => {
528506
</div>
529507

530508
{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">
534512
{row.days.map((day, dayIndex) => (
535513
<div
536514
key={dayIndex}

client/tsconfig.json

+11-3
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
"strict": true,
44
"target": "es6",
55
"module": "esnext",
6-
"lib": ["es6", "dom", "dom.iterable", "esnext"],
7-
"jsx": "react",
6+
"lib": [
7+
"es6",
8+
"dom",
9+
"dom.iterable",
10+
"esnext"
11+
],
12+
"jsx": "react-jsx",
813
"noEmit": true,
914
"esModuleInterop": true,
1015
"sourceMap": true,
@@ -23,5 +28,8 @@
2328
"alwaysStrict": false,
2429
"noImplicitUseStrict": true
2530
},
26-
"include": ["src/**/*", "test/**/*"]
31+
"include": [
32+
"src/**/*",
33+
"test/**/*"
34+
]
2735
}

0 commit comments

Comments
 (0)