{"version":3,"sources":["../src/use-year-list.tsx"],"sourcesContent":["import type { HTMLProps, PropGetter, RequiredPropGetter } from \"@yamada-ui/core\"\nimport type { KeyboardEvent, MouseEvent } from \"react\"\nimport {\n  ariaAttr,\n  dataAttr,\n  handlerAll,\n  isArray,\n  isDisabled,\n  isNumber,\n  mergeRefs,\n  useUnmountEffect,\n  useUpdateEffect,\n} from \"@yamada-ui/utils\"\nimport { createRef, useCallback, useRef } from \"react\"\nimport {\n  disableAllTabIndex,\n  getFocused,\n  getFormattedLabel,\n  onShouldFocus,\n} from \"./calendar-utils\"\nimport { useCalendarContext } from \"./use-calendar\"\n\nexport const useYearList = () => {\n  const {\n    internalYear,\n    locale,\n    maxYear,\n    minYear,\n    month,\n    rangeYears,\n    setInternalYear,\n    setMonth,\n    setType,\n    setYear,\n    value: selectedValue,\n    year,\n    yearFormat,\n    yearRefs,\n    __selectType,\n  } = useCalendarContext()\n\n  const multi = isArray(selectedValue)\n  const containerRef = useRef<HTMLDivElement>(null)\n  const beforeInternalYear = useRef<null | number>(null)\n  const minRangeYear = rangeYears[0] ?? minYear\n  const maxRangeYear = rangeYears[rangeYears.length - 1] ?? maxYear\n  const minYearLabel = getFormattedLabel(minRangeYear, locale, yearFormat)\n  const maxYearLabel = getFormattedLabel(maxRangeYear, locale, yearFormat)\n\n  const label = `${minYearLabel} - ${maxYearLabel}`\n  const ariaLabel = `From ${minYearLabel} to ${maxYearLabel}`\n\n  const onFocusPrev = useCallback(\n    (targetIndex: number) => {\n      if (targetIndex < 0) {\n        if (minRangeYear <= minYear) return\n\n        setInternalYear((prev) => {\n          beforeInternalYear.current = prev\n\n          return prev - 12\n        })\n      } else {\n        const ref = yearRefs.current.get(targetIndex)\n\n        if (ref?.current) {\n          ref.current.focus()\n          ref.current.tabIndex = 0\n        }\n      }\n    },\n    [minYear, minRangeYear, setInternalYear, yearRefs],\n  )\n\n  const onFocusNext = useCallback(\n    (targetIndex: number) => {\n      if (11 < targetIndex) {\n        if (maxYear <= maxRangeYear) return\n\n        setInternalYear((prev) => {\n          beforeInternalYear.current = prev\n\n          return prev + 12\n        })\n      } else {\n        const ref = yearRefs.current.get(targetIndex)\n\n        if (ref?.current) {\n          ref.current.focus()\n          ref.current.tabIndex = 0\n        }\n      }\n    },\n    [maxYear, maxRangeYear, setInternalYear, yearRefs],\n  )\n\n  const onKeyDown = useCallback(\n    (ev: KeyboardEvent<HTMLDivElement>) => {\n      const focusedIndex = getFocused(yearRefs) ?? 0\n\n      const actions: { [key: string]: Function | undefined } = {\n        ArrowDown: () =>\n          focusedIndex + 4 <= 11 ? onFocusNext(focusedIndex + 4) : {},\n        ArrowLeft: () => onFocusPrev(focusedIndex - 1),\n        ArrowRight: () => onFocusNext(focusedIndex + 1),\n        ArrowUp: () =>\n          focusedIndex - 4 >= 0 ? onFocusPrev(focusedIndex - 4) : {},\n        End: () => onFocusNext(11),\n        Home: () => onFocusPrev(0),\n      }\n\n      const action = actions[ev.key]\n\n      if (!action) return\n\n      ev.preventDefault()\n      ev.stopPropagation()\n\n      disableAllTabIndex(yearRefs)\n      action(ev)\n    },\n    [onFocusNext, onFocusPrev, yearRefs],\n  )\n\n  const onClick = useCallback(\n    (ev: MouseEvent, year: number) => {\n      ev.preventDefault()\n      ev.stopPropagation()\n\n      if (isDisabled(ev.target as HTMLElement)) return\n\n      setYear(year)\n      setMonth((prev) => new Date(prev.setFullYear(year)))\n      setType(\"month\", year, month.getMonth())\n    },\n    [month, setMonth, setType, setYear],\n  )\n\n  const getIsSelected = useCallback(\n    (value: number) => {\n      if (__selectType === \"date\" || __selectType === \"month\") {\n        return year === value\n      } else {\n        const year = !multi\n          ? selectedValue?.getFullYear()\n          : selectedValue[0]?.getFullYear()\n\n        return year === value\n      }\n    },\n    [__selectType, multi, selectedValue, year],\n  )\n\n  useUpdateEffect(() => {\n    if (!isNumber(beforeInternalYear.current)) return\n\n    onShouldFocus(\n      yearRefs,\n      () => false,\n      beforeInternalYear.current < internalYear,\n    )\n\n    beforeInternalYear.current = null\n  }, [internalYear])\n\n  useUnmountEffect(() => {\n    yearRefs.current.clear()\n  })\n\n  const getGridProps: PropGetter = useCallback(\n    (props = {}, ref = null) => ({\n      ref: mergeRefs(ref, containerRef),\n      \"aria-label\": ariaLabel,\n      role: \"grid\",\n      ...props,\n      onKeyDown: handlerAll(onKeyDown, props.onKeyDown),\n    }),\n    [ariaLabel, onKeyDown],\n  )\n\n  const getButtonProps: RequiredPropGetter<\n    { index: number; value: number } & Omit<HTMLProps<\"button\">, \"value\">,\n    HTMLProps<\"button\">\n  > = useCallback(\n    ({ index, value, ...props }, ref = null) => {\n      const controlled = isNumber(beforeInternalYear.current)\n      const selected = getIsSelected(value)\n      const disabled = value < minYear || value > maxYear\n\n      yearRefs.current.set(index, createRef<HTMLButtonElement>())\n\n      let tabIndex = -1\n\n      if (controlled) {\n        tabIndex = -1\n      } else if (!rangeYears.includes(year) && rangeYears[0] === value) {\n        tabIndex = 0\n      } else if (selected) {\n        tabIndex = 0\n      }\n\n      return {\n        ref: mergeRefs(ref, yearRefs.current.get(index)),\n        disabled,\n        ...props,\n        \"aria-disabled\": ariaAttr(disabled),\n        \"aria-selected\": ariaAttr(selected),\n        \"data-disabled\": dataAttr(disabled),\n        \"data-selected\": dataAttr(selected),\n        \"data-value\": value,\n        tabIndex,\n        onClick: handlerAll(props.onClick, (ev) => onClick(ev, value)),\n      }\n    },\n    [getIsSelected, minYear, maxYear, yearRefs, rangeYears, year, onClick],\n  )\n\n  return { label, rangeYears, getButtonProps, getGridProps }\n}\n\nexport type UseYearListReturn = ReturnType<typeof useYearList>\n"],"mappings":"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","names":["_a","year"]}