UNPKG

@yamada-ui/calendar

Version:

Yamada UI calendar component

1 lines 9.86 kB
{"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"]}