{"version":3,"file":"useRangeViewDates.mjs","sources":["../../../../../../../packages/vue-components/vc-picker/src/hooks/useRangeViewDates.ts"],"sourcesContent":["import type { Ref } from 'vue';\nimport type { GenerateConfig } from '../generate';\nimport type { PickerMode, RangeValue } from '../interface';\nimport { computed, ref, watchEffect } from 'vue';\nimport { getClosingViewDate, isSameDecade, isSameMonth, isSameYear } from '../utils/dateUtil';\nimport { getValue, updateValues } from '../utils/miscUtil';\n\nfunction getStartEndDistance<DateType>(\n  startDate: DateType,\n  endDate: DateType,\n  picker: PickerMode,\n  generateConfig: GenerateConfig<DateType>,\n): 'same' | 'closing' | 'far' {\n  const startNext = getClosingViewDate(startDate, picker, generateConfig, 1);\n\n  function getDistance(compareFunc: (start: DateType | null, end: DateType | null) => boolean) {\n    if (compareFunc(startDate, endDate))\n      return 'same';\n\n    if (compareFunc(startNext, endDate))\n      return 'closing';\n\n    return 'far';\n  }\n\n  switch (picker) {\n    case 'year':\n      return getDistance((start, end) => isSameDecade(generateConfig, start, end));\n    case 'quarter':\n    case 'month':\n      return getDistance((start, end) => isSameYear(generateConfig, start, end));\n    default:\n      return getDistance((start, end) => isSameMonth(generateConfig, start, end));\n  }\n}\n\nfunction getRangeViewDate<DateType>(\n  values: RangeValue<DateType>,\n  index: 0 | 1,\n  picker: PickerMode,\n  generateConfig: GenerateConfig<DateType>,\n): DateType | null {\n  const startDate = getValue(values, 0);\n  const endDate = getValue(values, 1);\n\n  if (index === 0)\n    return startDate;\n\n  if (startDate && endDate) {\n    const distance = getStartEndDistance(startDate, endDate, picker, generateConfig);\n    switch (distance) {\n      case 'same':\n        return startDate;\n      case 'closing':\n        return startDate;\n      default:\n        return getClosingViewDate(endDate, picker, generateConfig, -1);\n    }\n  }\n\n  return startDate;\n}\n\nexport default function useRangeViewDates<DateType>({\n  values,\n  picker,\n  defaultDates,\n  generateConfig,\n}: {\n  values: Ref<RangeValue<DateType>>;\n  picker: Ref<PickerMode>;\n  defaultDates: RangeValue<DateType> | undefined;\n  generateConfig: Ref<GenerateConfig<DateType>>;\n}): [Ref<DateType>, Ref<DateType>, (viewDate: DateType | null, index: 0 | 1) => void] {\n  const defaultViewDates = ref<[DateType | null, DateType | null]>([\n    getValue(defaultDates, 0),\n    getValue(defaultDates, 1),\n  ]);\n  const viewDates = ref<RangeValue<DateType>>(null);\n  const startDate = computed(() => getValue(values.value, 0));\n  const endDate = computed(() => getValue(values.value, 1));\n\n  const getViewDate = (index: 0 | 1): DateType => {\n    // If set default view date, use it\n    if (defaultViewDates.value[index])\n      return defaultViewDates.value[index]! as DateType;\n\n    return (\n      (getValue(viewDates.value, index) as any)\n      || getRangeViewDate(values.value, index, picker.value, generateConfig.value)\n      || startDate.value\n      || endDate.value\n      || generateConfig.value.getNow()\n    );\n  };\n\n  const startViewDate = ref(null);\n\n  const endViewDate = ref(null);\n  watchEffect(() => {\n    startViewDate.value = getViewDate(0);\n    endViewDate.value = getViewDate(1);\n  });\n\n  function setViewDate(viewDate: DateType | null, index: 0 | 1) {\n    if (viewDate) {\n      let newViewDates = updateValues(viewDates.value, viewDate as any, index);\n      // Set view date will clean up default one\n      // Should always be an array\n      defaultViewDates.value = updateValues(defaultViewDates.value, null, index) || [null, null];\n\n      // Reset another one when not have value\n      const anotherIndex = (index + 1) % 2;\n      if (!getValue(values.value, anotherIndex))\n        newViewDates = updateValues(newViewDates, viewDate, anotherIndex);\n\n      viewDates.value = newViewDates;\n    } else if (startDate.value || endDate.value) {\n      // Reset all when has values when `viewDate` is `null` which means from open trigger\n      viewDates.value = null;\n    }\n  }\n\n  return [startViewDate, endViewDate, setViewDate];\n}\n"],"names":[],"mappings":"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"}