( props: AriaSelectOptions<T, M>, state: SelectState<T, M>, ref: RefObject<HTMLElement | null> )
| 112 | * @param state - State for the select, as returned by `useListState`. |
| 113 | */ |
| 114 | export function useSelect<T, M extends SelectionMode = 'single'>( |
| 115 | props: AriaSelectOptions<T, M>, |
| 116 | state: SelectState<T, M>, |
| 117 | ref: RefObject<HTMLElement | null> |
| 118 | ): SelectAria<T, M> { |
| 119 | let {keyboardDelegate, isDisabled, isRequired, name, form, validationBehavior = 'aria'} = props; |
| 120 | |
| 121 | // By default, a KeyboardDelegate is provided which uses the DOM to query layout information (e.g. for page up/page down). |
| 122 | // When virtualized, the layout object will be passed in as a prop and override this. |
| 123 | let collator = useCollator({usage: 'search', sensitivity: 'base'}); |
| 124 | let delegate = useMemo( |
| 125 | () => |
| 126 | keyboardDelegate || |
| 127 | new ListKeyboardDelegate(state.collection, state.disabledKeys, ref, collator), |
| 128 | [keyboardDelegate, state.collection, state.disabledKeys, collator, ref] |
| 129 | ); |
| 130 | |
| 131 | let {menuTriggerProps, menuProps} = useMenuTrigger<T>( |
| 132 | { |
| 133 | isDisabled, |
| 134 | type: 'listbox' |
| 135 | }, |
| 136 | state, |
| 137 | ref |
| 138 | ); |
| 139 | |
| 140 | let {keyboardProps} = useKeyboard({ |
| 141 | shortcuts: { |
| 142 | ArrowLeft: () => { |
| 143 | if (state.selectionManager.selectionMode === 'multiple') { |
| 144 | return false; |
| 145 | } |
| 146 | let key = |
| 147 | state.selectedKey != null |
| 148 | ? delegate.getKeyAbove?.(state.selectedKey) |
| 149 | : delegate.getFirstKey?.(); |
| 150 | if (key != null) { |
| 151 | state.setSelectedKey(key); |
| 152 | } |
| 153 | }, |
| 154 | ArrowRight: () => { |
| 155 | if (state.selectionManager.selectionMode === 'multiple') { |
| 156 | return false; |
| 157 | } |
| 158 | let key = |
| 159 | state.selectedKey != null |
| 160 | ? delegate.getKeyBelow?.(state.selectedKey) |
| 161 | : delegate.getFirstKey?.(); |
| 162 | if (key != null) { |
| 163 | state.setSelectedKey(key); |
| 164 | } |
| 165 | } |
| 166 | }, |
| 167 | allowRepeats: true, |
| 168 | onKeyDown: props.onKeyDown, |
| 169 | onKeyUp: props.onKeyUp |
| 170 | }); |
| 171 |
no test coverage detected