UNPKG

@yamada-ui/calendar

Version:

Yamada UI calendar component

1 lines 10.2 kB
{"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":[]}