| | import { useState } from "react"; |
| |
|
| | import type { CalendarDay, DateLib } from "./classes/index.js"; |
| | import { calculateFocusTarget } from "./helpers/calculateFocusTarget.js"; |
| | import { getNextFocus } from "./helpers/getNextFocus.js"; |
| | import type { |
| | DayPickerProps, |
| | Modifiers, |
| | MoveFocusBy, |
| | MoveFocusDir, |
| | } from "./types/index.js"; |
| | import type { Calendar } from "./useCalendar.js"; |
| |
|
| | export type UseFocus = { |
| | |
| | focused: CalendarDay | undefined; |
| |
|
| | |
| | isFocusTarget: (day: CalendarDay) => boolean; |
| |
|
| | |
| | setFocused: (day: CalendarDay | undefined) => void; |
| |
|
| | |
| | blur: () => void; |
| |
|
| | |
| | moveFocus: (moveBy: MoveFocusBy, moveDir: MoveFocusDir) => void; |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export function useFocus<T extends DayPickerProps>( |
| | props: T, |
| | calendar: Calendar, |
| | getModifiers: (day: CalendarDay) => Modifiers, |
| | isSelected: (date: Date) => boolean, |
| | dateLib: DateLib, |
| | ): UseFocus { |
| | const { autoFocus } = props; |
| | const [lastFocused, setLastFocused] = useState<CalendarDay | undefined>(); |
| |
|
| | const focusTarget = calculateFocusTarget( |
| | calendar.days, |
| | getModifiers, |
| | isSelected || (() => false), |
| | lastFocused, |
| | ); |
| | const [focusedDay, setFocused] = useState<CalendarDay | undefined>( |
| | autoFocus ? focusTarget : undefined, |
| | ); |
| |
|
| | const blur = () => { |
| | setLastFocused(focusedDay); |
| | setFocused(undefined); |
| | }; |
| |
|
| | const moveFocus = (moveBy: MoveFocusBy, moveDir: MoveFocusDir) => { |
| | if (!focusedDay) return; |
| | const nextFocus = getNextFocus( |
| | moveBy, |
| | moveDir, |
| | focusedDay, |
| | calendar.navStart, |
| | calendar.navEnd, |
| | props, |
| | dateLib, |
| | ); |
| | if (!nextFocus) return; |
| |
|
| | if (props.disableNavigation) { |
| | const isNextInCalendar = calendar.days.some((day) => |
| | day.isEqualTo(nextFocus), |
| | ); |
| | if (!isNextInCalendar) { |
| | return; |
| | } |
| | } |
| |
|
| | calendar.goToDay(nextFocus); |
| | setFocused(nextFocus); |
| | }; |
| |
|
| | const isFocusTarget = (day: CalendarDay) => { |
| | return Boolean(focusTarget?.isEqualTo(day)); |
| | }; |
| |
|
| | const useFocus: UseFocus = { |
| | isFocusTarget, |
| | setFocused, |
| | focused: focusedDay, |
| | blur, |
| | moveFocus, |
| | }; |
| |
|
| | return useFocus; |
| | } |
| |
|