{"version":3,"file":"use-dates-state.mjs","names":[],"sources":["../../../src/hooks/use-dates-state/use-dates-state.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useEffect, useState } from 'react';\nimport { DatePickerType, DateStringValue, PickerBaseProps } from '../../types';\nimport { useUncontrolledDates } from '../use-uncontrolled-dates/use-uncontrolled-dates';\nimport { isInRange } from './is-in-range/is-in-range';\n\ninterface UseDatesRangeInput<\n  Type extends DatePickerType = 'default',\n> extends PickerBaseProps<Type> {\n  level: 'year' | 'month' | 'day';\n  type: Type;\n  onMouseLeave?: (event: React.MouseEvent<HTMLDivElement>) => void;\n}\n\nexport function useDatesState<Type extends DatePickerType = 'default'>({\n  type,\n  level,\n  value,\n  defaultValue,\n  onChange,\n  allowSingleDateInRange,\n  allowDeselect,\n  onMouseLeave,\n}: UseDatesRangeInput<Type>) {\n  const [_value, setValue] = useUncontrolledDates({\n    type,\n    value,\n    defaultValue,\n    onChange,\n  });\n\n  const [pickedDate, setPickedDate] = useState<DateStringValue | null>(\n    type === 'range' ? (_value[0] && !_value[1] ? _value[0] : null) : null\n  );\n  const [hoveredDate, setHoveredDate] = useState<DateStringValue | null>(null);\n\n  const onDateChange = (date: DateStringValue) => {\n    if (type === 'range') {\n      if (pickedDate && !_value[1]) {\n        if (dayjs(date).isSame(pickedDate, level) && !allowSingleDateInRange) {\n          setPickedDate(null);\n          setHoveredDate(null);\n          setValue([null, null]);\n          return;\n        }\n\n        const result: [DateStringValue, DateStringValue] = [date, pickedDate];\n        result.sort((a, b) => (dayjs(a).isAfter(dayjs(b)) ? 1 : -1));\n        setValue(result);\n        setHoveredDate(null);\n        setPickedDate(null);\n        return;\n      }\n\n      if (\n        _value[0] &&\n        !_value[1] &&\n        dayjs(date).isSame(_value[0], level) &&\n        !allowSingleDateInRange\n      ) {\n        setPickedDate(null);\n        setHoveredDate(null);\n        setValue([null, null]);\n        return;\n      }\n\n      setValue([date, null]);\n      setHoveredDate(null);\n      setPickedDate(date);\n      return;\n    }\n\n    if (type === 'multiple') {\n      if (_value.some((selected: Date) => dayjs(selected).isSame(date, level))) {\n        setValue(_value.filter((selected: Date) => !dayjs(selected).isSame(date, level)));\n      } else {\n        setValue([..._value, date]);\n      }\n\n      return;\n    }\n\n    if (_value && allowDeselect && dayjs(date).isSame(_value, level)) {\n      setValue(null);\n    } else {\n      setValue(date);\n    }\n  };\n\n  const isDateInRange = (date: DateStringValue) => {\n    if (pickedDate && hoveredDate) {\n      return isInRange(date, [hoveredDate, pickedDate]);\n    }\n\n    if (_value[0] && _value[1]) {\n      return isInRange(date, _value);\n    }\n\n    return false;\n  };\n\n  const onRootMouseLeave =\n    type === 'range'\n      ? (event: React.MouseEvent<HTMLDivElement>) => {\n          onMouseLeave?.(event);\n          setHoveredDate(null);\n        }\n      : onMouseLeave;\n\n  const isFirstInRange = (date: DateStringValue) => {\n    if (!_value[0]) {\n      return false;\n    }\n\n    if (dayjs(date).isSame(_value[0], level)) {\n      return !(hoveredDate && dayjs(hoveredDate).isBefore(_value[0]));\n    }\n\n    return false;\n  };\n\n  const isLastInRange = (date: DateStringValue) => {\n    if (_value[1]) {\n      return dayjs(date).isSame(_value[1], level);\n    }\n\n    if (!_value[0] || !hoveredDate) {\n      return false;\n    }\n\n    return dayjs(hoveredDate).isBefore(_value[0]) && dayjs(date).isSame(_value[0], level);\n  };\n\n  const getControlProps = (date: DateStringValue) => {\n    if (type === 'range') {\n      return {\n        selected: _value.some(\n          (selection: DateStringValue) => selection && dayjs(selection).isSame(date, level)\n        ),\n        inRange: isDateInRange(date),\n        firstInRange: isFirstInRange(date),\n        lastInRange: isLastInRange(date),\n        'data-autofocus': (!!_value[0] && dayjs(_value[0]).isSame(date, level)) || undefined,\n      };\n    }\n\n    if (type === 'multiple') {\n      return {\n        selected: _value.some(\n          (selection: DateStringValue) => selection && dayjs(selection).isSame(date, level)\n        ),\n        'data-autofocus': (!!_value[0] && dayjs(_value[0]).isSame(date, level)) || undefined,\n      };\n    }\n\n    const selected = dayjs(_value).isSame(date, level);\n    return { selected, 'data-autofocus': selected || undefined };\n  };\n\n  const onHoveredDateChange = type === 'range' && pickedDate ? setHoveredDate : () => {};\n\n  useEffect(() => {\n    if (type !== 'range') {\n      return;\n    }\n\n    if (_value[0] && !_value[1]) {\n      setPickedDate(_value[0]);\n    } else {\n      const isNeitherSelected = _value[0] == null && _value[1] == null;\n      const isBothSelected = _value[0] != null && _value[1] != null;\n      if (isNeitherSelected || isBothSelected) {\n        setPickedDate(null);\n        setHoveredDate(null);\n      }\n    }\n  }, [_value]);\n\n  return {\n    onDateChange,\n    onRootMouseLeave,\n    onHoveredDateChange,\n    getControlProps,\n    _value,\n    setValue,\n  };\n}\n"],"mappings":"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"}