@react-aria/combobox 3.10.4 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +201 -0
  2. package/dist/ar-AE.main.js.map +1 -1
  3. package/dist/ar-AE.module.js.map +1 -1
  4. package/dist/bg-BG.main.js.map +1 -1
  5. package/dist/bg-BG.module.js.map +1 -1
  6. package/dist/cs-CZ.main.js.map +1 -1
  7. package/dist/cs-CZ.module.js.map +1 -1
  8. package/dist/da-DK.main.js.map +1 -1
  9. package/dist/da-DK.module.js.map +1 -1
  10. package/dist/de-DE.main.js.map +1 -1
  11. package/dist/de-DE.module.js.map +1 -1
  12. package/dist/el-GR.main.js.map +1 -1
  13. package/dist/el-GR.module.js.map +1 -1
  14. package/dist/en-US.main.js.map +1 -1
  15. package/dist/en-US.module.js.map +1 -1
  16. package/dist/es-ES.main.js.map +1 -1
  17. package/dist/es-ES.module.js.map +1 -1
  18. package/dist/et-EE.main.js.map +1 -1
  19. package/dist/et-EE.module.js.map +1 -1
  20. package/dist/fi-FI.main.js.map +1 -1
  21. package/dist/fi-FI.module.js.map +1 -1
  22. package/dist/fr-FR.main.js.map +1 -1
  23. package/dist/fr-FR.module.js.map +1 -1
  24. package/dist/he-IL.main.js.map +1 -1
  25. package/dist/he-IL.module.js.map +1 -1
  26. package/dist/hr-HR.main.js.map +1 -1
  27. package/dist/hr-HR.module.js.map +1 -1
  28. package/dist/hu-HU.main.js.map +1 -1
  29. package/dist/hu-HU.module.js.map +1 -1
  30. package/dist/it-IT.main.js.map +1 -1
  31. package/dist/it-IT.module.js.map +1 -1
  32. package/dist/ja-JP.main.js.map +1 -1
  33. package/dist/ja-JP.module.js.map +1 -1
  34. package/dist/ko-KR.main.js.map +1 -1
  35. package/dist/ko-KR.module.js.map +1 -1
  36. package/dist/lt-LT.main.js.map +1 -1
  37. package/dist/lt-LT.module.js.map +1 -1
  38. package/dist/lv-LV.main.js.map +1 -1
  39. package/dist/lv-LV.module.js.map +1 -1
  40. package/dist/nb-NO.main.js.map +1 -1
  41. package/dist/nb-NO.module.js.map +1 -1
  42. package/dist/nl-NL.main.js.map +1 -1
  43. package/dist/nl-NL.module.js.map +1 -1
  44. package/dist/pl-PL.main.js.map +1 -1
  45. package/dist/pl-PL.module.js.map +1 -1
  46. package/dist/pt-BR.main.js.map +1 -1
  47. package/dist/pt-BR.module.js.map +1 -1
  48. package/dist/pt-PT.main.js.map +1 -1
  49. package/dist/pt-PT.module.js.map +1 -1
  50. package/dist/ro-RO.main.js.map +1 -1
  51. package/dist/ro-RO.module.js.map +1 -1
  52. package/dist/ru-RU.main.js.map +1 -1
  53. package/dist/ru-RU.module.js.map +1 -1
  54. package/dist/sk-SK.main.js.map +1 -1
  55. package/dist/sk-SK.module.js.map +1 -1
  56. package/dist/sl-SI.main.js.map +1 -1
  57. package/dist/sl-SI.module.js.map +1 -1
  58. package/dist/sr-SP.main.js.map +1 -1
  59. package/dist/sr-SP.module.js.map +1 -1
  60. package/dist/sv-SE.main.js.map +1 -1
  61. package/dist/sv-SE.module.js.map +1 -1
  62. package/dist/tr-TR.main.js.map +1 -1
  63. package/dist/tr-TR.module.js.map +1 -1
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/uk-UA.main.js.map +1 -1
  66. package/dist/uk-UA.module.js.map +1 -1
  67. package/dist/useComboBox.main.js +20 -15
  68. package/dist/useComboBox.main.js.map +1 -1
  69. package/dist/useComboBox.mjs +21 -16
  70. package/dist/useComboBox.module.js +21 -16
  71. package/dist/useComboBox.module.js.map +1 -1
  72. package/dist/zh-CN.main.js.map +1 -1
  73. package/dist/zh-CN.module.js.map +1 -1
  74. package/dist/zh-TW.main.js.map +1 -1
  75. package/dist/zh-TW.module.js.map +1 -1
  76. package/package.json +20 -19
  77. package/src/useComboBox.ts +14 -12
@@ -81,6 +81,8 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
81
81
  isReadOnly,
