UNPKG

@wordpress/components

Version:
127 lines (126 loc) 4.7 kB
// packages/components/src/date-time/date/use-lilius/index.ts import { addMonths, addYears, eachDayOfInterval, eachMonthOfInterval, eachWeekOfInterval, endOfMonth, endOfWeek, isAfter, isBefore, isEqual, set, setMonth, setYear, startOfMonth, startOfToday, startOfWeek, subMonths, subYears } from "date-fns"; import { useCallback, useMemo, useState } from "@wordpress/element"; var Month = /* @__PURE__ */ (function(Month2) { Month2[Month2["JANUARY"] = 0] = "JANUARY"; Month2[Month2["FEBRUARY"] = 1] = "FEBRUARY"; Month2[Month2["MARCH"] = 2] = "MARCH"; Month2[Month2["APRIL"] = 3] = "APRIL"; Month2[Month2["MAY"] = 4] = "MAY"; Month2[Month2["JUNE"] = 5] = "JUNE"; Month2[Month2["JULY"] = 6] = "JULY"; Month2[Month2["AUGUST"] = 7] = "AUGUST"; Month2[Month2["SEPTEMBER"] = 8] = "SEPTEMBER"; Month2[Month2["OCTOBER"] = 9] = "OCTOBER"; Month2[Month2["NOVEMBER"] = 10] = "NOVEMBER"; Month2[Month2["DECEMBER"] = 11] = "DECEMBER"; return Month2; })({}); var Day = /* @__PURE__ */ (function(Day2) { Day2[Day2["SUNDAY"] = 0] = "SUNDAY"; Day2[Day2["MONDAY"] = 1] = "MONDAY"; Day2[Day2["TUESDAY"] = 2] = "TUESDAY"; Day2[Day2["WEDNESDAY"] = 3] = "WEDNESDAY"; Day2[Day2["THURSDAY"] = 4] = "THURSDAY"; Day2[Day2["FRIDAY"] = 5] = "FRIDAY"; Day2[Day2["SATURDAY"] = 6] = "SATURDAY"; return Day2; })({}); var inRange = (date, min, max) => (isEqual(date, min) || isAfter(date, min)) && (isEqual(date, max) || isBefore(date, max)); var clearTime = (date) => set(date, { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 }); var useLilius = ({ weekStartsOn = Day.SUNDAY, viewing: initialViewing = /* @__PURE__ */ new Date(), selected: initialSelected = [], numberOfMonths = 1 } = {}) => { const [viewing, setViewing] = useState(initialViewing); const viewToday = useCallback(() => setViewing(startOfToday()), [setViewing]); const viewMonth = useCallback((month) => setViewing((v) => setMonth(v, month)), []); const viewPreviousMonth = useCallback(() => setViewing((v) => subMonths(v, 1)), []); const viewNextMonth = useCallback(() => setViewing((v) => addMonths(v, 1)), []); const viewYear = useCallback((year) => setViewing((v) => setYear(v, year)), []); const viewPreviousYear = useCallback(() => setViewing((v) => subYears(v, 1)), []); const viewNextYear = useCallback(() => setViewing((v) => addYears(v, 1)), []); const [selected, setSelected] = useState(initialSelected.map(clearTime)); const clearSelected = () => setSelected([]); const isSelected = useCallback((date) => selected.findIndex((s) => isEqual(s, date)) > -1, [selected]); const select = useCallback((date, replaceExisting) => { if (replaceExisting) { setSelected(Array.isArray(date) ? date : [date]); } else { setSelected((selectedItems) => selectedItems.concat(Array.isArray(date) ? date : [date])); } }, []); const deselect = useCallback((date) => setSelected((selectedItems) => Array.isArray(date) ? selectedItems.filter((s) => !date.map((d) => d.getTime()).includes(s.getTime())) : selectedItems.filter((s) => !isEqual(s, date))), []); const toggle = useCallback((date, replaceExisting) => isSelected(date) ? deselect(date) : select(date, replaceExisting), [deselect, isSelected, select]); const selectRange = useCallback((start, end, replaceExisting) => { if (replaceExisting) { setSelected(eachDayOfInterval({ start, end })); } else { setSelected((selectedItems) => selectedItems.concat(eachDayOfInterval({ start, end }))); } }, []); const deselectRange = useCallback((start, end) => { setSelected((selectedItems) => selectedItems.filter((s) => !eachDayOfInterval({ start, end }).map((d) => d.getTime()).includes(s.getTime()))); }, []); const calendar = useMemo(() => eachMonthOfInterval({ start: startOfMonth(viewing), end: endOfMonth(addMonths(viewing, numberOfMonths - 1)) }).map((month) => eachWeekOfInterval({ start: startOfMonth(month), end: endOfMonth(month) }, { weekStartsOn }).map((week) => eachDayOfInterval({ start: startOfWeek(week, { weekStartsOn }), end: 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 }; }; export { Day, Month, useLilius }; //# sourceMappingURL=index.js.map