UNPKG

@kermank/slots

Version:

A TypeScript library for handling time slots, scheduling, and timezone operations

62 lines (61 loc) 3.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.allowTimeRangeRule = exports.blockTimeRangeRule = exports.noMeetingsAfterRule = exports.noMeetingsBeforeRule = exports.allowTimeOfDayRule = exports.createTimeOfDayRule = void 0; /** * Creates a rule that blocks slots that fall within specified hours of the day * @param start - Start time of day (e.g., { hour: 9, minute: 30 } for 9:30 AM) * @param end - End time of day (e.g., { hour: 17 } for 5:00 PM) * @returns A rule that returns slots that fall within the specified time range */ const createTimeOfDayRule = (start, end) => (slots) => { // Normalize minutes if not provided const startMinute = start.minute || 0; const endMinute = end.minute || 0; return slots.filter(slot => { // Get hour and minute of the slot's start and end times const slotStartHour = slot.start.hour; const slotStartMinute = slot.start.minute; const slotEndHour = slot.end.hour; const slotEndMinute = slot.end.minute; // Convert times to comparable numbers (e.g., 9:30 -> 9.5) const startTime = start.hour + startMinute / 60; const endTime = end.hour + endMinute / 60; const slotStartTime = slotStartHour + slotStartMinute / 60; const slotEndTime = slotEndHour + slotEndMinute / 60; // Handle case where slot spans midnight if (slotEndTime < slotStartTime) { // For slots spanning midnight, check if any part of the slot is in the forbidden range return ((startTime <= slotStartTime && slotStartTime <= 24) || // Check if start is in range before midnight (0 <= slotEndTime && slotEndTime <= endTime) || // Check if end is in range after midnight (slotStartTime <= startTime && slotEndTime >= endTime) // Check if slot encompasses the entire range ); } // Normal case (slot doesn't span midnight) return ((slotStartTime >= startTime && slotStartTime < endTime) || // Starts during range (slotEndTime > startTime && slotEndTime <= endTime) || // Ends during range (slotStartTime <= startTime && slotEndTime >= endTime) // Encompasses range ); }); }; exports.createTimeOfDayRule = createTimeOfDayRule; /** * Creates a rule that allows slots within the specified hours of the day * @param start - Start time of day (e.g., { hour: 9, minute: 30 } for 9:30 AM) * @param end - End time of day (e.g., { hour: 17 } for 5:00 PM) * @returns A rule that returns slots that fall outside the specified time range */ const allowTimeOfDayRule = (start, end) => (slots) => { const blockedSlots = (0, exports.createTimeOfDayRule)({ hour: 0 }, start)(slots) .concat((0, exports.createTimeOfDayRule)(end, { hour: 24 })(slots)); return slots.filter(slot => !blockedSlots.some(blocked => blocked.start.equals(slot.start) && blocked.end.equals(slot.end))); }; exports.allowTimeOfDayRule = allowTimeOfDayRule; // Convenience functions for common use cases const noMeetingsBeforeRule = (hour, minute = 0) => (0, exports.createTimeOfDayRule)({ hour: 0 }, { hour, minute }); exports.noMeetingsBeforeRule = noMeetingsBeforeRule; const noMeetingsAfterRule = (hour, minute = 0) => (0, exports.createTimeOfDayRule)({ hour, minute }, { hour: 24 }); exports.noMeetingsAfterRule = noMeetingsAfterRule; const blockTimeRangeRule = (startHour, endHour, startMinute = 0, endMinute = 0) => (0, exports.createTimeOfDayRule)({ hour: startHour, minute: startMinute }, { hour: endHour, minute: endMinute }); exports.blockTimeRangeRule = blockTimeRangeRule; const allowTimeRangeRule = (startHour, endHour, startMinute = 0, endMinute = 0) => (0, exports.allowTimeOfDayRule)({ hour: startHour, minute: startMinute }, { hour: endHour, minute: endMinute }); exports.allowTimeRangeRule = allowTimeRangeRule;