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