UNPKG

@wordpress/components

Version:
172 lines (165 loc) 5.29 kB
"use strict"; 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