{"version":3,"file":"use-range-picker.mjs","names":[],"sources":["../../../../../../../packages/components/date-picker-panel/src/composables/use-range-picker.ts"],"sourcesContent":["import { getCurrentInstance, inject, ref, unref, watch } from 'vue'\nimport dayjs from 'dayjs'\nimport { isArray } from '@element-plus/utils'\nimport { useLocale, useNamespace } from '@element-plus/hooks'\nimport { isEqual } from 'lodash-unified'\nimport { getDefaultValue, isValidRange } from '../utils'\nimport { ROOT_PICKER_INJECTION_KEY } from '../constants'\nimport { useShortcut } from './use-shortcut'\n\nimport type { Ref } from 'vue'\nimport type { Dayjs } from 'dayjs'\nimport type { PanelRangeSharedProps, RangeState } from '../props/shared'\nimport type { DefaultValue } from '../utils'\n\ntype UseRangePickerProps = {\n  sortDates: (minDate: Dayjs | undefined, maxDate: Dayjs | undefined) => void\n  defaultValue: Ref<DefaultValue>\n  defaultTime?: Ref<DefaultValue>\n  leftDate: Ref<Dayjs>\n  rightDate: Ref<Dayjs>\n  step?: number\n  unit: 'month' | 'year'\n}\n\nexport const useRangePicker = (\n  props: PanelRangeSharedProps,\n  {\n    defaultValue,\n    defaultTime,\n    leftDate,\n    rightDate,\n    step,\n    unit,\n\n    sortDates,\n  }: UseRangePickerProps\n) => {\n  const { emit } = getCurrentInstance()!\n\n  const { pickerNs } = inject(ROOT_PICKER_INJECTION_KEY)!\n  const drpNs = useNamespace('date-range-picker')\n  const { t, lang } = useLocale()\n  const handleShortcutClick = useShortcut(lang)\n  const minDate = ref<Dayjs>()\n  const maxDate = ref<Dayjs>()\n  const rangeState = ref<RangeState>({\n    endDate: null,\n    selecting: false,\n  })\n\n  const handleChangeRange = (val: RangeState) => {\n    rangeState.value = val\n  }\n\n  const handleRangeConfirm = (visible = false) => {\n    const _minDate = unref(minDate)\n    const _maxDate = unref(maxDate)\n\n    if (isValidRange([_minDate, _maxDate])) {\n      emit('pick', [_minDate, _maxDate], visible)\n    }\n  }\n\n  const onSelect = (selecting: boolean) => {\n    rangeState.value.selecting = selecting\n    if (!selecting) {\n      rangeState.value.endDate = null\n    }\n  }\n\n  const parseValue = (parsedValue: PanelRangeSharedProps['parsedValue']) => {\n    if (isArray(parsedValue) && parsedValue.length === 2) {\n      const [start, end] = parsedValue\n      minDate.value = start\n      leftDate.value = start\n      maxDate.value = end\n      sortDates(unref(minDate), unref(maxDate))\n    } else {\n      restoreDefault()\n    }\n  }\n\n  const restoreDefault = () => {\n    let [start, end] = getDefaultValue(unref(defaultValue), {\n      lang: unref(lang),\n      step,\n      unit,\n      unlinkPanels: props.unlinkPanels,\n    })\n    const getShift = (day: Dayjs) => {\n      return day.diff(day.startOf('d'), 'ms')\n    }\n    const maybeTimes = unref(defaultTime)\n    if (maybeTimes) {\n      let leftShift = 0\n      let rightShift = 0\n      if (isArray(maybeTimes)) {\n        const [timeStart, timeEnd] = maybeTimes.map(dayjs)\n        leftShift = getShift(timeStart)\n        rightShift = getShift(timeEnd)\n      } else {\n        const shift = getShift(dayjs(maybeTimes))\n        leftShift = shift\n        rightShift = shift\n      }\n      start = start.startOf('d').add(leftShift, 'ms')\n      end = end.startOf('d').add(rightShift, 'ms')\n    }\n\n    minDate.value = undefined\n    maxDate.value = undefined\n    leftDate.value = start\n    rightDate.value = end\n  }\n\n  watch(\n    defaultValue,\n    (val) => {\n      if (val) {\n        restoreDefault()\n      }\n    },\n    { immediate: true }\n  )\n\n  watch(\n    () => props.parsedValue,\n    (parsedValue) => {\n      if (\n        !(parsedValue as [Dayjs, Dayjs])?.length ||\n        !isEqual(parsedValue, [minDate.value, maxDate.value])\n      ) {\n        parseValue(parsedValue)\n      }\n    },\n    {\n      immediate: true,\n    }\n  )\n\n  watch(\n    () => props.visible,\n    () => {\n      if (props.visible) {\n        parseValue(props.parsedValue)\n      }\n    },\n    { immediate: true }\n  )\n\n  return {\n    minDate,\n    maxDate,\n    rangeState,\n    lang,\n    ppNs: pickerNs,\n    drpNs,\n\n    handleChangeRange,\n    handleRangeConfirm,\n    handleShortcutClick,\n    onSelect,\n    parseValue,\n    t,\n  }\n}\n"],"mappings":";;;;;;;;;;;AAwBA,MAAa,kBACX,OACA,EACE,cACA,aACA,UACA,WACA,MACA,MAEA,gBAEC;CACH,MAAM,EAAE,SAAS,oBAAoB;CAErC,MAAM,EAAE,aAAa,OAAO,0BAA0B;CACtD,MAAM,QAAQ,aAAa,oBAAoB;CAC/C,MAAM,EAAE,GAAG,SAAS,WAAW;CAC/B,MAAM,sBAAsB,YAAY,KAAK;CAC7C,MAAM,UAAU,KAAY;CAC5B,MAAM,UAAU,KAAY;CAC5B,MAAM,aAAa,IAAgB;EACjC,SAAS;EACT,WAAW;EACZ,CAAC;CAEF,MAAM,qBAAqB,QAAoB;AAC7C,aAAW,QAAQ;;CAGrB,MAAM,sBAAsB,UAAU,UAAU;EAC9C,MAAM,WAAW,MAAM,QAAQ;EAC/B,MAAM,WAAW,MAAM,QAAQ;AAE/B,MAAI,aAAa,CAAC,UAAU,SAAS,CAAC,CACpC,MAAK,QAAQ,CAAC,UAAU,SAAS,EAAE,QAAQ;;CAI/C,MAAM,YAAY,cAAuB;AACvC,aAAW,MAAM,YAAY;AAC7B,MAAI,CAAC,UACH,YAAW,MAAM,UAAU;;CAI/B,MAAM,cAAc,gBAAsD;AACxE,MAAI,QAAQ,YAAY,IAAI,YAAY,WAAW,GAAG;GACpD,MAAM,CAAC,OAAO,OAAO;AACrB,WAAQ,QAAQ;AAChB,YAAS,QAAQ;AACjB,WAAQ,QAAQ;AAChB,aAAU,MAAM,QAAQ,EAAE,MAAM,QAAQ,CAAC;QAEzC,iBAAgB;;CAIpB,MAAM,uBAAuB;EAC3B,IAAI,CAAC,OAAO,OAAO,gBAAgB,MAAM,aAAa,EAAE;GACtD,MAAM,MAAM,KAAK;GACjB;GACA;GACA,cAAc,MAAM;GACrB,CAAC;EACF,MAAM,YAAY,QAAe;AAC/B,UAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,EAAE,KAAK;;EAEzC,MAAM,aAAa,MAAM,YAAY;AACrC,MAAI,YAAY;GACd,IAAI,YAAY;GAChB,IAAI,aAAa;AACjB,OAAI,QAAQ,WAAW,EAAE;IACvB,MAAM,CAAC,WAAW,WAAW,WAAW,IAAI,MAAM;AAClD,gBAAY,SAAS,UAAU;AAC/B,iBAAa,SAAS,QAAQ;UACzB;IACL,MAAM,QAAQ,SAAS,MAAM,WAAW,CAAC;AACzC,gBAAY;AACZ,iBAAa;;AAEf,WAAQ,MAAM,QAAQ,IAAI,CAAC,IAAI,WAAW,KAAK;AAC/C,SAAM,IAAI,QAAQ,IAAI,CAAC,IAAI,YAAY,KAAK;;AAG9C,UAAQ,QAAQ;AAChB,UAAQ,QAAQ;AAChB,WAAS,QAAQ;AACjB,YAAU,QAAQ;;AAGpB,OACE,eACC,QAAQ;AACP,MAAI,IACF,iBAAgB;IAGpB,EAAE,WAAW,MAAM,CACpB;AAED,aACQ,MAAM,cACX,gBAAgB;AACf,MACE,CAAE,aAAgC,UAClC,CAAC,QAAQ,aAAa,CAAC,QAAQ,OAAO,QAAQ,MAAM,CAAC,CAErD,YAAW,YAAY;IAG3B,EACE,WAAW,MACZ,CACF;AAED,aACQ,MAAM,eACN;AACJ,MAAI,MAAM,QACR,YAAW,MAAM,YAAY;IAGjC,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EACL;EACA;EACA;EACA;EACA,MAAM;EACN;EAEA;EACA;EACA;EACA;EACA;EACA;EACD"}