@wordpress/components
Version:
UI components for WordPress.
8 lines (7 loc) • 7.37 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/calendar/date-range-calendar/index.tsx"],
"sourcesContent": ["/**\n * External dependencies\n */\nimport { differenceInCalendarDays } from 'date-fns';\nimport { DayPicker, rangeContainsModifiers } from 'react-day-picker';\nimport { enUS } from 'react-day-picker/locale';\n/**\n * WordPress dependencies\n */\nimport { useMemo, useState, useCallback } from '@wordpress/element';\n/**\n * Internal dependencies\n */\nimport { COMMON_PROPS, MODIFIER_CLASSNAMES } from '../utils/constants';\nimport { clampNumberOfMonths } from '../utils/misc';\nimport { useControlledValue } from '../../utils/hooks';\nimport { useLocalizationProps } from '../utils/use-localization-props';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport function usePreviewRange({\n selected,\n hoveredDate,\n excludeDisabled,\n min,\n max,\n disabled\n}) {\n return useMemo(() => {\n if (!hoveredDate || !selected?.from) {\n return;\n }\n let previewHighlight;\n let potentialNewRange;\n\n // Hovering on a date before the start of the selected range\n if (hoveredDate < selected.from) {\n previewHighlight = {\n from: hoveredDate,\n to: selected.from\n };\n potentialNewRange = {\n from: hoveredDate,\n to: selected.to ?? selected.from\n };\n } else if (selected.to && hoveredDate > selected.from && hoveredDate < selected.to) {\n // Hovering on a date between the start and end of the selected range\n previewHighlight = {\n from: selected.from,\n to: hoveredDate\n };\n potentialNewRange = {\n from: selected.from,\n to: hoveredDate\n };\n } else if (hoveredDate > selected.from) {\n // Hovering on a date after the end of the selected range (either\n // because it's greater than selected.to, or because it's not defined)\n previewHighlight = {\n from: selected.to ?? selected.from,\n to: hoveredDate\n };\n potentialNewRange = {\n from: selected.from,\n to: hoveredDate\n };\n }\n if (min !== undefined && min > 0 && potentialNewRange && differenceInCalendarDays(potentialNewRange.to, potentialNewRange.from) < min) {\n previewHighlight = {\n from: hoveredDate,\n to: hoveredDate\n };\n }\n if (max !== undefined && max > 0 && potentialNewRange && differenceInCalendarDays(potentialNewRange.to, potentialNewRange.from) > max) {\n previewHighlight = {\n from: hoveredDate,\n to: hoveredDate\n };\n }\n if (excludeDisabled && disabled && potentialNewRange && rangeContainsModifiers(potentialNewRange, disabled)) {\n previewHighlight = {\n from: hoveredDate,\n to: hoveredDate\n };\n }\n return previewHighlight;\n }, [selected, hoveredDate, excludeDisabled, min, max, disabled]);\n}\n\n/**\n * `DateRangeCalendar` is a React component that provides a customizable calendar\n * interface for **date range** selection.\n *\n * The component is built with accessibility in mind and follows ARIA best\n * practices for calendar widgets. It provides keyboard navigation, screen reader\n * support, and customizable labels for internationalization.\n */\nexport const DateRangeCalendar = ({\n defaultSelected,\n selected: selectedProp,\n onSelect,\n numberOfMonths = 1,\n excludeDisabled,\n min,\n max,\n disabled,\n locale = enUS,\n timeZone,\n ...props\n}) => {\n const localizationProps = useLocalizationProps({\n locale,\n timeZone,\n mode: 'range'\n });\n const onChange = useCallback((selected, triggerDate, modifiers, e) => {\n // Convert internal `null` to `undefined` for the public event handler.\n onSelect?.(selected ?? undefined, triggerDate, modifiers, e);\n }, [onSelect]);\n const [selected, setSelected] = useControlledValue({\n defaultValue: defaultSelected,\n value: selectedProp,\n onChange\n });\n const [hoveredDate, setHoveredDate] = useState(undefined);\n\n // Compute the preview range for hover effect\n const previewRange = usePreviewRange({\n selected,\n hoveredDate,\n excludeDisabled,\n min,\n max,\n disabled\n });\n const modifiers = useMemo(() => {\n return {\n preview: previewRange,\n preview_start: previewRange?.from,\n preview_end: previewRange?.to\n };\n }, [previewRange]);\n return /*#__PURE__*/_jsx(DayPicker, {\n ...COMMON_PROPS,\n ...localizationProps,\n ...props,\n mode: \"range\",\n numberOfMonths: clampNumberOfMonths(numberOfMonths),\n disabled: disabled,\n excludeDisabled: excludeDisabled,\n min: min,\n max: max,\n selected: selected ?? undefined,\n onSelect: setSelected,\n onDayMouseEnter: date => setHoveredDate(date),\n onDayMouseLeave: () => setHoveredDate(undefined),\n modifiers: modifiers,\n modifiersClassNames: MODIFIER_CLASSNAMES\n });\n};"],
"mappings": "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",
"names": ["selected", "modifiers"]
}