@saas-ui/date-picker
Version:
Chakra UI - Date Picker Component
70 lines (61 loc) • 1.6 kB
text/typescript
import type {} from '@react-types/button'
import { AriaRangeCalendarProps } from '@react-aria/calendar'
import { useRangeCalendar as useAriaRangeCalendar } from '@react-aria/calendar'
import { useRangeCalendarState } from '@react-stately/calendar'
import { useRef, useState, useMemo } from 'react'
import { useDateRangePickerContext } from './date-picker-context'
import { DateValue } from './types'
import { CalendarAction } from './calendar-context'
import { defaultCreateCalendar } from './use-calendar'
export const useRangeCalendar = (props: AriaRangeCalendarProps<DateValue>) => {
const {
locale,
firstDayOfWeek,
timeZone,
calendarProps: contextCalendarProps,
createCalendar = defaultCreateCalendar,
} = useDateRangePickerContext()
const [action, setAction] = useState<CalendarAction>('calendar')
const state = useRangeCalendarState({
...contextCalendarProps,
visibleDuration: { months: 2 },
locale,
firstDayOfWeek,
createCalendar,
})
const ref = useRef<HTMLDivElement>(null)
const {
calendarProps,
prevButtonProps,
nextButtonProps,
errorMessageProps,
title,
} = useAriaRangeCalendar(
{
firstDayOfWeek,
...props,
},
state,
ref
)
const titleProps = useMemo(() => {
return {
onClick() {
setAction(action === 'calendar' ? 'years' : 'calendar')
},
}
}, [action])
return {
state,
locale,
firstDayOfWeek,
calendarProps,
prevButtonProps,
nextButtonProps,
errorMessageProps,
titleProps,
title,
ref,
action,
}
}