UNPKG

@mantine/dates

Version:

Calendars, date and time pickers based on Mantine components

115 lines (114 loc) 4.39 kB
"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