map • Lines: 1{"mappings":"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","sources":["packages/react-stately/src/calendar/useRangeCalendarState.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {alignCenter, constrainValue, isInvalid, previousAvailableDate} from './utils';\nimport {\n Calendar,\n CalendarDate,\n CalendarIdentifier,\n DateDuration,\n GregorianCalendar,\n maxDate,\n minDate,\n toCalendar,\n toCalendarDate\n} from '@internationalized/date';\nimport {CalendarPropsBase, DateValue, MappedDateValue, RangeCalendarState} from './types';\nimport {RangeValue, ValidationState, ValueBase} from '@react-types/shared';\nimport {useCalendarState} from './useCalendarState';\nimport {useCallback, useMemo, useState} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport type DateRange = RangeValue<DateValue> | null;\nexport interface RangeCalendarProps<T extends DateValue>\n extends CalendarPropsBase, ValueBase<RangeValue<T> | null, RangeValue<MappedDateValue<T>>> {\n /**\n * When combined with `isDateUnavailable`, determines whether non-contiguous ranges,\n * i.e. ranges containing unavailable dates, may be selected.\n */\n allowsNonContiguousRanges?: boolean;\n /**\n * Callback that is called for each date of the calendar. If it returns true, then the date is\n * unavailable. The second argument provides the current selection anchor date, if any. This can\n * be used to adjust the available dates based on the user's first selected date.\n */\n isDateUnavailable?: (date: DateValue, anchorDate: CalendarDate | null) => boolean;\n}\n\nexport interface RangeCalendarStateOptions<\n T extends DateValue = DateValue\n> extends RangeCalendarProps<T> {\n /** The locale to display and edit the value according to. */\n locale: string;\n /**\n * A function that creates a [Calendar](../internationalized/date/Calendar.html)\n * object for a given calendar identifier. Such a function may be imported from the\n * `@internationalized/date` package, or manually implemented to include support for\n * only certain calendars.\n */\n createCalendar: (name: CalendarIdentifier) => Calendar;\n /**\n * The amount of days that will be displayed at once. This affects how pagination works.\n *\n * @default { months: 1 }\n */\n visibleDuration?: DateDuration;\n /**\n * Determines the alignment of the visible months on initial render based on the current selection\n * or current date if there is no selection.\n *\n * @default 'center'\n */\n selectionAlignment?: 'start' | 'center' | 'end';\n}\n\n/**\n * Provides state management for a range calendar component. A range calendar displays one or more\n * date grids and allows users to select a contiguous range of dates.\n */\nexport function useRangeCalendarState<T extends DateValue = DateValue>(\n props: RangeCalendarStateOptions<T>\n): RangeCalendarState<T> {\n let {\n value: valueProp,\n defaultValue,\n onChange,\n createCalendar,\n locale,\n visibleDuration = {months: 1},\n minValue,\n maxValue,\n ...calendarProps\n } = props;\n let [value, setValue] = useControlledState<RangeValue<T> | null, RangeValue<MappedDateValue<T>>>(\n valueProp!,\n defaultValue || null!,\n onChange\n );\n\n let [anchorDate, setAnchorDate] = useState<CalendarDate | null>(null);\n let alignment: 'center' | 'start' = 'center';\n if (value && value.start && value.end) {\n let start = alignCenter(\n toCalendarDate(value.start),\n visibleDuration,\n locale,\n minValue,\n maxValue\n );\n let end = start.add(visibleDuration).subtract({days: 1});\n\n if (value.end.compare(end) > 0) {\n alignment = 'start';\n }\n }\n\n let isDateUnavailable = useMemo(() => {\n let isDateUnavailable = props.isDateUnavailable;\n if (!isDateUnavailable) {\n return undefined;\n }\n\n return (date: DateValue) => isDateUnavailable(date, anchorDate);\n }, [props.isDateUnavailable, anchorDate]);\n\n let getAvailableRange = useCallback(\n (anchorDate: CalendarDate | null) => {\n if (anchorDate && isDateUnavailable && !props.allowsNonContiguousRanges) {\n const nextAvailableStartDate = nextUnavailableDate(\n anchorDate,\n isDateUnavailable,\n visibleDuration,\n -1\n );\n const nextAvailableEndDate = nextUnavailableDate(\n anchorDate,\n isDateUnavailable,\n visibleDuration,\n 1\n );\n return {\n start: nextAvailableStartDate,\n end: nextAvailableEndDate\n };\n } else {\n return null;\n }\n },\n [isDateUnavailable, visibleDuration, props.allowsNonContiguousRanges]\n );\n\n let availableRange = useMemo(\n () => getAvailableRange(anchorDate),\n [getAvailableRange, anchorDate]\n );\n let min = useMemo(() => maxDate(minValue, availableRange?.start), [minValue, availableRange]);\n let max = useMemo(() => minDate(maxValue, availableRange?.end), [maxValue, availableRange]);\n\n let calendar = useCalendarState({\n ...calendarProps,\n value: value && value.start,\n createCalendar,\n locale,\n visibleDuration,\n minValue: min,\n maxValue: max,\n selectionAlignment: props.selectionAlignment || alignment,\n isDateUnavailable\n });\n\n let highlightedRange = anchorDate\n ? makeRange(anchorDate, calendar.focusedDate)\n : value && makeRange(value.start, value.end);\n let selectDate = (date: CalendarDate) => {\n if (props.isReadOnly) {\n return;\n }\n\n const constrainedDate = constrainValue(date, min, max);\n const previousAvailableConstrainedDate = previousAvailableDate(\n constrainedDate,\n calendar.visibleRange.start,\n isDateUnavailable\n );\n if (!previousAvailableConstrainedDate) {\n return;\n }\n\n if (!anchorDate) {\n setAnchorDate(previousAvailableConstrainedDate);\n } else {\n let range = makeRange(anchorDate, previousAvailableConstrainedDate);\n if (range) {\n setValue({\n start: convertValue(range.start, value?.start) as T,\n end: convertValue(range.end, value?.end) as T\n });\n }\n setAnchorDate(null);\n }\n };\n\n let [isDragging, setDragging] = useState(false);\n\n let isInvalidSelection = useMemo(() => {\n if (!value || anchorDate) {\n return false;\n }\n\n if (isDateUnavailable && (isDateUnavailable(value.start) || isDateUnavailable(value.end))) {\n return true;\n }\n\n return isInvalid(value.start, minValue, maxValue) || isInvalid(value.end, minValue, maxValue);\n }, [isDateUnavailable, value, anchorDate, minValue, maxValue]);\n\n let isValueInvalid = props.isInvalid || props.validationState === 'invalid' || isInvalidSelection;\n let validationState: ValidationState | null = isValueInvalid ? 'invalid' : null;\n\n return {\n ...calendar,\n value,\n setValue,\n anchorDate,\n setAnchorDate,\n highlightedRange,\n validationState,\n isValueInvalid,\n selectFocusedDate() {\n if (!calendar.isCellUnavailable(calendar.focusedDate)) {\n selectDate(calendar.focusedDate);\n }\n },\n commitSelection() {\n selectDate(calendar.focusedDate);\n },\n selectDate,\n highlightDate(date) {\n if (anchorDate) {\n calendar.setFocusedDate(date);\n }\n },\n isSelected(date) {\n return Boolean(\n highlightedRange &&\n date.compare(highlightedRange.start) >= 0 &&\n date.compare(highlightedRange.end) <= 0 &&\n !calendar.isCellDisabled(date) &&\n !calendar.isCellUnavailable(date)\n );\n },\n isInvalid(date) {\n return (\n calendar.isInvalid(date) || isInvalid(date, availableRange?.start, availableRange?.end)\n );\n },\n isDragging,\n setDragging,\n clearSelection() {\n setAnchorDate(null);\n setValue(null);\n },\n focusNearestAvailableDate(anchorDate) {\n let availableRange = getAvailableRange(anchorDate);\n let isDateInvalid = (date: CalendarDate) =>\n this.isInvalid(date) || isInvalid(date, availableRange?.start, availableRange?.end);\n let nextDay = anchorDate.add({days: 1});\n if (isDateInvalid(nextDay)) {\n nextDay = anchorDate.subtract({days: 1});\n }\n if (!isDateInvalid(nextDay)) {\n this.setFocusedDate(nextDay);\n this.setFocused(true);\n }\n }\n };\n}\n\nfunction makeRange(start: DateValue, end: DateValue): RangeValue<CalendarDate> | null {\n if (!start || !end) {\n return null;\n }\n\n if (end.compare(start) < 0) {\n [start, end] = [end, start];\n }\n\n return {start: toCalendarDate(start), end: toCalendarDate(end)};\n}\n\nfunction convertValue(newValue: CalendarDate, oldValue?: DateValue): DateValue {\n // The display calendar should not have any effect on the emitted value.\n // Emit dates in the same calendar as the original value, if any, otherwise gregorian.\n newValue = toCalendar(newValue, oldValue?.calendar || new GregorianCalendar());\n\n // Preserve time if the input value had one.\n if (oldValue && 'hour' in oldValue) {\n return oldValue.set(newValue);\n }\n\n return newValue;\n}\n\nfunction nextUnavailableDate(\n anchorDate: CalendarDate,\n isDateUnavailable: (date: CalendarDate) => boolean,\n visibleDuration: DateDuration,\n dir: number\n): CalendarDate | undefined {\n let nextDate = anchorDate.add({days: dir});\n let minDate = anchorDate.subtract(visibleDuration);\n let maxDate = anchorDate.add(visibleDuration);\n while (\n (dir < 0 ? nextDate.compare(minDate) >= 0 : nextDate.compare(maxDate) <= 0) &&\n !isDateUnavailable(nextDate)\n ) {\n nextDate = nextDate.add({days: dir});\n }\n\n if (isDateUnavailable(nextDate)) {\n return nextDate.add({days: -dir});\n }\n}\n"],"names":[],"version":3,"file":"useRangeCalendarState.cjs.map"}