@kermank/slots
Version:
A TypeScript library for handling time slots, scheduling, and timezone operations
62 lines (61 loc) • 3.89 kB
JavaScript
;
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;