UNPKG

@wordpress/components

Version:
163 lines (162 loc) 6.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useLilius = exports.Month = exports.Day = void 0; var _dateFns = require("date-fns"); var _element = require("@wordpress/element"); /** * This source is a local copy of the use-lilius library, since the original * library is not actively maintained. * @see https://github.com/WordPress/gutenberg/discussions/64968 * * use-lilius@2.0.5 * https://github.com/Avarios/use-lilius * * The MIT License (MIT) * * Copyright (c) 2021-Present Danny Tatom * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /** * External dependencies */ /** * WordPress dependencies */ let Month = exports.Month = /*#__PURE__*/function (Month) { Month[Month["JANUARY"] = 0] = "JANUARY"; Month[Month["FEBRUARY"] = 1] = "FEBRUARY"; Month[Month["MARCH"] = 2] = "MARCH"; Month[Month["APRIL"] = 3] = "APRIL"; Month[Month["MAY"] = 4] = "MAY"; Month[Month["JUNE"] = 5] = "JUNE"; Month[Month["JULY"] = 6] = "JULY"; Month[Month["AUGUST"] = 7] = "AUGUST"; Month[Month["SEPTEMBER"] = 8] = "SEPTEMBER"; Month[Month["OCTOBER"] = 9] = "OCTOBER"; Month[Month["NOVEMBER"] = 10] = "NOVEMBER"; Month[Month["DECEMBER"] = 11] = "DECEMBER"; return Month; }({}); let Day = exports.Day = /*#__PURE__*/function (Day) { Day[Day["SUNDAY"] = 0] = "SUNDAY"; Day[Day["MONDAY"] = 1] = "MONDAY"; Day[Day["TUESDAY"] = 2] = "TUESDAY"; Day[Day["WEDNESDAY"] = 3] = "WEDNESDAY"; Day[Day["THURSDAY"] = 4] = "THURSDAY"; Day[Day["FRIDAY"] = 5] = "FRIDAY"; Day[Day["SATURDAY"] = 6] = "SATURDAY"; return Day; }({}); const inRange = (date, min, max) => ((0, _dateFns.isEqual)(date, min) || (0, _dateFns.isAfter)(date, min)) && ((0, _dateFns.isEqual)(date, max) || (0, _dateFns.isBefore)(date, max)); const clearTime = date => (0, _dateFns.set)(date, { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 }); const useLilius = ({ weekStartsOn = Day.SUNDAY, viewing: initialViewing = new Date(), selected: initialSelected = [], numberOfMonths = 1 } = {}) => { const [viewing, setViewing] = (0, _element.useState)(initialViewing); const viewToday = (0, _element.useCallback)(() => setViewing((0, _dateFns.startOfToday)()), [setViewing]); const viewMonth = (0, _element.useCallback)(month => setViewing(v => (0, _dateFns.setMonth)(v, month)), []); const viewPreviousMonth = (0, _element.useCallback)(() => setViewing(v => (0, _dateFns.subMonths)(v, 1)), []); const viewNextMonth = (0, _element.useCallback)(() => setViewing(v => (0, _dateFns.addMonths)(v, 1)), []); const viewYear = (0, _element.useCallback)(year => setViewing(v => (0, _dateFns.setYear)(v, year)), []); const viewPreviousYear = (0, _element.useCallback)(() => setViewing(v => (0, _dateFns.subYears)(v, 1)), []); const viewNextYear = (0, _element.useCallback)(() => setViewing(v => (0, _dateFns.addYears)(v, 1)), []); const [selected, setSelected] = (0, _element.useState)(initialSelected.map(clearTime)); const clearSelected = () => setSelected([]); const isSelected = (0, _element.useCallback)(date => selected.findIndex(s => (0, _dateFns.isEqual)(s, date)) > -1, [selected]); const select = (0, _element.useCallback)((date, replaceExisting) => { if (replaceExisting) { setSelected(Array.isArray(date) ? date : [date]); } else { setSelected(selectedItems => selectedItems.concat(Array.isArray(date) ? date : [date])); } }, []); const deselect = (0, _element.useCallback)(date => setSelected(selectedItems => Array.isArray(date) ? selectedItems.filter(s => !date.map(d => d.getTime()).includes(s.getTime())) : selectedItems.filter(s => !(0, _dateFns.isEqual)(s, date))), []); const toggle = (0, _element.useCallback)((date, replaceExisting) => isSelected(date) ? deselect(date) : select(date, replaceExisting), [deselect, isSelected, select]); const selectRange = (0, _element.useCallback)((start, end, replaceExisting) => { if (replaceExisting) { setSelected((0, _dateFns.eachDayOfInterval)({ start, end })); } else { setSelected(selectedItems => selectedItems.concat((0, _dateFns.eachDayOfInterval)({ start, end }))); } }, []); const deselectRange = (0, _element.useCallback)((start, end) => { setSelected(selectedItems => selectedItems.filter(s => !(0, _dateFns.eachDayOfInterval)({ start, end }).map(d => d.getTime()).includes(s.getTime()))); }, []); const calendar = (0, _element.useMemo)(() => (0, _dateFns.eachMonthOfInterval)({ start: (0, _dateFns.startOfMonth)(viewing), end: (0, _dateFns.endOfMonth)((0, _dateFns.addMonths)(viewing, numberOfMonths - 1)) }).map(month => (0, _dateFns.eachWeekOfInterval)({ start: (0, _dateFns.startOfMonth)(month), end: (0, _dateFns.endOfMonth)(month) }, { weekStartsOn }).map(week => (0, _dateFns.eachDayOfInterval)({ start: (0, _dateFns.startOfWeek)(week, { weekStartsOn }), end: (0, _dateFns.endOfWeek)(week, { weekStartsOn }) }))), [viewing, weekStartsOn, numberOfMonths]); return { clearTime, inRange, viewing, setViewing, viewToday, viewMonth, viewPreviousMonth, viewNextMonth, viewYear, viewPreviousYear, viewNextYear, selected, setSelected, clearSelected, isSelected, select, deselect, toggle, selectRange, deselectRange, calendar }; }; exports.useLilius = useLilius; //# sourceMappingURL=index.js.map