downshift 7.6.0 → 8.0.0-beta.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.
@@ -7,7 +7,7 @@ var _extends = require('@babel/runtime/helpers/extends');
7
7
  var _assertThisInitialized = require('@babel/runtime/helpers/assertThisInitialized');
8
8
  var _inheritsLoose = require('@babel/runtime/helpers/inheritsLoose');
9
9
  var PropTypes = require('prop-types');
10
- var react = require('react');
10
+ var React = require('react');
11
11
  var reactIs = require('react-is');
12
12
  var compute = require('compute-scroll-into-view');
13
13
  var tslib = require('tslib');
@@ -19,6 +19,7 @@ var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
19
19
  var _assertThisInitialized__default = /*#__PURE__*/_interopDefaultLegacy(_assertThisInitialized);
20
20
  var _inheritsLoose__default = /*#__PURE__*/_interopDefaultLegacy(_inheritsLoose);
21
21
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
22
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
22
23
  var compute__default = /*#__PURE__*/_interopDefaultLegacy(compute);
23
24
 
24
25
  var idCounter = 0;
@@ -149,6 +150,11 @@ function generateId() {
149
150
  * Resets idCounter to 0. Used for SSR.
150
151
  */
151
152
  function resetIdCounter() {
153
+ // istanbul ignore next
154
+ if ('useId' in React__default["default"]) {
155
+ console.warn("It is not necessary to call resetIdCounter when using React 18+");
156
+ return;
157
+ }
152
158
  idCounter = 0;
153
159
  }
154
160
 
@@ -294,70 +300,70 @@ function isPlainObject(obj) {
294
300
  }
295
301
 
296
302
  /**
297
- * Returns the new index in the list, in a circular way. If next value is out of bonds from the total,
298
- * it will wrap to either 0 or itemCount - 1.
303
+ * Returns the next non-disabled highlightedIndex value.
299
304
  *
300
- * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.
301
- * @param {number} baseIndex The initial position to move from.
302
- * @param {number} itemCount The total number of items.
303
- * @param {Function} getItemNodeFromIndex Used to check if item is disabled.
304
- * @param {boolean} circular Specify if navigation is circular. Default is true.
305
- * @returns {number} The new index after the move.
305
+ * @param {number} start The current highlightedIndex.
306
+ * @param {number} offset The offset from the current highlightedIndex to start searching.
307
+ * @param {unknown[]} items The items array.
308
+ * @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.
309
+ * @param {boolean?} circular If the search reaches the end, if it can search again starting from the other end.
310
+ * @returns {number} The next highlightedIndex.
306
311
  */
307
- function getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) {
312
+ function getHighlightedIndex(start, offset, items, isItemDisabled, circular) {
308
313
  if (circular === void 0) {
309
- circular = true;
314
+ circular = false;
310
315
  }
311
- if (itemCount === 0) {
316
+ var count = items.length;
317
+ if (count === 0) {
312
318
  return -1;
313
319
  }
314
- var itemsLastIndex = itemCount - 1;
315
- if (typeof baseIndex !== 'number' || baseIndex < 0 || baseIndex >= itemCount) {
316
- baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1;
320
+ var itemsLastIndex = count - 1;
321
+ if (typeof start !== 'number' || start < 0 || start > itemsLastIndex) {
322
+ start = offset > 0 ? -1 : itemsLastIndex + 1;
317
323
  }
318
- var newIndex = baseIndex + moveAmount;
319
- if (newIndex < 0) {
320
- newIndex = circular ? itemsLastIndex : 0;
321
- } else if (newIndex > itemsLastIndex) {
322
- newIndex = circular ? 0 : itemsLastIndex;
324
+ var current = start + offset;
325
+ if (current < 0) {
326
+ current = circular ? itemsLastIndex : 0;
327
+ } else if (current > itemsLastIndex) {
328
+ current = circular ? 0 : itemsLastIndex;
323
329
  }
324
- var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular);
325
- if (nonDisabledNewIndex === -1) {
326
- return baseIndex >= itemCount ? -1 : baseIndex;
330
+ var highlightedIndex = getNonDisabledIndex(current, offset < 0, items, isItemDisabled, circular);
331
+ if (highlightedIndex === -1) {
332
+ return start >= count ? -1 : start;
327
333
  }
328
- return nonDisabledNewIndex;
334
+ return highlightedIndex;
329
335
  }
330
336
 
331
337
  /**
332
- * Returns the next index in the list of an item that is not disabled.
338
+ * Returns the next non-disabled highlightedIndex value.
333
339
  *
334
- * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.
335
- * @param {number} baseIndex The initial position to move from.
336
- * @param {number} itemCount The total number of items.
337
- * @param {Function} getItemNodeFromIndex Used to check if item is disabled.
338
- * @param {boolean} circular Specify if navigation is circular. Default is true.
339
- * @returns {number} The new index. Returns baseIndex if item is not disabled. Returns next non-disabled item otherwise. If no non-disabled found it will return -1.
340
+ * @param {number} start The current highlightedIndex.
341
+ * @param {boolean} backwards If true, it will search backwards from the start.
342
+ * @param {unknown[]} items The items array.
343
+ * @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.
344
+ * @param {boolean} circular If the search reaches the end, if it can search again starting from the other end.
345
+ * @returns {number} The next non-disabled index.
340
346
  */
341
- function getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) {
342
- var currentElementNode = getItemNodeFromIndex(baseIndex);
343
- if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) {
344
- return baseIndex;
347
+ function getNonDisabledIndex(start, backwards, items, isItemDisabled, circular) {
348
+ if (circular === void 0) {
349
+ circular = false;
345
350
  }
346
- if (moveAmount > 0) {
347
- for (var index = baseIndex + 1; index < itemCount; index++) {
348
- if (!getItemNodeFromIndex(index).hasAttribute('disabled')) {
351
+ var count = items.length;
352
+ if (backwards) {
353
+ for (var index = start; index >= 0; index--) {
354
+ if (!isItemDisabled(items[index], index)) {
349
355
  return index;
350
356
  }
351
357
  }
352
358
  } else {
353
- for (var _index = baseIndex - 1; _index >= 0; _index--) {
354
- if (!getItemNodeFromIndex(_index).hasAttribute('disabled')) {
359
+ for (var _index = start; _index < count; _index++) {
360
+ if (!isItemDisabled(items[_index], _index)) {
355
361
  return _index;
356
362
  }
357
363
  }
358
364
  }
359
365
  if (circular) {
360
- return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false);
366
+ return getNonDisabledIndex(backwards ? count - 1 : 0, backwards, items, isItemDisabled);
361
367
  }
362
368
  return -1;
363
369
  }
@@ -537,6 +543,10 @@ var Downshift = /*#__PURE__*/function () {
537
543
  _this.unsetItemCount = function () {
538
544
  _this.itemCount = null;
539
545
  };
546
+ _this.isItemDisabled = function (_item, index) {
547
+ var currentElementNode = _this.getItemNodeFromIndex(index);
548
+ return currentElementNode && currentElementNode.hasAttribute('disabled');
549
+ };
540
550
  _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) {
541
551
  if (highlightedIndex === void 0) {
542
552
  highlightedIndex = _this.props.defaultHighlightedIndex;
@@ -687,7 +697,7 @@ var Downshift = /*#__PURE__*/function () {
687
697
  _this.getRootProps.suppressRefError = suppressRefError;
688
698
  var _this$getState = _this.getState(),
689
699
  isOpen = _this$getState.isOpen;
690
- return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, _this.rootRef), _extends2.role = 'combobox', _extends2['aria-expanded'] = isOpen, _extends2['aria-haspopup'] = 'listbox', _extends2['aria-owns'] = isOpen ? _this.menuId : null, _extends2['aria-labelledby'] = _this.labelId, _extends2), rest);
700
+ return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, _this.rootRef), _extends2.role = 'combobox', _extends2['aria-expanded'] = isOpen, _extends2['aria-haspopup'] = 'listbox', _extends2['aria-owns'] = isOpen ? _this.menuId : undefined, _extends2['aria-labelledby'] = _this.labelId, _extends2), rest);
691
701
  };
692
702
  //\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT
693
703
  _this.keyDownHandlers = {
@@ -708,9 +718,9 @@ var Downshift = /*#__PURE__*/function () {
708
718
  if (itemCount > 0) {
709
719
  var _this2$getState = _this2.getState(),
710
720
  highlightedIndex = _this2$getState.highlightedIndex;
711
- var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) {
712
- return _this2.getItemNodeFromIndex(index);
713
- });
721
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, 1, {
722
+ length: itemCount
723
+ }, _this2.isItemDisabled, true);
714
724
  _this2.setHighlightedIndex(nextHighlightedIndex, {
715
725
  type: keyDownArrowDown
716
726
  });
@@ -735,9 +745,9 @@ var Downshift = /*#__PURE__*/function () {
735
745
  if (itemCount > 0) {
736
746
  var _this3$getState = _this3.getState(),
737
747
  highlightedIndex = _this3$getState.highlightedIndex;
738
- var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) {
739
- return _this3.getItemNodeFromIndex(index);
740
- });
748
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, -1, {
749
+ length: itemCount
750
+ }, _this3.isItemDisabled, true);
741
751
  _this3.setHighlightedIndex(nextHighlightedIndex, {
742
752
  type: keyDownArrowUp
743
753
  });
@@ -785,7 +795,6 @@ var Downshift = /*#__PURE__*/function () {
785
795
  });
786
796
  _this.inputKeyDownHandlers = _extends__default["default"]({}, _this.keyDownHandlers, {
787
797
  Home: function Home(event) {
788
- var _this4 = this;
789
798
  var _this$getState3 = this.getState(),
790
799
  isOpen = _this$getState3.isOpen;
791
800
  if (!isOpen) {
@@ -798,15 +807,14 @@ var Downshift = /*#__PURE__*/function () {
798
807
  }
799
808
 
800
809
  // get next non-disabled starting downwards from 0 if that's disabled.
801
- var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) {
802
- return _this4.getItemNodeFromIndex(index);
803
- }, false);
810
+ var newHighlightedIndex = getNonDisabledIndex(0, false, {
811
+ length: itemCount
812
+ }, this.isItemDisabled);
804
813
  this.setHighlightedIndex(newHighlightedIndex, {
805
814
  type: keyDownHome
806
815
  });
807
816
  },
808
817
  End: function End(event) {
809
- var _this5 = this;
810
818
  var _this$getState4 = this.getState(),
811
819
  isOpen = _this$getState4.isOpen;
812
820
  if (!isOpen) {
@@ -819,9 +827,9 @@ var Downshift = /*#__PURE__*/function () {
819
827
  }
820
828
 
821
829
  // get next non-disabled starting upwards from last index if that's disabled.
822
- var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) {
823
- return _this5.getItemNodeFromIndex(index);
824
- }, false);
830
+ var newHighlightedIndex = getNonDisabledIndex(itemCount - 1, true, {
831
+ length: itemCount
832
+ }, this.isItemDisabled);
825
833
  this.setHighlightedIndex(newHighlightedIndex, {
826
834
  type: keyDownEnd
827
835
  });
@@ -933,8 +941,8 @@ var Downshift = /*#__PURE__*/function () {
933
941
  }
934
942
  return _extends__default["default"]({
935
943
  'aria-autocomplete': 'list',
936
- 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null,
937
- 'aria-controls': isOpen ? _this.menuId : null,
944
+ 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : undefined,
945
+ 'aria-controls': isOpen ? _this.menuId : undefined,
938
946
  'aria-labelledby': rest && rest['aria-label'] ? undefined : _this.labelId,
939
947
  // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
940
948
  // revert back since autocomplete="nope" is ignored on latest Chrome and Opera
@@ -986,7 +994,7 @@ var Downshift = /*#__PURE__*/function () {
986
994
  _this.getMenuProps.called = true;
987
995
  _this.getMenuProps.refKey = refKey;
988
996
  _this.getMenuProps.suppressRefError = suppressRefError;
989
- return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, _this.menuRef), _extends3.role = 'listbox', _extends3['aria-labelledby'] = props && props['aria-label'] ? null : _this.labelId, _extends3.id = _this.menuId, _extends3), props);
997
+ return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, _this.menuRef), _extends3.role = 'listbox', _extends3['aria-labelledby'] = props && props['aria-label'] ? undefined : _this.labelId, _extends3.id = _this.menuId, _extends3), props);
990
998
  };
