@wordpress/components
Version:
UI components for WordPress.
172 lines (165 loc) • 5.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DateRangeCalendar = void 0;
exports.usePreviewRange = usePreviewRange;
var _dateFns = require("date-fns");
var _reactDayPicker = require("react-day-picker");
var _locale = require("react-day-picker/locale");
var _element = require("@wordpress/element");
var _constants = require("../utils/constants");
var _misc = require("../utils/misc");
var _hooks = require("../../utils/hooks");
var _useLocalizationProps = require("../utils/use-localization-props");
var _jsxRuntime = require("react/jsx-runtime");
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function usePreviewRange({
selected,
hoveredDate,
excludeDisabled,
min,
max,
disabled
}) {
return (0, _element.useMemo)(() => {
if (!hoveredDate || !selected?.from) {
return;
}
let previewHighlight;
let potentialNewRange;
// Hovering on a date before the start of the selected range
if (hoveredDate < selected.from) {
var _selected$to;
previewHighlight = {
from: hoveredDate,
to: selected.from
};
potentialNewRange = {
from: hoveredDate,
to: (_selected$to = selected.to) !== null && _selected$to !== void 0 ? _selected$to : selected.from
};
} else if (selected.to && hoveredDate > selected.from && hoveredDate < selected.to) {
// Hovering on a date between the start and end of the selected range
previewHighlight = {
from: selected.from,
to: hoveredDate
};
potentialNewRange = {
from: selected.from,
to: hoveredDate
};
} else if (hoveredDate > selected.from) {
var _selected$to2;
// Hovering on a date after the end of the selected range (either
// because it's greater than selected.to, or because it's not defined)
previewHighlight = {
from: (_selected$to2 = selected.to) !== null && _selected$to2 !== void 0 ? _selected$to2 : selected.from,
to: hoveredDate
};
potentialNewRange = {
from: selected.from,
to: hoveredDate
};
}
if (min !== undefined && min > 0 && potentialNewRange && (0, _dateFns.differenceInCalendarDays)(potentialNewRange.to, potentialNewRange.from) < min) {
previewHighlight = {
from: hoveredDate,
to: hoveredDate
};
}
if (max !== undefined && max > 0 && potentialNewRange && (0, _dateFns.differenceInCalendarDays)(potentialNewRange.to, potentialNewRange.from) > max) {
previewHighlight = {
from: hoveredDate,
to: hoveredDate
};
}
if (excludeDisabled && disabled && potentialNewRange && (0, _reactDayPicker.rangeContainsModifiers)(potentialNewRange, disabled)) {
previewHighlight = {
from: hoveredDate,
to: hoveredDate
};
}
return previewHighlight;
}, [selected, hoveredDate, excludeDisabled, min, max, disabled]);
}
/**
* `DateRangeCalendar` is a React component that provides a customizable calendar
* interface for **date range** selection.
*
* The component is built with accessibility in mind and follows ARIA best
* practices for calendar widgets. It provides keyboard navigation, screen reader
* support, and customizable labels for internationalization.
*/
const DateRangeCalendar = ({
defaultSelected,
selected: selectedProp,
onSelect,
numberOfMonths = 1,
excludeDisabled,
min,
max,
disabled,
locale = _locale.enUS,
timeZone,
...props
}) => {
const localizationProps = (0, _useLocalizationProps.useLocalizationProps)({
locale,
timeZone,
mode: 'range'
});
const onChange = (0, _element.useCallback)((selected, triggerDate, modifiers, e) => {
// Convert internal `null` to `undefined` for the public event handler.
onSelect?.(selected !== null && selected !== void 0 ? selected : undefined, triggerDate, modifiers, e);
}, [onSelect]);
const [selected, setSelected] = (0, _hooks.useControlledValue)({
defaultValue: defaultSelected,
value: selectedProp,
onChange
});
const [hoveredDate, setHoveredDate] = (0, _element.useState)(undefined);
// Compute the preview range for hover effect
const previewRange = usePreviewRange({
selected,
hoveredDate,
excludeDisabled,
min,
max,
disabled
});
const modifiers = (0, _element.useMemo)(() => {
return {
preview: previewRange,
preview_start: previewRange?.from,
preview_end: previewRange?.to
};
}, [previewRange]);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactDayPicker.DayPicker, {
..._constants.COMMON_PROPS,
...localizationProps,
...props,
mode: "range",
numberOfMonths: (0, _misc.clampNumberOfMonths)(numberOfMonths),
disabled: disabled,
excludeDisabled: excludeDisabled,
min: min,
max: max,
selected: selected !== null && selected !== void 0 ? selected : undefined,
onSelect: setSelected,
onDayMouseEnter: date => setHoveredDate(date),
onDayMouseLeave: () => setHoveredDate(undefined),
modifiers: modifiers,
modifiersClassNames: _constants.MODIFIER_CLASSNAMES
});
};
exports.DateRangeCalendar = DateRangeCalendar;
//# sourceMappingURL=index.js.map