@wordpress/components
Version:
UI components for WordPress.
127 lines (126 loc) • 4.7 kB
JavaScript
// 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