( props: AriaDatePickerProps<T>, state: DatePickerState, ref: RefObject<Element | null> )
| 74 | * value. |
| 75 | */ |
| 76 | export function useDatePicker<T extends DateValue>( |
| 77 | props: AriaDatePickerProps<T>, |
| 78 | state: DatePickerState, |
| 79 | ref: RefObject<Element | null> |
| 80 | ): DatePickerAria { |
| 81 | let buttonId = useId(); |
| 82 | let dialogId = useId(); |
| 83 | let fieldId = useId(); |
| 84 | let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/datepicker'); |
| 85 | |
| 86 | let {isInvalid, validationErrors, validationDetails} = state.displayValidation; |
| 87 | let {labelProps, fieldProps, descriptionProps, errorMessageProps} = useField({ |
| 88 | ...props, |
| 89 | labelElementType: 'span', |
| 90 | isInvalid, |
| 91 | errorMessage: props.errorMessage || validationErrors |
| 92 | }); |
| 93 | |
| 94 | let groupProps = useDatePickerGroup(state, ref); |
| 95 | |
| 96 | let labelledBy = fieldProps['aria-labelledby'] || fieldProps.id; |
| 97 | |
| 98 | let {locale} = useLocale(); |
| 99 | let date = state.formatValue(locale, {month: 'long'}); |
| 100 | let description = date ? stringFormatter.format('selectedDateDescription', {date}) : ''; |
| 101 | let descProps = useDescription(description); |
| 102 | let ariaDescribedBy = |
| 103 | [descProps['aria-describedby'], fieldProps['aria-describedby']].filter(Boolean).join(' ') || |
| 104 | undefined; |
| 105 | let domProps = filterDOMProps(props); |
| 106 | let focusManager = useMemo(() => createFocusManager(ref), [ref]); |
| 107 | |
| 108 | let isFocused = useRef(false); |
| 109 | let {focusWithinProps} = useFocusWithin({ |
| 110 | ...props, |
| 111 | isDisabled: state.isOpen, |
| 112 | onBlurWithin: e => { |
| 113 | // Ignore when focus moves into the popover. |
| 114 | let dialog = document.getElementById(dialogId); |
| 115 | if (!nodeContains(dialog, e.relatedTarget)) { |
| 116 | isFocused.current = false; |
| 117 | props.onBlur?.(e); |
| 118 | props.onFocusChange?.(false); |
| 119 | } |
| 120 | }, |
| 121 | onFocusWithin: e => { |
| 122 | if (!isFocused.current) { |
| 123 | isFocused.current = true; |
| 124 | props.onFocus?.(e); |
| 125 | props.onFocusChange?.(true); |
| 126 | } |
| 127 | } |
| 128 | }); |
| 129 | |
| 130 | return { |
| 131 | groupProps: mergeProps(domProps, groupProps, fieldProps, descProps, focusWithinProps, { |
| 132 | role: 'group' as const, |
| 133 | 'aria-disabled': props.isDisabled || null, |
no test coverage detected