From 712266664e3fce87751b15ec5ce8bb0605bd1391 Mon Sep 17 00:00:00 2001 From: Alex van Andel Date: Wed, 24 Nov 2021 23:53:41 +0100 Subject: [PATCH] Fixes #1205 - Able to schedule for past times in current date (#1211) --- lib/slots.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/slots.ts b/lib/slots.ts index 4f0893ba..b782f287 100644 --- a/lib/slots.ts +++ b/lib/slots.ts @@ -1,10 +1,12 @@ import dayjs, { Dayjs } from "dayjs"; import isBetween from "dayjs/plugin/isBetween"; +import isToday from "dayjs/plugin/isToday"; import utc from "dayjs/plugin/utc"; import { getWorkingHours } from "./availability"; import { WorkingHours } from "./types/schedule"; +dayjs.extend(isToday); dayjs.extend(utc); dayjs.extend(isBetween); @@ -17,37 +19,41 @@ export type GetSlots = { const getMinuteOffset = (date: Dayjs, step: number) => { // Diffs the current time with the given date and iff same day; (handled by 1440) - return difference; otherwise 0 - const minuteOffset = Math.min(date.diff(dayjs().startOf("day"), "minutes"), 1440) % 1440; + const minuteOffset = Math.min(date.diff(dayjs().startOf("day"), "minute"), 1440) % 1440; // round down to nearest step - return Math.floor(minuteOffset / step) * step; + return Math.ceil(minuteOffset / step) * step; }; const getSlots = ({ inviteeDate, frequency, minimumBookingNotice, workingHours }: GetSlots) => { // current date in invitee tz - const startDate = dayjs(inviteeDate).add(minimumBookingNotice, "minutes"); // + minimum notice period + let startDate = dayjs(inviteeDate).add(minimumBookingNotice, "minute"); // checks if the start date is in the past if (startDate.isBefore(dayjs(), "day")) { return []; } + // Add the current time to the startDate if the day is today + if (startDate.isToday()) { + startDate = startDate.add(dayjs().diff(startDate, "minute"), "minute"); + } const localWorkingHours = getWorkingHours( { utcOffset: -inviteeDate.utcOffset() }, workingHours.map((schedule) => ({ days: schedule.days, - startTime: dayjs.utc().startOf("day").add(schedule.startTime, "minutes"), - endTime: dayjs.utc().startOf("day").add(schedule.endTime, "minutes"), + startTime: dayjs.utc().startOf("day").add(schedule.startTime, "minute"), + endTime: dayjs.utc().startOf("day").add(schedule.endTime, "minute"), })) ).filter((hours) => hours.days.includes(inviteeDate.day())); const slots: Dayjs[] = []; - for (let minutes = getMinuteOffset(inviteeDate, frequency); minutes < 1440; minutes += frequency) { - const slot = inviteeDate.startOf("day").add(minutes, "minutes"); + for (let minutes = getMinuteOffset(startDate, frequency); minutes < 1440; minutes += frequency) { + const slot = startDate.startOf("day").add(minutes, "minute"); // add slots to available slots if it is found to be between the start and end time of the checked working hours. if ( localWorkingHours.some((hours) => slot.isBetween( - inviteeDate.startOf("day").add(hours.startTime, "minutes"), - inviteeDate.startOf("day").add(hours.endTime, "minutes"), + startDate.startOf("day").add(hours.startTime, "minute"), + startDate.startOf("day").add(hours.endTime, "minute"), null, "[)" )