{"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 {Calendar, CalendarDate, CalendarIdentifier, DateDuration, GregorianCalendar, isEqualDay, maxDate, minDate, toCalendar, toCalendarDate} from '@internationalized/date';\nimport {CalendarPropsBase, CalendarState, DateValue, MappedDateValue, RangeCalendarState} from './types';\nimport {RangeValue, ValidationState, ValueBase} from '@react-types/shared';\nimport {useCalendarState} from './useCalendarState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useRef, useState} from 'react';\n\nexport type DateRange = RangeValue<DateValue> | null;\nexport interface RangeCalendarProps<T extends DateValue> 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\nexport interface RangeCalendarStateOptions<T extends DateValue = DateValue> 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   * @default {months: 1}\n   */\n  visibleDuration?: DateDuration,\n  /** \n   * Determines the alignment of the visible months on initial render based on the current selection or current date if there is no selection. \n   * @default 'center'\n   */\n  selectionAlignment?: 'start' | 'center' | 'end'\n}\n\n/**\n * Provides state management for a range calendar component.\n * A range calendar displays one or more date grids and allows users to select a contiguous range of dates.\n */\nexport function useRangeCalendarState<T extends DateValue = DateValue>(props: RangeCalendarStateOptions<T>): 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} = props;\n  let [value, setValue] = useControlledState<RangeValue<T> | null, RangeValue<MappedDateValue<T>>>(\n    valueProp!,\n    defaultValue || null!,\n    onChange\n  );\n\n  let [anchorDate, setAnchorDateState] = useState<CalendarDate | null>(null);\n  let alignment: 'center' | 'start' = 'center';\n  if (value && value.start && value.end) {\n    let start = alignCenter(toCalendarDate(value.start), visibleDuration, locale, minValue, maxValue);\n    let end = start.add(visibleDuration).subtract({days: 1});\n\n    if (value.end.compare(end) > 0) {\n      alignment = 'start';\n    }\n  }\n\n  // Available range must be stored in a ref so we have access to the updated version immediately in `isInvalid`.\n  let availableRangeRef = useRef<Partial<RangeValue<DateValue>> | null>(null);\n  let [availableRange, setAvailableRange] = useState<Partial<RangeValue<DateValue>>|null>(null);\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  });\n\n  let updateAvailableRange = (date) => {\n    if (date && props.isDateUnavailable && !props.allowsNonContiguousRanges) {\n      const nextAvailableStartDate = nextUnavailableDate(date, calendar, -1);\n      const nextAvailableEndDate = nextUnavailableDate(date, calendar, 1);\n      availableRangeRef.current = {\n        start: nextAvailableStartDate,\n        end: nextAvailableEndDate\n      };\n      setAvailableRange(availableRangeRef.current);\n    } else {\n      availableRangeRef.current = null;\n      setAvailableRange(null);\n    }\n  };\n\n  // If the visible range changes, we need to update the available range.\n  let [lastVisibleRange, setLastVisibleRange] = useState(calendar.visibleRange);\n  if (!isEqualDay(calendar.visibleRange.start, lastVisibleRange.start) || !isEqualDay(calendar.visibleRange.end, lastVisibleRange.end)) {\n    updateAvailableRange(anchorDate);\n    setLastVisibleRange(calendar.visibleRange);\n  }\n\n  let setAnchorDate = (date: CalendarDate | null) => {\n    if (date) {\n      setAnchorDateState(date);\n      updateAvailableRange(date);\n    } else {\n      setAnchorDateState(null);\n      updateAvailableRange(null);\n    }\n  };\n\n  let highlightedRange = anchorDate ? makeRange(anchorDate, calendar.focusedDate) : 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(constrainedDate, calendar.visibleRange.start, props.isDateUnavailable);\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 {isDateUnavailable} = props;\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      selectDate(calendar.focusedDate);\n    },\n    selectDate,\n    highlightDate(date) {\n      if (anchorDate) {\n        calendar.setFocusedDate(date);\n      }\n    },\n    isSelected(date) {\n      return Boolean(highlightedRange && date.compare(highlightedRange.start) >= 0 && date.compare(highlightedRange.end) <= 0 && !calendar.isCellDisabled(date) && !calendar.isCellUnavailable(date));\n    },\n    isInvalid(date) {\n      return calendar.isInvalid(date) || isInvalid(date, availableRangeRef.current?.start, availableRangeRef.current?.end);\n    },\n    isDragging,\n    setDragging,\n    clearSelection() {\n      setAnchorDate(null);\n      setValue(null);\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(anchorDate: CalendarDate, state: CalendarState, dir: number): CalendarDate | undefined {\n  let nextDate = anchorDate.add({days: dir});\n  while (\n    (dir < 0 ? nextDate.compare(state.visibleRange.start) >= 0 : nextDate.compare(state.visibleRange.end) <= 0) &&\n    !state.isCellUnavailable(nextDate)\n  ) {\n    nextDate = nextDate.add({days: dir});\n  }\n\n  if (state.isCellUnavailable(nextDate)) {\n    return nextDate.add({days: -dir});\n  }\n\n}\n"],"names":[],"version":3,"file":"useRangeCalendarState.mjs.map"}