{"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"}