@mantine/dates
Version:
Calendars, date and time pickers based on Mantine components
115 lines (114 loc) • 4.39 kB
JavaScript
"use client";
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
const require_use_uncontrolled_dates = require("../use-uncontrolled-dates/use-uncontrolled-dates.cjs");
const require_is_in_range = require("./is-in-range/is-in-range.cjs");
let dayjs = require("dayjs");
dayjs = require_runtime.__toESM(dayjs);
let react = require("react");
//#region packages/@mantine/dates/src/hooks/use-dates-state/use-dates-state.ts
function useDatesState({ type, level, value, defaultValue, onChange, allowSingleDateInRange, allowDeselect, onMouseLeave }) {
const [_value, setValue] = require_use_uncontrolled_dates.useUncontrolledDates({
type,
value,
defaultValue,
onChange
});
const [pickedDate, setPickedDate] = (0, react.useState)(type === "range" ? _value[0] && !_value[1] ? _value[0] : null : null);
const [hoveredDate, setHoveredDate] = (0, react.useState)(null);
const onDateChange = (date) => {
if (type === "range") {
if (pickedDate && !_value[1]) {
if ((0, dayjs.default)(date).isSame(pickedDate, level) && !allowSingleDateInRange) {
setPickedDate(null);
setHoveredDate(null);
setValue([null, null]);
return;
}
const result = [date, pickedDate];
result.sort((a, b) => (0, dayjs.default)(a).isAfter((0, dayjs.default)(b)) ? 1 : -1);
setValue(result);
setHoveredDate(null);
setPickedDate(null);
return;
}
if (_value[0] && !_value[1] && (0, dayjs.default)(date).isSame(_value[0], level) && !allowSingleDateInRange) {
setPickedDate(null);
setHoveredDate(null);
setValue([null, null]);
return;
}
setValue([date, null]);
setHoveredDate(null);
setPickedDate(date);
return;
}
if (type === "multiple") {
if (_value.some((selected) => (0, dayjs.default)(selected).isSame(date, level))) setValue(_value.filter((selected) => !(0, dayjs.default)(selected).isSame(date, level)));
else setValue([..._value, date]);
return;
}
if (_value && allowDeselect && (0, dayjs.default)(date).isSame(_value, level)) setValue(null);
else setValue(date);
};
const isDateInRange = (date) => {
if (pickedDate && hoveredDate) return require_is_in_range.isInRange(date, [hoveredDate, pickedDate]);
if (_value[0] && _value[1]) return require_is_in_range.isInRange(date, _value);
return false;
};
const onRootMouseLeave = type === "range" ? (event) => {
onMouseLeave?.(event);
setHoveredDate(null);
} : onMouseLeave;
const isFirstInRange = (date) => {
if (!_value[0]) return false;
if ((0, dayjs.default)(date).isSame(_value[0], level)) return !(hoveredDate && (0, dayjs.default)(hoveredDate).isBefore(_value[0]));
return false;
};
const isLastInRange = (date) => {
if (_value[1]) return (0, dayjs.default)(date).isSame(_value[1], level);
if (!_value[0] || !hoveredDate) return false;
return (0, dayjs.default)(hoveredDate).isBefore(_value[0]) && (0, dayjs.default)(date).isSame(_value[0], level);
};
const getControlProps = (date) => {
if (type === "range") return {
selected: _value.some((selection) => selection && (0, dayjs.default)(selection).isSame(date, level)),
inRange: isDateInRange(date),
firstInRange: isFirstInRange(date),
lastInRange: isLastInRange(date),
"data-autofocus": !!_value[0] && (0, dayjs.default)(_value[0]).isSame(date, level) || void 0
};
if (type === "multiple") return {
selected: _value.some((selection) => selection && (0, dayjs.default)(selection).isSame(date, level)),
"data-autofocus": !!_value[0] && (0, dayjs.default)(_value[0]).isSame(date, level) || void 0
};
const selected = (0, dayjs.default)(_value).isSame(date, level);
return {
selected,
"data-autofocus": selected || void 0
};
};
const onHoveredDateChange = type === "range" && pickedDate ? setHoveredDate : () => {};
(0, react.useEffect)(() => {
if (type !== "range") return;
if (_value[0] && !_value[1]) setPickedDate(_value[0]);
else {
const isNeitherSelected = _value[0] == null && _value[1] == null;
const isBothSelected = _value[0] != null && _value[1] != null;
if (isNeitherSelected || isBothSelected) {
setPickedDate(null);
setHoveredDate(null);
}
}
}, [_value]);
return {
onDateChange,
onRootMouseLeave,
onHoveredDateChange,
getControlProps,
_value,
setValue
};
}
//#endregion
exports.useDatesState = useDatesState;
//# sourceMappingURL=use-dates-state.cjs.map