UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

97 lines 4.56 kB
"use strict"; 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