{"version":3,"sources":["../src/use-calendar-header.tsx"],"sourcesContent":["import type { HTMLProps, PropGetter, RequiredPropGetter } from \"@yamada-ui/core\"\nimport type { KeyboardEvent } from \"react\"\nimport { ariaAttr, assignRef, dataAttr, handlerAll } from \"@yamada-ui/utils\"\nimport dayjs from \"dayjs\"\nimport { useCallback } from \"react\"\nimport { isMonthInRange } from \"./calendar-utils\"\nimport { useCalendarContext } from \"./use-calendar\"\n\nexport interface UseCalendarHeaderProps {\n  index?: number\n}\n\nexport const useCalendarHeader = ({ index }: UseCalendarHeaderProps) => {\n  const {\n    type,\n    amountOfMonths,\n    dayRefs,\n    maxDate,\n    maxYear,\n    minDate,\n    minYear,\n    month,\n    nextMonth,\n    nextRef,\n    paginateBy,\n    prevMonth,\n    prevRef,\n    rangeYears,\n    setInternalYear,\n    setMonth,\n    setType,\n    setYear,\n    typeRef,\n    year,\n  } = useCalendarContext()\n\n  const minRangeYear = rangeYears[0] ?? minYear\n  const maxRangeYear = rangeYears[rangeYears.length - 1] ?? maxYear\n\n  const onChangeType = useCallback(() => {\n    switch (type) {\n      case \"month\":\n        setType(\"year\", year, month.getMonth())\n\n        break\n\n      case \"date\":\n        setType(\"month\", year, month.getMonth())\n\n        break\n\n      default:\n        break\n    }\n  }, [month, setType, type, year])\n\n  const onPrev = useCallback(() => {\n    switch (type) {\n      case \"year\":\n        setInternalYear((prev) => prev - 12)\n\n        break\n\n      case \"month\":\n        setYear((prev) => prev - 1)\n\n        break\n\n      default:\n        dayRefs.current.clear()\n        setMonth((prev) => dayjs(prev).subtract(paginateBy, \"months\").toDate())\n\n        break\n    }\n  }, [dayRefs, paginateBy, setInternalYear, setMonth, setYear, type])\n\n  const onNext = useCallback(() => {\n    switch (type) {\n      case \"year\":\n        setInternalYear((prev) => prev + 12)\n\n        break\n\n      case \"month\":\n        setYear((prev) => prev + 1)\n\n        break\n\n      default:\n        dayRefs.current.clear()\n        setMonth((prev) => dayjs(prev).add(paginateBy, \"months\").toDate())\n\n        break\n    }\n  }, [dayRefs, paginateBy, setInternalYear, setMonth, setYear, type])\n\n  assignRef(typeRef, onChangeType)\n  assignRef(prevRef, onPrev)\n  assignRef(nextRef, onNext)\n\n  const onKeyDown = useCallback(\n    (ev: KeyboardEvent<HTMLDivElement>) => {\n      const actions: { [key: string]: Function | undefined } = {\n        ArrowDown: onChangeType,\n        ArrowLeft: () => {\n          const isDisabled = (() => {\n            switch (type) {\n              case \"year\":\n                return minRangeYear <= minYear\n\n              case \"month\":\n                return year <= minYear\n\n              default:\n                return !isMonthInRange({ date: prevMonth, maxDate, minDate })\n            }\n          })()\n\n          if (!isDisabled) onPrev()\n        },\n        ArrowRight: () => {\n          const isDisabled = (() => {\n            switch (type) {\n              case \"year\":\n                return maxYear <= maxRangeYear\n\n              case \"month\":\n                return maxYear <= year\n\n              default:\n                return !isMonthInRange({ date: nextMonth, maxDate, minDate })\n            }\n          })()\n\n          if (!isDisabled) onNext()\n        },\n      }\n\n      const action = actions[ev.key]\n\n      if (!action) return\n\n      ev.preventDefault()\n      ev.stopPropagation()\n\n      action(ev)\n    },\n    [\n      onChangeType,\n      onPrev,\n      type,\n      minRangeYear,\n      minYear,\n      year,\n      prevMonth,\n      maxDate,\n      minDate,\n      onNext,\n      maxYear,\n      maxRangeYear,\n      nextMonth,\n    ],\n  )\n\n  const getContainerProps: PropGetter = useCallback(\n    (props = {}) => ({\n      ...props,\n      onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n    }),\n    [onKeyDown],\n  )\n\n  const getControlProps: RequiredPropGetter<\n    { operation: \"next\" | \"prev\" } & HTMLProps<\"button\">,\n    HTMLProps<\"button\">\n  > = useCallback(\n    ({ operation, ...props }) => {\n      const isPrev = operation === \"prev\"\n\n      const ariaLabel = `Go to ${isPrev ? \"previous\" : \"next\"} ${\n        type === \"date\" ? \"month\" : \"year\"\n      }`\n\n      const isHidden = (() => {\n        switch (type) {\n          case \"year\":\n            if (isPrev) {\n              return minRangeYear <= minYear\n            } else {\n              return maxYear <= maxRangeYear\n            }\n\n          case \"month\":\n            if (isPrev) {\n              return year <= minYear\n            } else {\n              return maxYear <= year\n            }\n\n          default:\n            if (typeof index !== \"number\") return\n\n            if (isPrev) {\n              return (\n                index !== 0 ||\n                !isMonthInRange({ date: prevMonth, maxDate, minDate })\n              )\n            } else {\n              return (\n                index + 1 !== amountOfMonths ||\n                !isMonthInRange({ date: nextMonth, maxDate, minDate })\n              )\n            }\n        }\n      })()\n\n      return {\n        \"aria-label\": ariaLabel,\n        ...props,\n        \"aria-disabled\": ariaAttr(isHidden),\n        \"data-disabled\": dataAttr(isHidden),\n        \"data-hidden\": dataAttr(isHidden),\n        tabIndex: -1,\n        onClick: handlerAll(isPrev ? onPrev : onNext, props.onClick),\n      }\n    },\n    [\n      amountOfMonths,\n      index,\n      maxDate,\n      maxRangeYear,\n      maxYear,\n      minDate,\n      minRangeYear,\n      minYear,\n      nextMonth,\n      onNext,\n      onPrev,\n      prevMonth,\n      type,\n      year,\n    ],\n  )\n\n  const getLabelProps: PropGetter<\"button\"> = useCallback(\n    (props = {}) => {\n      return {\n        as: type !== \"year\" ? \"button\" : \"span\",\n        pointerEvents: type !== \"year\" ? \"auto\" : \"none\",\n        ...props,\n        \"aria-live\": type !== \"year\" ? \"polite\" : undefined,\n        tabIndex: !!index ? -1 : 0,\n        onClick: handlerAll(props.onClick, onChangeType),\n      }\n    },\n    [index, onChangeType, type],\n  )\n\n  return { getContainerProps, getControlProps, getLabelProps }\n}\n\nexport type UseCalendarHeaderReturn = ReturnType<typeof useCalendarHeader>\n"],"mappings":"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","names":[]}