82
82
  isDisabled
83
83
  } = props;
84
+ let backupBtnRef = useRef(null);
85
+ buttonRef = buttonRef ?? backupBtnRef;
84
86
 
85
87
  let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/combobox');
86
88
  let {menuTriggerProps, menuProps} = useMenuTrigger<T>(
@@ -136,11 +138,11 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
136
138
  }
137
139
 
138
140
  // If the focused item is a link, trigger opening it. Items that are links are not selectable.
139
- if (state.isOpen && state.selectionManager.focusedKey != null && state.selectionManager.isLink(state.selectionManager.focusedKey)) {
140
- if (e.key === 'Enter') {
141
- let item = listBoxRef.current.querySelector(`[data-key="${CSS.escape(state.selectionManager.focusedKey.toString())}"]`);
142
- if (item instanceof HTMLAnchorElement) {
143
- let collectionItem = state.collection.getItem(state.selectionManager.focusedKey);
141
+ if (state.isOpen && listBoxRef.current && state.selectionManager.focusedKey != null && state.selectionManager.isLink(state.selectionManager.focusedKey)) {
142
+ let item = listBoxRef.current.querySelector(`[data-key="${CSS.escape(state.selectionManager.focusedKey.toString())}"]`);
143
+ if (e.key === 'Enter' && item instanceof HTMLAnchorElement) {
144
+ let collectionItem = state.collection.getItem(state.selectionManager.focusedKey);
145
+ if (collectionItem) {
144
146
  router.open(item, e, collectionItem.props.href, collectionItem.props.routerOptions as RouterOptions);
145
147
  }
146
148
  }
@@ -217,14 +219,14 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
217
219
  let onPress = (e: PressEvent) => {
218
220
  if (e.pointerType === 'touch') {
219
221
  // Focus the input field in case it isn't focused yet
220
- inputRef.current.focus();
222
+ inputRef.current?.focus();
221
223
  state.toggle(null, 'manual');
222
224
  }
223
225
  };
224
226
 
225
227
  let onPressStart = (e: PressEvent) => {
226
228
  if (e.pointerType !== 'touch') {
227
- inputRef.current.focus();
229
+ inputRef.current?.focus();
228
230
  state.toggle((e.pointerType === 'keyboard' || e.pointerType === 'virtual') ? 'first' : null, 'manual');
229
231
  }
230
232
  };
@@ -251,7 +253,7 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
251
253
  // Sometimes VoiceOver on iOS fires two touchend events in quick succession. Ignore the second one.
252
254
  if (e.timeStamp - lastEventTime.current < 500) {
253
255
  e.preventDefault();
254
- inputRef.current.focus();
256
+ inputRef.current?.focus();
255
257
  return;
256
258
  }
257
259
 
@@ -263,7 +265,7 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
263
265
 
264
266
  if (touch.clientX === centerX && touch.clientY === centerY) {
265
267
  e.preventDefault();
266
- inputRef.current.focus();
268
+ inputRef.current?.focus();
267
269
  state.toggle(null, 'manual');
268
270
 
269
271
  lastEventTime.current = e.timeStamp;
@@ -281,13 +283,13 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
281
283
  let lastSection = useRef(sectionKey);
282
284
  let lastItem = useRef(itemKey);
283
285
  useEffect(() => {
284
- if (isAppleDevice() && focusedItem != null && itemKey !== lastItem.current) {
286
+ if (isAppleDevice() && focusedItem != null && itemKey != null && itemKey !== lastItem.current) {
285
287
  let isSelected = state.selectionManager.isSelected(itemKey);
286
288
  let section = sectionKey != null ? state.collection.getItem(sectionKey) : null;
287
289
  let sectionTitle = section?.['aria-label'] || (typeof section?.rendered === 'string' ? section.rendered : '') || '';
288
290
 
289
291
  let announcement = stringFormatter.format('focusAnnouncement', {
290
- isGroupChange: section && sectionKey !== lastSection.current,
292
+ isGroupChange: (section && sectionKey !== lastSection.current) ?? false,
291
293
  groupTitle: sectionTitle,
292
294
  groupCount: section ? [...getChildNodes(section, state.collection)].length : 0,
293
295
  optionText: focusedItem['aria-label'] || focusedItem.textValue || '',
@@ -336,7 +338,7 @@ export function useComboBox<T>(props: AriaComboBoxOptions<T>, state: ComboBoxSta
336
338
 
337
339
  useEffect(() => {
338
340
  if (state.isOpen) {
339
- return ariaHideOutside([inputRef.current, popoverRef.current]);
341
+ return ariaHideOutside([inputRef.current, popoverRef.current].filter(element => element != null));
340
342
  }
341
343
  }, [state.isOpen, inputRef, popoverRef]);
342
344