@pnp/spfx-controls-react
Version:
Reusable React controls for SharePoint Framework solutions
97 lines • 4.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useCalendar = void 0;
var tslib_1 = require("tslib");
var dateUtils_1 = require("../utils/dateUtils");
var react_1 = require("react");
var uuid_1 = require("uuid"); // Use UUID for generating unique IDs
var useCalendar = function (timezone) {
// Initialize events with a unique ID
var initializeEventsWithId = (0, react_1.useCallback)(function (events) {
return events.map(function (event) { return (tslib_1.__assign(tslib_1.__assign({}, event), { id: event.id || (0, uuid_1.v4)() })); });
}, []);
// Memoized helper for timezone handling
var toLocalDate = (0, react_1.useCallback)(function (dateString) {
return (0, dateUtils_1.parseCalendarDate)(dateString, timezone);
}, [timezone]);
var getMonthCalendar = (0, react_1.useCallback)(function (events, year, month) {
var eventsWithId = initializeEventsWithId(events);
var daysInMonth = new Date(year, month + 1, 0).getDate();
var calendarEventsByDay = {};
for (var day = 1; day <= daysInMonth; day++) {
var date = new Date(year, month, day);
var dateString = (0, dateUtils_1.getDateKey)(date);
calendarEventsByDay[dateString] = [];
}
eventsWithId.forEach(function (event) {
var eventStart = toLocalDate(event.start);
var eventEnd = toLocalDate(event.end);
var currentDate = new Date(eventStart);
while (currentDate <= eventEnd) {
var dateString = (0, dateUtils_1.getDateKey)(currentDate);
if (calendarEventsByDay[dateString]) {
calendarEventsByDay[dateString].push(event);
}
currentDate.setDate(currentDate.getDate() + 1);
}
});
return calendarEventsByDay;
}, [initializeEventsWithId, toLocalDate]);
var getWeekEvents = (0, react_1.useCallback)(function (events, startDate) {
var weekEvents = [];
var start = toLocalDate(startDate);
var eventsWithId = initializeEventsWithId(events);
var _loop_1 = function (i) {
var currentDate = new Date(start);
currentDate.setDate(start.getDate() + i);
var dateString = (0, dateUtils_1.getDateKey)(currentDate);
var dayTimeSlots = Array.from({ length: 48 }, function (_, index) { return ({
time: "".concat(String(Math.floor(index / 2)).padStart(2, '0'), ":").concat(index % 2 === 0 ? '00' : '30'),
events: [],
}); });
var fullDayEvents = [];
eventsWithId.forEach(function (event) {
var eventStart = toLocalDate(event.start);
var eventEnd = toLocalDate(event.end);
if (event.isFullDay) {
if ((0, dateUtils_1.getDateKey)(eventStart) <= dateString &&
(0, dateUtils_1.getDateKey)(eventEnd) >= dateString) {
fullDayEvents.push(event);
}
return;
}
if ((0, dateUtils_1.getDateKey)(eventStart) <= dateString &&
(0, dateUtils_1.getDateKey)(eventEnd) >= dateString) {
var currentSlot = new Date(eventStart);
while (currentSlot <= eventEnd) {
var slotDateString = (0, dateUtils_1.getDateKey)(currentSlot);
if (slotDateString === dateString) {
var slotIndex = currentSlot.getHours() * 2 +
(currentSlot.getMinutes() >= 30 ? 1 : 0);
if (dayTimeSlots[slotIndex]) {
dayTimeSlots[slotIndex].events.push(event);
}
}
currentSlot.setMinutes(currentSlot.getMinutes() + 30);
}
}
});
weekEvents.push({
date: dateString,
fullDayEvents: fullDayEvents,
timeSlots: dayTimeSlots,
});
};
for (var i = 0; i < 7; i++) {
_loop_1(i);
}
return weekEvents;
}, [initializeEventsWithId, toLocalDate]);
return {
getMonthCalendar: getMonthCalendar,
getWeekEvents: getWeekEvents,
};
};
exports.useCalendar = useCalendar;
exports.default = exports.useCalendar;
//# sourceMappingURL=useCalendar.js.map