991
999
  //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU
992
1000
  /////////////////////////////// ITEM
@@ -1191,14 +1199,13 @@ var Downshift = /*#__PURE__*/function () {
1191
1199
  }
1192
1200
  };
1193
1201
  _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) {
1194
- var _this6 = this;
1195
1202
  var itemCount = this.getItemCount();
1196
1203
  var _this$getState8 = this.getState(),
1197
1204
  highlightedIndex = _this$getState8.highlightedIndex;
1198
1205
  if (itemCount > 0) {
1199
- var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) {
1200
- return _this6.getItemNodeFromIndex(index);
1201
- });
1206
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, amount, {
1207
+ length: itemCount
1208
+ }, this.isItemDisabled, true);
1202
1209
  this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet);
1203
1210
  }
1204
1211
  };
@@ -1263,7 +1270,7 @@ var Downshift = /*#__PURE__*/function () {
1263
1270
  };
1264
1271
  };
1265
1272
  _proto.componentDidMount = function componentDidMount() {
1266
- var _this7 = this;
1273
+ var _this4 = this;
1267
1274
  /* istanbul ignore if (react-native) */
1268
1275
  if (process.env.NODE_ENV !== 'production' && !false && this.getMenuProps.called && !this.getMenuProps.suppressRefError) {
1269
1276
  validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);
@@ -1277,18 +1284,18 @@ var Downshift = /*#__PURE__*/function () {
1277
1284
  // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should
1278
1285
  // trigger hiding the menu.
1279
1286
  var onMouseDown = function onMouseDown() {
1280
- _this7.isMouseDown = true;
1287
+ _this4.isMouseDown = true;
1281
1288
  };
1282
1289
  var onMouseUp = function onMouseUp(event) {
1283
- _this7.isMouseDown = false;
1290
+ _this4.isMouseDown = false;
1284
1291
  // if the target element or the activeElement is within a downshift node
1285
1292
  // then we don't want to reset downshift
1286
- var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment);
1287
- if (!contextWithinDownshift && _this7.getState().isOpen) {
1288
- _this7.reset({
1293
+ var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment);
1294
+ if (!contextWithinDownshift && _this4.getState().isOpen) {
1295
+ _this4.reset({
1289
1296
  type: mouseUp
1290
1297
  }, function () {
1291
- return _this7.props.onOuterClick(_this7.getStateAndHelpers());
1298
+ return _this4.props.onOuterClick(_this4.getStateAndHelpers());
1292
1299
  });
1293
1300
  }
1294
1301
  };
@@ -1299,18 +1306,18 @@ var Downshift = /*#__PURE__*/function () {
1299
1306
  // If the user taps outside of Downshift, the component should be reset,
1300
1307
  // but not if the user is swiping
1301
1308
  var onTouchStart = function onTouchStart() {
1302
- _this7.isTouchMove = false;
1309
+ _this4.isTouchMove = false;
1303
1310
  };
1304
1311
  var onTouchMove = function onTouchMove() {
1305
- _this7.isTouchMove = true;
1312
+ _this4.isTouchMove = true;
1306
1313
  };
1307
1314
  var onTouchEnd = function onTouchEnd(event) {
1308
- var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment, false);
1309
- if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) {
1310
- _this7.reset({
1315
+ var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment, false);
1316
+ if (!_this4.isTouchMove && !contextWithinDownshift && _this4.getState().isOpen) {
1317
+ _this4.reset({
1311
1318
  type: touchEnd
1312
1319
  }, function () {
1313
- return _this7.props.onOuterClick(_this7.getStateAndHelpers());
1320
+ return _this4.props.onOuterClick(_this4.getStateAndHelpers());
1314
1321
  });
1315
1322
  }
1316
1323
  };
@@ -1321,8 +1328,8 @@ var Downshift = /*#__PURE__*/function () {
1321
1328
  environment.addEventListener('touchmove', onTouchMove);
1322
1329
  environment.addEventListener('touchend', onTouchEnd);
1323
1330
  this.cleanup = function () {
1324
- _this7.internalClearTimeouts();
1325
- _this7.updateStatus.cancel();
1331
+ _this4.internalClearTimeouts();
1332
+ _this4.updateStatus.cancel();
1326
1333
  environment.removeEventListener('mousedown', onMouseDown);
1327
1334
  environment.removeEventListener('mouseup', onMouseUp);
1328
1335
  environment.removeEventListener('touchstart', onTouchStart);
@@ -1399,7 +1406,7 @@ var Downshift = /*#__PURE__*/function () {
1399
1406
  } else if (isDOMElement(element)) {
1400
1407
  // they didn't apply the root props, but we can clone
1401
1408
  // this and apply the props ourselves
1402
- return /*#__PURE__*/react.cloneElement(element, this.getRootProps(getElementProps(element)));
1409
+ return /*#__PURE__*/React.cloneElement(element, this.getRootProps(getElementProps(element)));
1403
1410
  }
1404
1411
 
1405
1412
  /* istanbul ignore else */
@@ -1414,7 +1421,7 @@ var Downshift = /*#__PURE__*/function () {
1414
1421
  return undefined;
1415
1422
  };
1416
1423
  return Downshift;
1417
- }(react.Component);
1424
+ }(React.Component);
1418
1425
  Downshift.defaultProps = {
1419
1426
  defaultHighlightedIndex: null,
1420
1427
  defaultIsOpen: false,
@@ -1470,13 +1477,15 @@ process.env.NODE_ENV !== "production" ? Downshift.propTypes = {
1470
1477
  itemCount: PropTypes__default["default"].number,
1471
1478
  id: PropTypes__default["default"].string,
1472
1479
  environment: PropTypes__default["default"].shape({
1473
- addEventListener: PropTypes__default["default"].func,
1474
- removeEventListener: PropTypes__default["default"].func,
1480
+ addEventListener: PropTypes__default["default"].func.isRequired,
1481
+ removeEventListener: PropTypes__default["default"].func.isRequired,
1475
1482
  document: PropTypes__default["default"].shape({
1476
- getElementById: PropTypes__default["default"].func,
1477
- activeElement: PropTypes__default["default"].any,
1478
- body: PropTypes__default["default"].any
1479
- })
1483
+ createElement: PropTypes__default["default"].func.isRequired,
1484
+ getElementById: PropTypes__default["default"].func.isRequired,
1485
+ activeElement: PropTypes__default["default"].any.isRequired,
1486
+ body: PropTypes__default["default"].any.isRequired
1487
+ }).isRequired,
1488
+ Node: PropTypes__default["default"].func.isRequired
1480
1489
  }),
1481
1490
  suppressRefError: PropTypes__default["default"].bool,
1482
1491
  scrollIntoView: PropTypes__default["default"].func,
@@ -1583,16 +1592,23 @@ var updateA11yStatus = debounce(function (getA11yMessage, document) {
1583
1592
  }, 200);
1584
1593
 
1585
1594
  // istanbul ignore next
1586
- var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? react.useLayoutEffect : react.useEffect;
1587
- function useElementIds(_ref) {
1588
- var _ref$id = _ref.id,
1589
- id = _ref$id === void 0 ? "downshift-" + generateId() : _ref$id,
1595
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React.useLayoutEffect : React.useEffect;
1596
+
1597
+ // istanbul ignore next
1598
+ var useElementIds = 'useId' in React__default["default"] // Avoid conditional useId call
1599
+ ? function useElementIds(_ref) {
1600
+ var id = _ref.id,
1590
1601
  labelId = _ref.labelId,
1591
1602
  menuId = _ref.menuId,
1592
1603
  getItemId = _ref.getItemId,
1593
1604
  toggleButtonId = _ref.toggleButtonId,
1594
1605
  inputId = _ref.inputId;
1595
- var elementIdsRef = react.useRef({
1606
+ // Avoid conditional useId call
1607
+ var reactId = "downshift-" + React__default["default"].useId();
1608
+ if (!id) {
1609
+ id = reactId;
1610
+ }
1611
+ var elementIdsRef = React.useRef({
1596
1612
  labelId: labelId || id + "-label",
1597
1613
  menuId: menuId || id + "-menu",
1598
1614
  getItemId: getItemId || function (index) {
@@ -1602,7 +1618,25 @@ function useElementIds(_ref) {
1602
1618
  inputId: inputId || id + "-input"
1603
1619
  });
1604
1620
  return elementIdsRef.current;
1605
- }
1621
+ } : function useElementIds(_ref2) {
1622
+ var _ref2$id = _ref2.id,
1623
+ id = _ref2$id === void 0 ? "downshift-" + generateId() : _ref2$id,
1624
+ labelId = _ref2.labelId,
1625
+ menuId = _ref2.menuId,
1626
+ getItemId = _ref2.getItemId,
1627
+ toggleButtonId = _ref2.toggleButtonId,
1628
+ inputId = _ref2.inputId;
1629
+ var elementIdsRef = React.useRef({
1630
+ labelId: labelId || id + "-label",
1631
+ menuId: menuId || id + "-menu",
1632
+ getItemId: getItemId || function (index) {
1633
+ return id + "-item-" + index;
1634
+ },
1635
+ toggleButtonId: toggleButtonId || id + "-toggle-button",
1636
+ inputId: inputId || id + "-input"
1637
+ });
1638
+ return elementIdsRef.current;
1639
+ };
1606
1640
  function getItemAndIndex(itemProp, indexProp, items, errorMessage) {
1607
1641
  var item, index;
1608
1642
  if (itemProp === undefined) {
@@ -1627,7 +1661,7 @@ function capitalizeString(string) {
1627
1661
  return "" + string.slice(0, 1).toUpperCase() + string.slice(1);
1628
1662
  }
1629
1663
  function useLatestRef(val) {
1630
- var ref = react.useRef(val);
1664
+ var ref = React.useRef(val);
1631
1665
  // technically this is not "concurrent mode safe" because we're manipulating
1632
1666
  // the value during render (so it's not idempotent). However, the places this
1633
1667
  // hook is used is to support memoizing callbacks which will be called
@@ -1648,9 +1682,9 @@ function useLatestRef(val) {
1648
1682
  * @returns {Array} An array with the state and an action dispatcher.
1649
1683
  */
1650
1684
  function useEnhancedReducer(reducer, initialState, props) {
1651
- var prevStateRef = react.useRef();
1652
- var actionRef = react.useRef();
1653
- var enhancedReducer = react.useCallback(function (state, action) {
1685
+ var prevStateRef = React.useRef();
1686
+ var actionRef = React.useRef();
1687
+ var enhancedReducer = React.useCallback(function (state, action) {
1654
1688
  actionRef.current = action;
1655
1689
  state = getState(state, action.props);
1656
1690
  var changes = reducer(state, action);
@@ -1659,17 +1693,17 @@ function useEnhancedReducer(reducer, initialState, props) {
1659
1693
  }));
1660
1694
  return newState;
1661
1695
  }, [reducer]);
1662
- var _useReducer = react.useReducer(enhancedReducer, initialState),
1696
+ var _useReducer = React.useReducer(enhancedReducer, initialState),
1663
1697
  state = _useReducer[0],
1664
1698
  dispatch = _useReducer[1];
1665
1699
  var propsRef = useLatestRef(props);
1666
- var dispatchWithProps = react.useCallback(function (action) {
1700
+ var dispatchWithProps = React.useCallback(function (action) {
1667
1701
  return dispatch(_extends__default["default"]({
1668
1702
  props: propsRef.current
1669
1703
  }, action));
1670
1704
  }, [propsRef]);
1671
1705
  var action = actionRef.current;
1672
- react.useEffect(function () {
1706
+ React.useEffect(function () {
1673
1707
  if (action && prevStateRef.current && prevStateRef.current !== state) {
1674
1708
  callOnChangeProps(action, getState(prevStateRef.current, action.props), state);
1675
1709
  }
@@ -1773,11 +1807,11 @@ function getHighlightedIndexOnOpen(props, state, offset) {
1773
1807
  * @returns {Object} Ref containing whether mouseDown or touchMove event is happening
1774
1808
  */
1775
1809
  function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) {
1776
- var mouseAndTouchTrackersRef = react.useRef({
1810
+ var mouseAndTouchTrackersRef = React.useRef({
1777
1811
  isMouseDown: false,
1778
1812
  isTouchMove: false
1779
1813
  });
1780
- react.useEffect(function () {
1814
+ React.useEffect(function () {
1781
1815
  if ((environment == null ? void 0 : environment.addEventListener) == null) {
1782
1816
  return;
1783
1817
  }
@@ -1841,15 +1875,15 @@ var useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1841
1875
  /* istanbul ignore next */
1842
1876
  if (process.env.NODE_ENV !== 'production') {
1843
1877
  useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1844
- var isInitialMountRef = react.useRef(true);
1878
+ var isInitialMountRef = React.useRef(true);
1845
1879
  for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) {
1846
1880
  propKeys[_key] = arguments[_key];
1847
1881
  }
1848
- var getterPropsCalledRef = react.useRef(propKeys.reduce(function (acc, propKey) {
1882
+ var getterPropsCalledRef = React.useRef(propKeys.reduce(function (acc, propKey) {
1849
1883
  acc[propKey] = {};
1850
1884
  return acc;
1851
1885
  }, {}));
1852
- react.useEffect(function () {
1886
+ React.useEffect(function () {
1853
1887
  Object.keys(getterPropsCalledRef.current).forEach(function (propKey) {
1854
1888
  var propCallInfo = getterPropsCalledRef.current[propKey];
1855
1889
  if (isInitialMountRef.current) {
@@ -1869,7 +1903,7 @@ if (process.env.NODE_ENV !== 'production') {
1869
1903
  });
1870
1904
  isInitialMountRef.current = false;
1871
1905
  });
1872
- var setGetterPropCallInfo = react.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1906
+ var setGetterPropCallInfo = React.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1873
1907
  getterPropsCalledRef.current[propKey] = {
1874
1908
  suppressRefError: suppressRefError,
1875
1909
  refKey: refKey,
@@ -1879,14 +1913,14 @@ if (process.env.NODE_ENV !== 'production') {
1879
1913
  return setGetterPropCallInfo;
1880
1914
  };
1881
1915
  }
1882
- function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1883
- var isInitialMount = _ref2.isInitialMount,
1884
- highlightedIndex = _ref2.highlightedIndex,
1885
- items = _ref2.items,
1886
- environment = _ref2.environment,
1887
- rest = _objectWithoutPropertiesLoose__default["default"](_ref2, _excluded$3);
1916
+ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref3) {
1917
+ var isInitialMount = _ref3.isInitialMount,
1918
+ highlightedIndex = _ref3.highlightedIndex,
1919
+ items = _ref3.items,
1920
+ environment = _ref3.environment,
1921
+ rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded$3);
1888
1922
  // Sets a11y status message on changes in state.
1889
- react.useEffect(function () {
1923
+ React.useEffect(function () {
1890
1924
  if (isInitialMount || false) {
1891
1925
  return;
1892
1926
  }
@@ -1900,15 +1934,15 @@ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1900
1934
  // eslint-disable-next-line react-hooks/exhaustive-deps
1901
1935
  }, dependencyArray);
1902
1936
  }
1903
- function useScrollIntoView(_ref3) {
1904
- var highlightedIndex = _ref3.highlightedIndex,
1905
- isOpen = _ref3.isOpen,
1906
- itemRefs = _ref3.itemRefs,
1907
- getItemNodeFromIndex = _ref3.getItemNodeFromIndex,
1908
- menuElement = _ref3.menuElement,
1909
- scrollIntoViewProp = _ref3.scrollIntoView;
1937
+ function useScrollIntoView(_ref4) {
1938
+ var highlightedIndex = _ref4.highlightedIndex,
1939
+ isOpen = _ref4.isOpen,
1940
+ itemRefs = _ref4.itemRefs,
1941
+ getItemNodeFromIndex = _ref4.getItemNodeFromIndex,
1942
+ menuElement = _ref4.menuElement,
1943
+ scrollIntoViewProp = _ref4.scrollIntoView;
1910
1944
  // used not to scroll on highlight by mouse.
1911
- var shouldScrollRef = react.useRef(true);
1945
+ var shouldScrollRef = React.useRef(true);
1912
1946
  // Scroll on highlighted item if change comes from keyboard.
1913
1947
  useIsomorphicLayoutEffect(function () {
1914
1948
  if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {
@@ -1928,13 +1962,13 @@ function useScrollIntoView(_ref3) {
1928
1962
  var useControlPropsValidator = noop;
1929
1963
  /* istanbul ignore next */
1930
1964
  if (process.env.NODE_ENV !== 'production') {
1931
- useControlPropsValidator = function useControlPropsValidator(_ref4) {
1932
- var isInitialMount = _ref4.isInitialMount,
1933
- props = _ref4.props,
1934
- state = _ref4.state;
1965
+ useControlPropsValidator = function useControlPropsValidator(_ref5) {
1966
+ var isInitialMount = _ref5.isInitialMount,
1967
+ props = _ref5.props,
1968
+ state = _ref5.state;
1935
1969
  // used for checking when props are moving from controlled to uncontrolled.
1936
- var prevPropsRef = react.useRef(props);
1937
- react.useEffect(function () {
1970
+ var prevPropsRef = React.useRef(props);
1971
+ React.useEffect(function () {
1938
1972
  if (isInitialMount) {
1939
1973
  return;
1940
1974
  }
@@ -1970,6 +2004,47 @@ function getChangesOnSelection(props, highlightedIndex, inputValue) {
1970
2004
  }));
1971
2005
  }
1972
2006
 
2007
+ // Shared between all exports.
2008
+ var commonPropTypes = {
2009
+ environment: PropTypes__default["default"].shape({
2010
+ addEventListener: PropTypes__default["default"].func.isRequired,
2011
+ removeEventListener: PropTypes__default["default"].func.isRequired,
2012
+ document: PropTypes__default["default"].shape({
2013
+ createElement: PropTypes__default["default"].func.isRequired,
2014
+ getElementById: PropTypes__default["default"].func.isRequired,
2015
+ activeElement: PropTypes__default["default"].any.isRequired,
2016
+ body: PropTypes__default["default"].any.isRequired
2017
+ }).isRequired,
2018
+ Node: PropTypes__default["default"].func.isRequired
2019
+ }),
2020
+ itemToString: PropTypes__default["default"].func,
2021
+ stateReducer: PropTypes__default["default"].func
2022
+ };
2023
+
2024
+ // Shared between useSelect, useCombobox, Downshift.
2025
+ var commonDropdownPropTypes = _extends__default["default"]({}, commonPropTypes, {
2026
+ getA11yStatusMessage: PropTypes__default["default"].func,
2027
+ highlightedIndex: PropTypes__default["default"].number,
2028
+ defaultHighlightedIndex: PropTypes__default["default"].number,
2029
+ initialHighlightedIndex: PropTypes__default["default"].number,
2030
+ isOpen: PropTypes__default["default"].bool,
2031
+ defaultIsOpen: PropTypes__default["default"].bool,
2032
+ initialIsOpen: PropTypes__default["default"].bool,
2033
+ selectedItem: PropTypes__default["default"].any,
2034
+ initialSelectedItem: PropTypes__default["default"].any,
2035
+ defaultSelectedItem: PropTypes__default["default"].any,
2036
+ id: PropTypes__default["default"].string,
2037
+ labelId: PropTypes__default["default"].string,
2038
+ menuId: PropTypes__default["default"].string,
2039
+ getItemId: PropTypes__default["default"].func,
2040
+ toggleButtonId: PropTypes__default["default"].string,
2041
+ onSelectedItemChange: PropTypes__default["default"].func,
2042
+ onHighlightedIndexChange: PropTypes__default["default"].func,
2043
+ onStateChange: PropTypes__default["default"].func,
2044
+ onIsOpenChange: PropTypes__default["default"].func,
2045
+ scrollIntoView: PropTypes__default["default"].func
2046
+ });
2047
+
1973
2048
  function downshiftCommonReducer(state, action, stateChangeTypes) {
1974
2049
  var type = action.type,
1975
2050
  props = action.props;
@@ -2029,56 +2104,22 @@ function downshiftCommonReducer(state, action, stateChangeTypes) {
2029
2104
  /* eslint-enable complexity */
2030
2105
 
2031
2106
  function getItemIndexByCharacterKey(_a) {
2032
- var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, getItemNodeFromIndex = _a.getItemNodeFromIndex;
2107
+ var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, isItemDisabled = _a.isItemDisabled;
2033
2108
  var lowerCasedKeysSoFar = keysSoFar.toLowerCase();
2034
2109
  for (var index = 0; index < items.length; index++) {
2035
2110
  // if we already have a search query in progress, we also consider the current highlighted item.
2036
2111
  var offsetIndex = (index + highlightedIndex + (keysSoFar.length < 2 ? 1 : 0)) % items.length;
2037
2112
  var item = items[offsetIndex];
2038
2113
  if (item !== undefined &&
2039
- itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar)) {
2040
- var element = getItemNodeFromIndex(offsetIndex);
2041
- if (!(element === null || element === void 0 ? void 0 : element.hasAttribute('disabled'))) {
2042
- return offsetIndex;
2043
- }
2114
+ itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar) &&
2115
+ !isItemDisabled(item, offsetIndex)) {
2116
+ return offsetIndex;
2044
2117
  }
2045
2118
  }
2046
2119
  return highlightedIndex;
2047
2120
  }
2048
- var propTypes$2 = {
2049
- items: PropTypes__default["default"].array.isRequired,
2050
- itemToString: PropTypes__default["default"].func,
2051
- getA11yStatusMessage: PropTypes__default["default"].func,
2052
- getA11ySelectionMessage: PropTypes__default["default"].func,
2053
- highlightedIndex: PropTypes__default["default"].number,
2054
- defaultHighlightedIndex: PropTypes__default["default"].number,
2055
- initialHighlightedIndex: PropTypes__default["default"].number,
2056
- isOpen: PropTypes__default["default"].bool,
2057
- defaultIsOpen: PropTypes__default["default"].bool,
2058
- initialIsOpen: PropTypes__default["default"].bool,
2059
- selectedItem: PropTypes__default["default"].any,
2060
- initialSelectedItem: PropTypes__default["default"].any,
2061
- defaultSelectedItem: PropTypes__default["default"].any,
2062
- id: PropTypes__default["default"].string,
2063
- labelId: PropTypes__default["default"].string,
2064
- menuId: PropTypes__default["default"].string,
2065
- getItemId: PropTypes__default["default"].func,
2066
- toggleButtonId: PropTypes__default["default"].string,
2067
- stateReducer: PropTypes__default["default"].func,
2068
- onSelectedItemChange: PropTypes__default["default"].func,
2069
- onHighlightedIndexChange: PropTypes__default["default"].func,
2070
- onStateChange: PropTypes__default["default"].func,
2071
- onIsOpenChange: PropTypes__default["default"].func,
2072
- environment: PropTypes__default["default"].shape({
2073
- addEventListener: PropTypes__default["default"].func,
2074
- removeEventListener: PropTypes__default["default"].func,
2075
- document: PropTypes__default["default"].shape({
2076
- getElementById: PropTypes__default["default"].func,
2077
- activeElement: PropTypes__default["default"].any,
2078
- body: PropTypes__default["default"].any
2079
- })
2080
- })
2081
- };
2121
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2122
+ var propTypes$2 = tslib.__assign(tslib.__assign({}, commonDropdownPropTypes), { items: PropTypes__default["default"].array.isRequired, isItemDisabled: PropTypes__default["default"].func, getA11ySelectionMessage: PropTypes__default["default"].func });
2082
2123
  /**
2083
2124
  * Default implementation for status message. Only added when menu is open.
2084
2125
  * Will specift if there are results in the list, and if so, how many,
@@ -2100,7 +2141,9 @@ function getA11yStatusMessage(_a) {
2100
2141
  }
2101
2142
  return '';
2102
2143
  }
2103
- var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage });
2144
+ var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage, isItemDisabled: function () {
2145
+ return false;
2146
+ } });
2104
2147
  // eslint-disable-next-line import/no-mutable-exports
2105
2148
  var validatePropTypes$2 = noop;
2106
2149
  /* istanbul ignore next */
@@ -2184,7 +2227,7 @@ function downshiftSelectReducer(state, action) {
2184
2227
  highlightedIndex: prevHighlightedIndex,
2185
2228
  items: props.items,
2186
2229
  itemToString: props.itemToString,
2187
- getItemNodeFromIndex: action.getItemNodeFromIndex
2230
+ isItemDisabled: props.isItemDisabled
2188
2231
  });
2189
2232
  changes = {
2190
2233
  inputValue: inputValue,
@@ -2195,7 +2238,7 @@ function downshiftSelectReducer(state, action) {
2195
2238
  break;
2196
2239
  case ToggleButtonKeyDownArrowDown:
2197
2240
  {
2198
- var _highlightedIndex = state.isOpen ? getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2241
+ var _highlightedIndex = state.isOpen ? getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2199
2242
  changes = {
2200
2243
  highlightedIndex: _highlightedIndex,
2201
2244
  isOpen: true
@@ -2206,7 +2249,7 @@ function downshiftSelectReducer(state, action) {
2206
2249
  if (state.isOpen && altKey) {
2207
2250
  changes = getChangesOnSelection(props, state.highlightedIndex, false);
2208
2251
  } else {
2209
- var _highlightedIndex2 = state.isOpen ? getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : getHighlightedIndexOnOpen(props, state, -1);
2252
+ var _highlightedIndex2 = state.isOpen ? getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled) : getHighlightedIndexOnOpen(props, state, -1);
2210
2253
  changes = {
2211
2254
  highlightedIndex: _highlightedIndex2,
2212
2255
  isOpen: true
@@ -2220,24 +2263,24 @@ function downshiftSelectReducer(state, action) {
2220
2263
  break;
2221
2264
  case ToggleButtonKeyDownHome:
2222
2265
  changes = {
2223
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false),
2266
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled),
2224
2267
  isOpen: true
2225
2268
  };
2226
2269
  break;
2227
2270
  case ToggleButtonKeyDownEnd:
2228
2271
  changes = {
2229
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false),
2272
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled),
2230
2273
  isOpen: true
2231
2274
  };
2232
2275
  break;
2233
2276
  case ToggleButtonKeyDownPageUp:
2234
2277
  changes = {
2235
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2278
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled)
2236
2279
  };
2237
2280
  break;
2238
2281
  case ToggleButtonKeyDownPageDown:
2239
2282
  changes = {
2240
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2283
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled)
2241
2284
  };
2242
2285
  break;
2243
2286
  case ToggleButtonKeyDownEscape:
@@ -2268,7 +2311,7 @@ function downshiftSelectReducer(state, action) {
2268
2311
 
2269
2312
  var _excluded$2 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"],
2270
2313
  _excluded2$2 = ["onBlur", "onClick", "onPress", "onKeyDown", "refKey", "ref"],
2271
- _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "ref", "disabled"];
2314
+ _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "disabled", "ref"];
2272
2315
  useSelect.stateChangeTypes = stateChangeTypes$2;
2273
2316
  function useSelect(userProps) {
2274
2317
  if (userProps === void 0) {
@@ -2294,16 +2337,16 @@ function useSelect(userProps) {
2294
2337
  inputValue = state.inputValue;
2295
2338
 
2296
2339
  // Element efs.
2297
- var toggleButtonRef = react.useRef(null);
2298
- var menuRef = react.useRef(null);
2299
- var itemRefs = react.useRef({});
2340
+ var toggleButtonRef = React.useRef(null);
2341
+ var menuRef = React.useRef(null);
2342
+ var itemRefs = React.useRef({});
2300
2343
  // used to keep the inputValue clearTimeout object between renders.
2301
- var clearTimeoutRef = react.useRef(null);
2344
+ var clearTimeoutRef = React.useRef(null);
2302
2345
  // prevent id re-generation between renders.
2303
2346
  var elementIds = useElementIds(props);
2304
2347
  // used to keep track of how many items we had on previous cycle.
2305
- var previousResultCountRef = react.useRef();
2306
- var isInitialMountRef = react.useRef(true);
2348
+ var previousResultCountRef = React.useRef();
2349
+ var isInitialMountRef = React.useRef(true);
2307
2350
  // utility callback to get item element.
2308
2351
  var latest = useLatestRef({
2309
2352
  state: state,
@@ -2311,7 +2354,7 @@ function useSelect(userProps) {
2311
2354
  });
2312
2355
 
2313
2356
  // Some utils.
2314
- var getItemNodeFromIndex = react.useCallback(function (index) {
2357
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2315
2358
  return itemRefs.current[elementIds.getItemId(index)];
2316
2359
  }, [elementIds]);
2317
2360
 
@@ -2343,7 +2386,7 @@ function useSelect(userProps) {
2343
2386
  });
2344
2387
 
2345
2388
  // Sets cleanup for the keysSoFar callback, debounded after 500ms.
2346
- react.useEffect(function () {
2389
+ React.useEffect(function () {
2347
2390
  // init the clean function here as we need access to dispatch.
2348
2391
  clearTimeoutRef.current = debounce(function (outerDispatch) {
2349
2392
  outerDispatch({
@@ -2359,7 +2402,7 @@ function useSelect(userProps) {
2359
2402
  }, []);
2360
2403
 
2361
2404
  // Invokes the keysSoFar callback set up above.
2362
- react.useEffect(function () {
2405
+ React.useEffect(function () {
2363
2406
  if (!inputValue) {
2364
2407
  return;
2365
2408
  }
@@ -2370,7 +2413,7 @@ function useSelect(userProps) {
2370
2413
  props: props,
2371
2414
  state: state
2372
2415
  });
2373
- react.useEffect(function () {
2416
+ React.useEffect(function () {
2374
2417
  if (isInitialMountRef.current) {
2375
2418
  return;
2376
2419
  }
@@ -2384,27 +2427,26 @@ function useSelect(userProps) {
2384
2427
  });
2385
2428
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps');
2386
2429
  // Make initial ref false.
2387
- react.useEffect(function () {
2430
+ React.useEffect(function () {
2388
2431
  isInitialMountRef.current = false;
2389
2432
  return function () {
2390
2433
  isInitialMountRef.current = true;
2391
2434
  };
2392
2435
  }, []);
2393
2436
  // Reset itemRefs on close.
2394
- react.useEffect(function () {
2437
+ React.useEffect(function () {
2395
2438
  if (!isOpen) {
2396
2439
  itemRefs.current = {};
2397
2440
  }
2398
2441
  }, [isOpen]);
2399
2442
 
2400
2443
  // Event handler functions.
2401
- var toggleButtonKeyDownHandlers = react.useMemo(function () {
2444
+ var toggleButtonKeyDownHandlers = React.useMemo(function () {
2402
2445
  return {
2403
2446
  ArrowDown: function ArrowDown(event) {
2404
2447
  event.preventDefault();
2405
2448
  dispatch({
2406
2449
  type: ToggleButtonKeyDownArrowDown,
2407
- getItemNodeFromIndex: getItemNodeFromIndex,
2408
2450
  altKey: event.altKey
2409
2451
  });
2410
2452
  },
@@ -2412,22 +2454,19 @@ function useSelect(userProps) {
2412
2454
  event.preventDefault();
2413
2455
  dispatch({
2414
2456
  type: ToggleButtonKeyDownArrowUp,
2415
- getItemNodeFromIndex: getItemNodeFromIndex,
2416
2457
  altKey: event.altKey
2417
2458
  });
2418
2459
  },
2419
2460
  Home: function Home(event) {
2420
2461
  event.preventDefault();
2421
2462
  dispatch({
2422
- type: ToggleButtonKeyDownHome,
2423
- getItemNodeFromIndex: getItemNodeFromIndex
2463
+ type: ToggleButtonKeyDownHome
2424
2464
  });
2425
2465
  },
2426
2466
  End: function End(event) {
2427
2467
  event.preventDefault();
2428
2468
  dispatch({
2429
- type: ToggleButtonKeyDownEnd,
2430
- getItemNodeFromIndex: getItemNodeFromIndex
2469
+ type: ToggleButtonKeyDownEnd
2431
2470
  });
2432
2471
  },
2433
2472
  Escape: function Escape() {
@@ -2447,8 +2486,7 @@ function useSelect(userProps) {
2447
2486
  if (latest.current.state.isOpen) {
2448
2487
  event.preventDefault();
2449
2488
  dispatch({
2450
- type: ToggleButtonKeyDownPageUp,
2451
- getItemNodeFromIndex: getItemNodeFromIndex
2489
+ type: ToggleButtonKeyDownPageUp
2452
2490
  });
2453
2491
  }
2454
2492
  },
@@ -2456,8 +2494,7 @@ function useSelect(userProps) {
2456
2494
  if (latest.current.state.isOpen) {
2457
2495
  event.preventDefault();
2458
2496
  dispatch({
2459
- type: ToggleButtonKeyDownPageDown,
2460
- getItemNodeFromIndex: getItemNodeFromIndex
2497
+ type: ToggleButtonKeyDownPageDown
2461
2498
  });
2462
2499
  }
2463
2500
  },
@@ -2473,8 +2510,7 @@ function useSelect(userProps) {
2473
2510
  if (currentState.inputValue) {
2474
2511
  dispatch({
2475
2512
  type: ToggleButtonKeyDownCharacter,
2476
- key: ' ',
2477
- getItemNodeFromIndex: getItemNodeFromIndex
2513
+ key: ' '
2478
2514
  });
2479
2515
  } else {
2480
2516
  dispatch({
@@ -2483,55 +2519,55 @@ function useSelect(userProps) {
2483
2519
  }
2484
2520
  }
2485
2521
  };
2486
- }, [dispatch, getItemNodeFromIndex, latest]);
2522
+ }, [dispatch, latest]);
2487
2523
 
2488
2524
  // Action functions.
2489
- var toggleMenu = react.useCallback(function () {
2525
+ var toggleMenu = React.useCallback(function () {
2490
2526
  dispatch({
2491
2527
  type: FunctionToggleMenu$1
2492
2528
  });
2493
2529
  }, [dispatch]);
2494
- var closeMenu = react.useCallback(function () {
2530
+ var closeMenu = React.useCallback(function () {
2495
2531
  dispatch({
2496
2532
  type: FunctionCloseMenu$1
2497
2533
  });
2498
2534
  }, [dispatch]);
2499
- var openMenu = react.useCallback(function () {
2535
+ var openMenu = React.useCallback(function () {
2500
2536
  dispatch({
2501
2537
  type: FunctionOpenMenu$1
2502
2538
  });
2503
2539
  }, [dispatch]);
2504
- var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) {
2540
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
2505
2541
  dispatch({
2506
2542
  type: FunctionSetHighlightedIndex$1,
2507
2543
  highlightedIndex: newHighlightedIndex
2508
2544
  });
2509
2545
  }, [dispatch]);
2510
- var selectItem = react.useCallback(function (newSelectedItem) {
2546
+ var selectItem = React.useCallback(function (newSelectedItem) {
2511
2547
  dispatch({
2512
2548
  type: FunctionSelectItem$1,
2513
2549
  selectedItem: newSelectedItem
2514
2550
  });
2515
2551
  }, [dispatch]);
2516
- var reset = react.useCallback(function () {
2552
+ var reset = React.useCallback(function () {
2517
2553
  dispatch({
2518
2554
  type: FunctionReset$2
2519
2555
  });
2520
2556
  }, [dispatch]);
2521
- var setInputValue = react.useCallback(function (newInputValue) {
2557
+ var setInputValue = React.useCallback(function (newInputValue) {
2522
2558
  dispatch({
2523
2559
  type: FunctionSetInputValue$1,
2524
2560
  inputValue: newInputValue
2525
2561
  });
2526
2562
  }, [dispatch]);
2527
2563
  // Getter functions.
2528
- var getLabelProps = react.useCallback(function (labelProps) {
2564
+ var getLabelProps = React.useCallback(function (labelProps) {
2529
2565
  return _extends__default["default"]({
2530
2566
  id: elementIds.labelId,
2531
2567
  htmlFor: elementIds.toggleButtonId
2532
2568
  }, labelProps);
2533
2569
  }, [elementIds]);
2534
- var getMenuProps = react.useCallback(function (_temp, _temp2) {
2570
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
2535
2571
  var _extends2;
2536
2572
  var _ref = _temp === void 0 ? {} : _temp,
2537
2573
  onMouseLeave = _ref.onMouseLeave,
@@ -2554,7 +2590,7 @@ function useSelect(userProps) {
2554
2590
  menuRef.current = menuNode;
2555
2591
  }), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = rest && rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, menuHandleMouseLeave), _extends2), rest);
2556
2592
  }, [dispatch, setGetterPropCallInfo, elementIds]);
2557
- var getToggleButtonProps = react.useCallback(function (_temp3, _temp4) {
2593
+ var getToggleButtonProps = React.useCallback(function (_temp3, _temp4) {
2558
2594
  var _extends3;
2559
2595
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
2560
2596
  onBlur = _ref3.onBlur,
@@ -2588,8 +2624,7 @@ function useSelect(userProps) {
2588
2624
  } else if (isAcceptedCharacterKey(key)) {
2589
2625
  dispatch({
2590
2626
  type: ToggleButtonKeyDownCharacter,
2591
- key: key,
2592
- getItemNodeFromIndex: getItemNodeFromIndex
2627
+ key: key
2593
2628
  });
2594
2629
  }
2595
2630
  };
@@ -2605,8 +2640,8 @@ function useSelect(userProps) {
2605
2640
  }
2606
2641
  setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef);
2607
2642
  return toggleProps;
2608
- }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers, getItemNodeFromIndex]);
2609
- var getItemProps = react.useCallback(function (_temp5) {
2643
+ }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers]);
2644
+ var getItemProps = React.useCallback(function (_temp5) {
2610
2645
  var _extends4;
2611
2646
  var _ref5 = _temp5 === void 0 ? {} : _temp5,
2612
2647
  itemProp = _ref5.item,
@@ -2616,15 +2651,19 @@ function useSelect(userProps) {
2616
2651
  _ref5.onPress;
2617
2652
  var _ref5$refKey = _ref5.refKey,
2618
2653
  refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,
2654
+ disabledProp = _ref5.disabled,
2619
2655
  ref = _ref5.ref,
2620
- disabled = _ref5.disabled,
2621
2656
  rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3$1);
2657
+ if (disabledProp !== undefined) {
2658
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useSelect.');
2659
+ }
2622
2660
  var _latest$current = latest.current,
2623
2661
  latestState = _latest$current.state,
2624
2662
  latestProps = _latest$current.props;
2625
2663
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
2626
2664
  item = _getItemAndIndex[0],
2627
2665
  index = _getItemAndIndex[1];
2666
+ var disabled = latestProps.isItemDisabled(item, index);
2628
2667
  var itemHandleMouseMove = function itemHandleMouseMove() {
2629
2668
  if (index === latestState.highlightedIndex) {
2630
2669
  return;
@@ -2642,16 +2681,11 @@ function useSelect(userProps) {
2642
2681
  index: index
2643
2682
  });
2644
2683
  };
2645
- var itemProps = _extends__default["default"]((_extends4 = {
2646
- disabled: disabled,
2647
- role: 'option',
2648
- 'aria-selected': "" + (item === selectedItem),
2649
- id: elementIds.getItemId(index)
2650
- }, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2684
+ var itemProps = _extends__default["default"]((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2651
2685
  if (itemNode) {
2652
2686
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
2653
2687
  }
2654
- }), _extends4), rest);
2688
+ }), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = "" + (item === latestState.selectedItem), _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4), rest);
2655
2689
  if (!disabled) {
2656
2690
  /* istanbul ignore next (react-native) */
2657
2691
  {
@@ -2660,7 +2694,7 @@ function useSelect(userProps) {
2660
2694
  }
2661
2695
  itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove);
2662
2696
  return itemProps;
2663
- }, [latest, selectedItem, elementIds, shouldScrollRef, dispatch]);
2697
+ }, [latest, elementIds, shouldScrollRef, dispatch]);
2664
2698
  return {
2665
2699
  // prop getters.
2666
2700
  getToggleButtonProps: getToggleButtonProps,
@@ -2693,7 +2727,7 @@ var InputKeyDownPageDown = process.env.NODE_ENV !== "production" ? '__input_keyd
2693
2727
  var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 7;
2694
2728
  var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 8;
2695
2729
  var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 9;
2696
- var InputFocus = process.env.NODE_ENV !== "production" ? '__input_focus__' : 10;
2730
+ var InputClick = process.env.NODE_ENV !== "production" ? '__input_click__' : 10;
2697
2731
  var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 11;
2698
2732
  var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 12;
2699
2733
  var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 13;
@@ -2719,7 +2753,7 @@ var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({
2719
2753
  InputKeyDownEnter: InputKeyDownEnter,
2720
2754
  InputChange: InputChange,
2721
2755
  InputBlur: InputBlur,
2722
- InputFocus: InputFocus,
2756
+ InputClick: InputClick,
2723
2757
  MenuMouseLeave: MenuMouseLeave,
2724
2758
  ItemMouseMove: ItemMouseMove,
2725
2759
  ItemClick: ItemClick,
@@ -2745,46 +2779,17 @@ function getInitialState$1(props) {
2745
2779
  inputValue: inputValue
2746
2780
  });
2747
2781
  }
2748
- var propTypes$1 = {
2782
+ var propTypes$1 = _extends__default["default"]({}, commonDropdownPropTypes, {
2749
2783
  items: PropTypes__default["default"].array.isRequired,
2750
- itemToString: PropTypes__default["default"].func,
2784
+ isItemDisabled: PropTypes__default["default"].func,
2751
2785
  selectedItemChanged: PropTypes__default["default"].func,
2752
- getA11yStatusMessage: PropTypes__default["default"].func,
2753
2786
  getA11ySelectionMessage: PropTypes__default["default"].func,
2754
- highlightedIndex: PropTypes__default["default"].number,
2755
- defaultHighlightedIndex: PropTypes__default["default"].number,
2756
- initialHighlightedIndex: PropTypes__default["default"].number,
2757
- isOpen: PropTypes__default["default"].bool,
2758
- defaultIsOpen: PropTypes__default["default"].bool,
2759
- initialIsOpen: PropTypes__default["default"].bool,
2760
- selectedItem: PropTypes__default["default"].any,
2761
- initialSelectedItem: PropTypes__default["default"].any,
2762
- defaultSelectedItem: PropTypes__default["default"].any,
2763
2787
  inputValue: PropTypes__default["default"].string,
2764
2788
  defaultInputValue: PropTypes__default["default"].string,
2765
2789
  initialInputValue: PropTypes__default["default"].string,
2766
- id: PropTypes__default["default"].string,
2767
- labelId: PropTypes__default["default"].string,
2768
- menuId: PropTypes__default["default"].string,
2769
- getItemId: PropTypes__default["default"].func,
2770
2790
  inputId: PropTypes__default["default"].string,
2771
- toggleButtonId: PropTypes__default["default"].string,
2772
- stateReducer: PropTypes__default["default"].func,
2773
- onSelectedItemChange: PropTypes__default["default"].func,
2774
- onHighlightedIndexChange: PropTypes__default["default"].func,
2775
- onStateChange: PropTypes__default["default"].func,
2776
- onIsOpenChange: PropTypes__default["default"].func,
2777
- onInputValueChange: PropTypes__default["default"].func,
2778
- environment: PropTypes__default["default"].shape({
2779
- addEventListener: PropTypes__default["default"].func,
2780
- removeEventListener: PropTypes__default["default"].func,
2781
- document: PropTypes__default["default"].shape({
2782
- getElementById: PropTypes__default["default"].func,
2783
- activeElement: PropTypes__default["default"].any,
2784
- body: PropTypes__default["default"].any
2785
- })
2786
- })
2787
- };
2791
+ onInputValueChange: PropTypes__default["default"].func
2792
+ });
2788
2793
 
2789
2794
  /**
2790
2795
  * The useCombobox version of useControlledReducer, which also
@@ -2799,13 +2804,13 @@ var propTypes$1 = {
2799
2804
  * @returns {Array} An array with the state and an action dispatcher.
2800
2805
  */
2801
2806
  function useControlledReducer(reducer, initialState, props) {
2802
- var previousSelectedItemRef = react.useRef();
2807
+ var previousSelectedItemRef = React.useRef();
2803
2808
  var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props),
2804
2809
  state = _useEnhancedReducer[0],
2805
2810
  dispatch = _useEnhancedReducer[1];
2806
2811
 
2807
2812
  // ToDo: if needed, make same approach as selectedItemChanged from Downshift.
2808
- react.useEffect(function () {
2813
+ React.useEffect(function () {
2809
2814
  if (!isControlledProp(props, 'selectedItem')) {
2810
2815
  return;
2811
2816
  }
@@ -2833,7 +2838,10 @@ var defaultProps$1 = _extends__default["default"]({}, defaultProps$3, {
2833
2838
  selectedItemChanged: function selectedItemChanged(prevItem, item) {
2834
2839
  return prevItem !== item;
2835
2840
  },
2836
- getA11yStatusMessage: getA11yStatusMessage$1
2841
+ getA11yStatusMessage: getA11yStatusMessage$1,
2842
+ isItemDisabled: function isItemDisabled() {
2843
+ return false;
2844
+ }
2837
2845
  });
2838
2846
 
2839
2847
  /* eslint-disable complexity */
@@ -2855,11 +2863,11 @@ function downshiftUseComboboxReducer(state, action) {
2855
2863
  case InputKeyDownArrowDown:
2856
2864
  if (state.isOpen) {
2857
2865
  changes = {
2858
- highlightedIndex: getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2866
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled, true)
2859
2867
  };
2860
2868
  } else {
2861
2869
  changes = {
2862
- highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex),
2870
+ highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1),
2863
2871
  isOpen: props.items.length >= 0
2864
2872
  };
2865
2873
  }
@@ -2870,12 +2878,12 @@ function downshiftUseComboboxReducer(state, action) {
2870
2878
  changes = getChangesOnSelection(props, state.highlightedIndex);
2871
2879
  } else {
2872
2880
  changes = {
2873
- highlightedIndex: getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2881
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled, true)
2874
2882
  };
2875
2883
  }
2876
2884
  } else {
2877
2885
  changes = {
2878
- highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex),
2886
+ highlightedIndex: getHighlightedIndexOnOpen(props, state, -1),
2879
2887
  isOpen: props.items.length >= 0
2880
2888
  };
2881
2889
  }
@@ -2894,22 +2902,22 @@ function downshiftUseComboboxReducer(state, action) {
2894
2902
  break;
2895
2903
  case InputKeyDownPageUp:
2896
2904
  changes = {
2897
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2905
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled, true)
2898
2906
  };
2899
2907
  break;
2900
2908
  case InputKeyDownPageDown:
2901
2909
  changes = {
2902
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2910
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled, true)
2903
2911
  };
2904
2912
  break;
2905
2913
  case InputKeyDownHome:
2906
2914
  changes = {
2907
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false)
2915
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled)
2908
2916
  };
2909
2917
  break;
2910
2918
  case InputKeyDownEnd:
2911
2919
  changes = {
2912
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false)
2920
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled)
2913
2921
  };
2914
2922
  break;
2915
2923
  case InputBlur:
@@ -2928,10 +2936,10 @@ function downshiftUseComboboxReducer(state, action) {
2928
2936
  inputValue: action.inputValue
2929
2937
  };
2930
2938
  break;
2931
- case InputFocus:
2939
+ case InputClick:
2932
2940
  changes = {
2933
- isOpen: true,
2934
- highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)
2941
+ isOpen: !state.isOpen,
2942
+ highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)
2935
2943
  };
2936
2944
  break;
2937
2945
  case FunctionSelectItem:
@@ -2955,7 +2963,7 @@ function downshiftUseComboboxReducer(state, action) {
2955
2963
  var _excluded$1 = ["onMouseLeave", "refKey", "ref"],
2956
2964
  _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onMouseDown", "onClick", "onPress", "disabled"],
2957
2965
  _excluded3 = ["onClick", "onPress", "refKey", "ref"],
2958
- _excluded4 = ["onKeyDown", "onChange", "onInput", "onFocus", "onBlur", "onChangeText", "refKey", "ref"];
2966
+ _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "onClick", "refKey", "ref"];
2959
2967
  useCombobox.stateChangeTypes = stateChangeTypes$1;
2960
2968
  function useCombobox(userProps) {
2961
2969
  if (userProps === void 0) {
@@ -2983,21 +2991,21 @@ function useCombobox(userProps) {
2983
2991
  inputValue = state.inputValue;
2984
2992
 
2985
2993
  // Element refs.
2986
- var menuRef = react.useRef(null);
2987
- var itemRefs = react.useRef({});
2988
- var inputRef = react.useRef(null);
2989
- var toggleButtonRef = react.useRef(null);
2990
- var isInitialMountRef = react.useRef(true);
2994
+ var menuRef = React.useRef(null);
2995
+ var itemRefs = React.useRef({});
2996
+ var inputRef = React.useRef(null);
2997
+ var toggleButtonRef = React.useRef(null);
2998
+ var isInitialMountRef = React.useRef(true);
2991
2999
  // prevent id re-generation between renders.
2992
3000
  var elementIds = useElementIds(props);
2993
3001
  // used to keep track of how many items we had on previous cycle.
2994
- var previousResultCountRef = react.useRef();
3002
+ var previousResultCountRef = React.useRef();
2995
3003
  // utility callback to get item element.
2996
3004
  var latest = useLatestRef({
2997
3005
  state: state,
2998
3006
  props: props
2999
3007
  });
3000
- var getItemNodeFromIndex = react.useCallback(function (index) {
3008
+ var getItemNodeFromIndex = React.useCallback(function (index) {
3001
3009
  return itemRefs.current[elementIds.getItemId(index)];
3002
3010
  }, [elementIds]);
3003
3011
 
@@ -3033,14 +3041,14 @@ function useCombobox(userProps) {
3033
3041
  state: state
3034
3042
  });
3035
3043
  // Focus the input on first render if required.
3036
- react.useEffect(function () {
3044
+ React.useEffect(function () {
3037
3045
  var focusOnOpen = initialIsOpen || defaultIsOpen || isOpen;
3038
3046
  if (focusOnOpen && inputRef.current) {
3039
3047
  inputRef.current.focus();
3040
3048
  }
3041
3049
  // eslint-disable-next-line react-hooks/exhaustive-deps
3042
3050
  }, []);
3043
- react.useEffect(function () {
3051
+ React.useEffect(function () {
3044
3052
  if (isInitialMountRef.current) {
3045
3053
  return;
3046
3054
  }
@@ -3055,14 +3063,14 @@ function useCombobox(userProps) {
3055
3063
  });
3056
3064
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getMenuProps');
3057
3065
  // Make initial ref false.
3058
- react.useEffect(function () {
3066
+ React.useEffect(function () {
3059
3067
  isInitialMountRef.current = false;
3060
3068
  return function () {
3061
3069
  isInitialMountRef.current = true;
3062
3070
  };
3063
3071
  }, []);
3064
3072
  // Reset itemRefs on close.
3065
- react.useEffect(function () {
3073
+ React.useEffect(function () {
3066
3074
  var _environment$document;
3067
3075
  if (!isOpen) {
3068
3076
  itemRefs.current = {};
@@ -3073,22 +3081,20 @@ function useCombobox(userProps) {
3073
3081
  }, [isOpen, environment]);
3074
3082
 
3075
3083
  /* Event handler functions */
3076
- var inputKeyDownHandlers = react.useMemo(function () {
3084
+ var inputKeyDownHandlers = React.useMemo(function () {
3077
3085
  return {
3078
3086
  ArrowDown: function ArrowDown(event) {
3079
3087
  event.preventDefault();
3080
3088
  dispatch({
3081
3089
  type: InputKeyDownArrowDown,
3082
- altKey: event.altKey,
3083
- getItemNodeFromIndex: getItemNodeFromIndex
3090
+ altKey: event.altKey
3084
3091
  });
3085
3092
  },
3086
3093
  ArrowUp: function ArrowUp(event) {
3087
3094
  event.preventDefault();
3088
3095
  dispatch({
3089
3096
  type: InputKeyDownArrowUp,
3090
- altKey: event.altKey,
3091
- getItemNodeFromIndex: getItemNodeFromIndex
3097
+ altKey: event.altKey
3092
3098
  });
3093
3099
  },
3094
3100
  Home: function Home(event) {
@@ -3097,8 +3103,7 @@ function useCombobox(userProps) {
3097
3103
  }
3098
3104
  event.preventDefault();
3099
3105
  dispatch({
3100
- type: InputKeyDownHome,
3101
- getItemNodeFromIndex: getItemNodeFromIndex
3106
+ type: InputKeyDownHome
3102
3107
  });
3103
3108
  },
3104
3109
  End: function End(event) {
@@ -3107,8 +3112,7 @@ function useCombobox(userProps) {
3107
3112
  }
3108
3113
  event.preventDefault();
3109
3114
  dispatch({
3110
- type: InputKeyDownEnd,
3111
- getItemNodeFromIndex: getItemNodeFromIndex
3115
+ type: InputKeyDownEnd
3112
3116
  });
3113
3117
  },
3114
3118
  Escape: function Escape(event) {
@@ -3129,16 +3133,14 @@ function useCombobox(userProps) {
3129
3133
  }
3130
3134
  event.preventDefault();
3131
3135
  dispatch({
3132
- type: InputKeyDownEnter,
3133
- getItemNodeFromIndex: getItemNodeFromIndex
3136
+ type: InputKeyDownEnter
3134
3137
  });
3135
3138
  },
3136
3139
  PageUp: function PageUp(event) {
3137
3140
  if (latest.current.state.isOpen) {
3138
3141
  event.preventDefault();
3139
3142
  dispatch({
3140
- type: InputKeyDownPageUp,
3141
- getItemNodeFromIndex: getItemNodeFromIndex
3143
+ type: InputKeyDownPageUp
3142
3144
  });
3143
3145
  }
3144
3146
  },
@@ -3146,22 +3148,21 @@ function useCombobox(userProps) {
3146
3148
  if (latest.current.state.isOpen) {
3147
3149
  event.preventDefault();
3148
3150
  dispatch({
3149
- type: InputKeyDownPageDown,
3150
- getItemNodeFromIndex: getItemNodeFromIndex
3151
+ type: InputKeyDownPageDown
3151
3152
  });
3152
3153
  }
3153
3154
  }
3154
3155
  };
3155
- }, [dispatch, latest, getItemNodeFromIndex]);
3156
+ }, [dispatch, latest]);
3156
3157
 
3157
3158
  // Getter props.
3158
- var getLabelProps = react.useCallback(function (labelProps) {
3159
+ var getLabelProps = React.useCallback(function (labelProps) {
3159
3160
  return _extends__default["default"]({
3160
3161
  id: elementIds.labelId,
3161
3162
  htmlFor: elementIds.inputId
3162
3163
  }, labelProps);
3163
3164
  }, [elementIds]);
3164
- var getMenuProps = react.useCallback(function (_temp, _temp2) {
3165
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
3165
3166
  var _extends2;
3166
3167
  var _ref = _temp === void 0 ? {} : _temp,
3167
3168
  onMouseLeave = _ref.onMouseLeave,
@@ -3181,7 +3182,7 @@ function useCombobox(userProps) {
3181
3182
  });
3182
3183
  }), _extends2), rest);
3183
3184
  }, [dispatch, setGetterPropCallInfo, elementIds]);
3184
- var getItemProps = react.useCallback(function (_temp3) {
3185
+ var getItemProps = React.useCallback(function (_temp3) {
3185
3186
  var _extends3, _ref4;
3186
3187
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
3187
3188
  itemProp = _ref3.item,
@@ -3193,13 +3194,18 @@ function useCombobox(userProps) {
3193
3194
  onMouseDown = _ref3.onMouseDown,
3194
3195
  onClick = _ref3.onClick;
3195
3196
  _ref3.onPress;
3196
- var disabled = _ref3.disabled,
3197
+ var disabledProp = _ref3.disabled,
3197
3198
  rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$1);
3199
+ if (disabledProp !== undefined) {
3200
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useCombobox.');
3201
+ }
3198
3202
  var _latest$current = latest.current,
3199
3203
  latestProps = _latest$current.props,
3200
3204
  latestState = _latest$current.state;
3201
3205
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
3206
+ item = _getItemAndIndex[0],
3202
3207
  index = _getItemAndIndex[1];
3208
+ var disabled = latestProps.isItemDisabled(item, index);
3203
3209
  var onSelectKey = 'onClick';
3204
3210
  var customClickHandler = onClick;
3205
3211
  var itemHandleMouseMove = function itemHandleMouseMove() {
@@ -3226,12 +3232,12 @@ function useCombobox(userProps) {
3226
3232
  if (itemNode) {
3227
3233
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
3228
3234
  }
3229
- }), _extends3.disabled = disabled, _extends3.role = 'option', _extends3['aria-selected'] = "" + (index === latestState.highlightedIndex), _extends3.id = elementIds.getItemId(index), _extends3), !disabled && (_ref4 = {}, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), {
3235
+ }), _extends3['aria-disabled'] = disabled, _extends3['aria-selected'] = "" + (index === latestState.highlightedIndex), _extends3.id = elementIds.getItemId(index), _extends3.role = 'option', _extends3), !disabled && (_ref4 = {}, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), {
3230
3236
  onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),
3231
3237
  onMouseDown: callAllEventHandlers(onMouseDown, itemHandleMouseDown)
3232
3238
  }, rest);
3233
3239
  }, [dispatch, latest, shouldScrollRef, elementIds]);
3234
- var getToggleButtonProps = react.useCallback(function (_temp4) {
3240
+ var getToggleButtonProps = React.useCallback(function (_temp4) {
3235
3241
  var _extends4;
3236
3242
  var _ref5 = _temp4 === void 0 ? {} : _temp4,
3237
3243
  onClick = _ref5.onClick;
@@ -3252,16 +3258,16 @@ function useCombobox(userProps) {
3252
3258
  onClick: callAllEventHandlers(onClick, toggleButtonHandleClick)
3253
3259
  }), rest);
3254
3260
  }, [dispatch, latest, elementIds]);
3255
- var getInputProps = react.useCallback(function (_temp5, _temp6) {
3261
+ var getInputProps = React.useCallback(function (_temp5, _temp6) {
3256
3262
  var _extends5;
3257
3263
  var _ref6 = _temp5 === void 0 ? {} : _temp5,
3258
3264
  onKeyDown = _ref6.onKeyDown,
3259
3265
  onChange = _ref6.onChange,
3260
3266
  onInput = _ref6.onInput,
3261
- onFocus = _ref6.onFocus,
3262
3267
  onBlur = _ref6.onBlur;
3263
3268
  _ref6.onChangeText;
3264
- var _ref6$refKey = _ref6.refKey,
3269
+ var onClick = _ref6.onClick,
3270
+ _ref6$refKey = _ref6.refKey,
3265
3271
  refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,
3266
3272
  ref = _ref6.ref,
3267
3273
  rest = _objectWithoutPropertiesLoose__default["default"](_ref6, _excluded4);
@@ -3291,12 +3297,10 @@ function useCombobox(userProps) {
3291
3297
  });
3292
3298
  }
3293
3299
  };
3294
- var inputHandleFocus = function inputHandleFocus() {
3295
- if (!latestState.isOpen) {
3296
- dispatch({
3297
- type: InputFocus
3298
- });
3299
- }
3300
+ var inputHandleClick = function inputHandleClick() {
3301
+ dispatch({
3302
+ type: InputClick
3303
+ });
3300
3304
  };
3301
3305
 
3302
3306
  /* istanbul ignore next (preact) */
@@ -3304,48 +3308,48 @@ function useCombobox(userProps) {
3304
3308
  var eventHandlers = {};
3305
3309
  if (!rest.disabled) {
3306
3310
  var _eventHandlers;
3307
- eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onFocus = callAllEventHandlers(onFocus, inputHandleFocus), _eventHandlers);
3311
+ eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onClick = callAllEventHandlers(onClick, inputHandleClick), _eventHandlers);
3308
3312
  }
3309
3313
  return _extends__default["default"]((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {
3310
3314
  inputRef.current = inputNode;
3311
- }), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] = rest && rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends5.autoComplete = 'off', _extends5.id = elementIds.inputId, _extends5.role = 'combobox', _extends5.value = latestState.inputValue, _extends5), eventHandlers, rest);
3315
+ }), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] = rest && rest['aria-label'] ? undefined : elementIds.labelId, _extends5.autoComplete = 'off', _extends5.id = elementIds.inputId, _extends5.role = 'combobox', _extends5.value = latestState.inputValue, _extends5), eventHandlers, rest);
3312
3316
  }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo, elementIds]);
3313
3317
 
3314
3318
  // returns
3315
- var toggleMenu = react.useCallback(function () {
3319
+ var toggleMenu = React.useCallback(function () {
3316
3320
  dispatch({
3317
3321
  type: FunctionToggleMenu
3318
3322
  });
3319
3323
  }, [dispatch]);
3320
- var closeMenu = react.useCallback(function () {
3324
+ var closeMenu = React.useCallback(function () {
3321
3325
  dispatch({
3322
3326
  type: FunctionCloseMenu
3323
3327
  });
3324
3328
  }, [dispatch]);
3325
- var openMenu = react.useCallback(function () {
3329
+ var openMenu = React.useCallback(function () {
3326
3330
  dispatch({
3327
3331
  type: FunctionOpenMenu
3328
3332
  });
3329
3333
  }, [dispatch]);
3330
- var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) {
3334
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
3331
3335
  dispatch({
3332
3336
  type: FunctionSetHighlightedIndex,
3333
3337
  highlightedIndex: newHighlightedIndex
3334
3338
  });
3335
3339
  }, [dispatch]);
3336
- var selectItem = react.useCallback(function (newSelectedItem) {
3340
+ var selectItem = React.useCallback(function (newSelectedItem) {
3337
3341
  dispatch({
3338
3342
  type: FunctionSelectItem,
3339
3343
  selectedItem: newSelectedItem
3340
3344
  });
3341
3345
  }, [dispatch]);
3342
- var setInputValue = react.useCallback(function (newInputValue) {
3346
+ var setInputValue = React.useCallback(function (newInputValue) {
3343
3347
  dispatch({
3344
3348
  type: FunctionSetInputValue,
3345
3349
  inputValue: newInputValue
3346
3350
  });
3347
3351
  }, [dispatch]);
3348
- var reset = react.useCallback(function () {
3352
+ var reset = React.useCallback(function () {
3349
3353
  dispatch({
3350
3354
  type: FunctionReset$1
3351
3355
  });
@@ -3455,30 +3459,19 @@ function getA11yRemovalMessage(selectionParameters) {
3455
3459
  itemToStringLocal = selectionParameters.itemToString;
3456
3460
  return itemToStringLocal(removedSelectedItem) + " has been removed.";
3457
3461
  }
3458
- var propTypes = {
3462
+ var propTypes = _extends__default["default"]({}, commonPropTypes, {
3459
3463
  selectedItems: PropTypes__default["default"].array,
3460
3464
  initialSelectedItems: PropTypes__default["default"].array,
3461
3465
  defaultSelectedItems: PropTypes__default["default"].array,
3462
- itemToString: PropTypes__default["default"].func,
3463
3466
  getA11yRemovalMessage: PropTypes__default["default"].func,
3464
- stateReducer: PropTypes__default["default"].func,
3465
3467
  activeIndex: PropTypes__default["default"].number,
3466
3468
  initialActiveIndex: PropTypes__default["default"].number,
3467
3469
  defaultActiveIndex: PropTypes__default["default"].number,
3468
3470
  onActiveIndexChange: PropTypes__default["default"].func,
3469
3471
  onSelectedItemsChange: PropTypes__default["default"].func,
3470
3472
  keyNavigationNext: PropTypes__default["default"].string,
3471
- keyNavigationPrevious: PropTypes__default["default"].string,
3472
- environment: PropTypes__default["default"].shape({
3473
- addEventListener: PropTypes__default["default"].func,
3474
- removeEventListener: PropTypes__default["default"].func,
3475
- document: PropTypes__default["default"].shape({
3476
- getElementById: PropTypes__default["default"].func,
3477
- activeElement: PropTypes__default["default"].any,
3478
- body: PropTypes__default["default"].any
3479
- })
3480
- })
3481
- };
3473
+ keyNavigationPrevious: PropTypes__default["default"].string
3474
+ });
3482
3475
  var defaultProps = {
3483
3476
  itemToString: defaultProps$3.itemToString,
3484
3477
  stateReducer: defaultProps$3.stateReducer,
@@ -3662,10 +3655,10 @@ function useMultipleSelection(userProps) {
3662
3655
  selectedItems = state.selectedItems;
3663
3656
 
3664
3657
  // Refs.
3665
- var isInitialMountRef = react.useRef(true);
3666
- var dropdownRef = react.useRef(null);
3667
- var previousSelectedItemsRef = react.useRef(selectedItems);
3668
- var selectedItemRefs = react.useRef();
3658
+ var isInitialMountRef = React.useRef(true);
3659
+ var dropdownRef = React.useRef(null);
3660
+ var previousSelectedItemsRef = React.useRef(selectedItems);
3661
+ var selectedItemRefs = React.useRef();
3669
3662
  selectedItemRefs.current = [];
3670
3663
  var latest = useLatestRef({
3671
3664
  state: state,
@@ -3674,7 +3667,7 @@ function useMultipleSelection(userProps) {
3674
3667
 
3675
3668
  // Effects.
3676
3669
  /* Sets a11y status message on changes in selectedItem. */
3677
- react.useEffect(function () {
3670
+ React.useEffect(function () {
3678
3671
  if (isInitialMountRef.current || false) {
3679
3672
  return;
3680
3673
  }
@@ -3695,7 +3688,7 @@ function useMultipleSelection(userProps) {
3695
3688
  // eslint-disable-next-line react-hooks/exhaustive-deps
3696
3689
  }, [selectedItems.length]);
3697
3690
  // Sets focus on active item.
3698
- react.useEffect(function () {
3691
+ React.useEffect(function () {
3699
3692
  if (isInitialMountRef.current) {
3700
3693
  return;
3701
3694
  }
@@ -3712,7 +3705,7 @@ function useMultipleSelection(userProps) {
3712
3705
  });
3713
3706
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps');
3714
3707
  // Make initial ref false.
3715
- react.useEffect(function () {
3708
+ React.useEffect(function () {
3716
3709
  isInitialMountRef.current = false;
3717
3710
  return function () {
3718
3711
  isInitialMountRef.current = true;
@@ -3720,7 +3713,7 @@ function useMultipleSelection(userProps) {
3720
3713
  }, []);
3721
3714
 
3722
3715
  // Event handler functions.
3723
- var selectedItemKeyDownHandlers = react.useMemo(function () {
3716
+ var selectedItemKeyDownHandlers = React.useMemo(function () {
3724
3717
  var _ref;
3725
3718
  return _ref = {}, _ref[keyNavigationPrevious] = function () {
3726
3719
  dispatch({
@@ -3740,7 +3733,7 @@ function useMultipleSelection(userProps) {
3740
3733
  });
3741
3734
  }, _ref;
3742
3735
  }, [dispatch, keyNavigationNext, keyNavigationPrevious]);
3743
- var dropdownKeyDownHandlers = react.useMemo(function () {
3736
+ var dropdownKeyDownHandlers = React.useMemo(function () {
3744
3737
  var _ref2;
3745
3738
  return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) {
3746
3739
  if (isKeyDownOperationPermitted(event)) {
@@ -3758,7 +3751,7 @@ function useMultipleSelection(userProps) {
3758
3751
  }, [dispatch, keyNavigationPrevious]);
3759
3752
 
3760
3753
  // Getter props.
3761
- var getSelectedItemProps = react.useCallback(function (_temp) {
3754
+ var getSelectedItemProps = React.useCallback(function (_temp) {
3762
3755
  var _extends2;
3763
3756
  var _ref3 = _temp === void 0 ? {} : _temp,
3764
3757
  _ref3$refKey = _ref3.refKey,
@@ -3791,7 +3784,7 @@ function useMultipleSelection(userProps) {
3791
3784
  }
3792
3785
  }), _extends2.tabIndex = isFocusable ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, selectedItemHandleClick), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown), _extends2), rest);
3793
3786
  }, [dispatch, latest, selectedItemKeyDownHandlers]);
3794
- var getDropdownProps = react.useCallback(function (_temp2, _temp3) {
3787
+ var getDropdownProps = React.useCallback(function (_temp2, _temp3) {
3795
3788
  var _extends3;
3796
3789
  var _ref4 = _temp2 === void 0 ? {} : _temp2,
3797
3790
  _ref4$refKey = _ref4.refKey,
@@ -3828,31 +3821,31 @@ function useMultipleSelection(userProps) {
3828
3821
  }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]);
3829
3822
 
3830
3823
  // returns
3831
- var addSelectedItem = react.useCallback(function (selectedItem) {
3824
+ var addSelectedItem = React.useCallback(function (selectedItem) {
3832
3825
  dispatch({
3833
3826
  type: FunctionAddSelectedItem,
3834
3827
  selectedItem: selectedItem
3835
3828
  });
3836
3829
  }, [dispatch]);
3837
- var removeSelectedItem = react.useCallback(function (selectedItem) {
3830
+ var removeSelectedItem = React.useCallback(function (selectedItem) {
3838
3831
  dispatch({
3839
3832
  type: FunctionRemoveSelectedItem,
3840
3833
  selectedItem: selectedItem
3841
3834
  });
3842
3835
  }, [dispatch]);
3843
- var setSelectedItems = react.useCallback(function (newSelectedItems) {
3836
+ var setSelectedItems = React.useCallback(function (newSelectedItems) {
3844
3837
  dispatch({
3845
3838
  type: FunctionSetSelectedItems,
3846
3839
  selectedItems: newSelectedItems
3847
3840
  });
3848
3841
  }, [dispatch]);
3849
- var setActiveIndex = react.useCallback(function (newActiveIndex) {
3842
+ var setActiveIndex = React.useCallback(function (newActiveIndex) {
3850
3843
  dispatch({
3851
3844
  type: FunctionSetActiveIndex,
3852
3845
  activeIndex: newActiveIndex
3853
3846
  });
3854
3847
  }, [dispatch]);
3855
- var reset = react.useCallback(function () {
3848
+ var reset = React.useCallback(function () {
3856
3849
  dispatch({
3857
3850
  type: FunctionReset
3858
3851
  });