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
  });
@@ -931,8 +939,8 @@ var Downshift = /*#__PURE__*/function () {
931
939
  }
932
940
  return _extends__default["default"]({
933
941
  'aria-autocomplete': 'list',
934
- 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null,
935
- 'aria-controls': isOpen ? _this.menuId : null,
942
+ 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : undefined,
943
+ 'aria-controls': isOpen ? _this.menuId : undefined,
936
944
  'aria-labelledby': rest && rest['aria-label'] ? undefined : _this.labelId,
937
945
  // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
938
946
  // revert back since autocomplete="nope" is ignored on latest Chrome and Opera
@@ -984,7 +992,7 @@ var Downshift = /*#__PURE__*/function () {
984
992
  _this.getMenuProps.called = true;
985
993
  _this.getMenuProps.refKey = refKey;
986
994
  _this.getMenuProps.suppressRefError = suppressRefError;
987
- 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);
995
+ 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);
988
996
  };
989
997
  //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU
990
998
  /////////////////////////////// ITEM
@@ -1189,14 +1197,13 @@ var Downshift = /*#__PURE__*/function () {
1189
1197
  }
1190
1198
  };
1191
1199
  _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) {
1192
- var _this6 = this;
1193
1200
  var itemCount = this.getItemCount();
1194
1201
  var _this$getState8 = this.getState(),
1195
1202
  highlightedIndex = _this$getState8.highlightedIndex;
1196
1203
  if (itemCount > 0) {
1197
- var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) {
1198
- return _this6.getItemNodeFromIndex(index);
1199
- });
1204
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, amount, {
1205
+ length: itemCount
1206
+ }, this.isItemDisabled, true);
1200
1207
  this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet);
1201
1208
  }
1202
1209
  };
@@ -1261,7 +1268,7 @@ var Downshift = /*#__PURE__*/function () {
1261
1268
  };
1262
1269
  };
1263
1270
  _proto.componentDidMount = function componentDidMount() {
1264
- var _this7 = this;
1271
+ var _this4 = this;
1265
1272
  /* istanbul ignore if (react-native) */
1266
1273
  if (process.env.NODE_ENV !== 'production' && !false && this.getMenuProps.called && !this.getMenuProps.suppressRefError) {
1267
1274
  validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);
@@ -1275,18 +1282,18 @@ var Downshift = /*#__PURE__*/function () {
1275
1282
  // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should
1276
1283
  // trigger hiding the menu.
1277
1284
  var onMouseDown = function onMouseDown() {
1278
- _this7.isMouseDown = true;
1285
+ _this4.isMouseDown = true;
1279
1286
  };
1280
1287
  var onMouseUp = function onMouseUp(event) {
1281
- _this7.isMouseDown = false;
1288
+ _this4.isMouseDown = false;
1282
1289
  // if the target element or the activeElement is within a downshift node
1283
1290
  // then we don't want to reset downshift
1284
- var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment);
1285
- if (!contextWithinDownshift && _this7.getState().isOpen) {
1286
- _this7.reset({
1291
+ var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment);
1292
+ if (!contextWithinDownshift && _this4.getState().isOpen) {
1293
+ _this4.reset({
1287
1294
  type: mouseUp
1288
1295
  }, function () {
1289
- return _this7.props.onOuterClick(_this7.getStateAndHelpers());
1296
+ return _this4.props.onOuterClick(_this4.getStateAndHelpers());
1290
1297
  });
1291
1298
  }
1292
1299
  };
@@ -1297,18 +1304,18 @@ var Downshift = /*#__PURE__*/function () {
1297
1304
  // If the user taps outside of Downshift, the component should be reset,
1298
1305
  // but not if the user is swiping
1299
1306
  var onTouchStart = function onTouchStart() {
1300
- _this7.isTouchMove = false;
1307
+ _this4.isTouchMove = false;
1301
1308
  };
1302
1309
  var onTouchMove = function onTouchMove() {
1303
- _this7.isTouchMove = true;
1310
+ _this4.isTouchMove = true;
1304
1311
  };
1305
1312
  var onTouchEnd = function onTouchEnd(event) {
1306
- var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment, false);
1307
- if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) {
1308
- _this7.reset({
1313
+ var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment, false);
1314
+ if (!_this4.isTouchMove && !contextWithinDownshift && _this4.getState().isOpen) {
1315
+ _this4.reset({
1309
1316
  type: touchEnd
1310
1317
  }, function () {
1311
- return _this7.props.onOuterClick(_this7.getStateAndHelpers());
1318
+ return _this4.props.onOuterClick(_this4.getStateAndHelpers());
1312
1319
  });
1313
1320
  }
1314
1321
  };
@@ -1319,8 +1326,8 @@ var Downshift = /*#__PURE__*/function () {
1319
1326
  environment.addEventListener('touchmove', onTouchMove);
1320
1327
  environment.addEventListener('touchend', onTouchEnd);
1321
1328
  this.cleanup = function () {
1322
- _this7.internalClearTimeouts();
1323
- _this7.updateStatus.cancel();
1329
+ _this4.internalClearTimeouts();
1330
+ _this4.updateStatus.cancel();
1324
1331
  environment.removeEventListener('mousedown', onMouseDown);
1325
1332
  environment.removeEventListener('mouseup', onMouseUp);
1326
1333
  environment.removeEventListener('touchstart', onTouchStart);
@@ -1397,7 +1404,7 @@ var Downshift = /*#__PURE__*/function () {
1397
1404
  } else if (isDOMElement(element)) {
1398
1405
  // they didn't apply the root props, but we can clone
1399
1406
  // this and apply the props ourselves
1400
- return /*#__PURE__*/react.cloneElement(element, this.getRootProps(getElementProps(element)));
1407
+ return /*#__PURE__*/React.cloneElement(element, this.getRootProps(getElementProps(element)));
1401
1408
  }
1402
1409
 
1403
1410
  /* istanbul ignore else */
@@ -1412,7 +1419,7 @@ var Downshift = /*#__PURE__*/function () {
1412
1419
  return undefined;
1413
1420
  };
1414
1421
  return Downshift;
1415
- }(react.Component);
1422
+ }(React.Component);
1416
1423
  Downshift.defaultProps = {
1417
1424
  defaultHighlightedIndex: null,
1418
1425
  defaultIsOpen: false,
@@ -1468,13 +1475,15 @@ process.env.NODE_ENV !== "production" ? Downshift.propTypes = {
1468
1475
  itemCount: PropTypes__default["default"].number,
1469
1476
  id: PropTypes__default["default"].string,
1470
1477
  environment: PropTypes__default["default"].shape({
1471
- addEventListener: PropTypes__default["default"].func,
1472
- removeEventListener: PropTypes__default["default"].func,
1478
+ addEventListener: PropTypes__default["default"].func.isRequired,
1479
+ removeEventListener: PropTypes__default["default"].func.isRequired,
1473
1480
  document: PropTypes__default["default"].shape({
1474
- getElementById: PropTypes__default["default"].func,
1475
- activeElement: PropTypes__default["default"].any,
1476
- body: PropTypes__default["default"].any
1477
- })
1481
+ createElement: PropTypes__default["default"].func.isRequired,
1482
+ getElementById: PropTypes__default["default"].func.isRequired,
1483
+ activeElement: PropTypes__default["default"].any.isRequired,
1484
+ body: PropTypes__default["default"].any.isRequired
1485
+ }).isRequired,
1486
+ Node: PropTypes__default["default"].func.isRequired
1478
1487
  }),
1479
1488
  suppressRefError: PropTypes__default["default"].bool,
1480
1489
  scrollIntoView: PropTypes__default["default"].func,
@@ -1581,16 +1590,23 @@ var updateA11yStatus = debounce(function (getA11yMessage, document) {
1581
1590
  }, 200);
1582
1591
 
1583
1592
  // istanbul ignore next
1584
- var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? react.useLayoutEffect : react.useEffect;
1585
- function useElementIds(_ref) {
1586
- var _ref$id = _ref.id,
1587
- id = _ref$id === void 0 ? "downshift-" + generateId() : _ref$id,
1593
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React.useLayoutEffect : React.useEffect;
1594
+
1595
+ // istanbul ignore next
1596
+ var useElementIds = 'useId' in React__default["default"] // Avoid conditional useId call
1597
+ ? function useElementIds(_ref) {
1598
+ var id = _ref.id,
1588
1599
  labelId = _ref.labelId,
1589
1600
  menuId = _ref.menuId,
1590
1601
  getItemId = _ref.getItemId,
1591
1602
  toggleButtonId = _ref.toggleButtonId,
1592
1603
  inputId = _ref.inputId;
1593
- var elementIdsRef = react.useRef({
1604
+ // Avoid conditional useId call
1605
+ var reactId = "downshift-" + React__default["default"].useId();
1606
+ if (!id) {
1607
+ id = reactId;
1608
+ }
1609
+ var elementIdsRef = React.useRef({
1594
1610
  labelId: labelId || id + "-label",
1595
1611
  menuId: menuId || id + "-menu",
1596
1612
  getItemId: getItemId || function (index) {
@@ -1600,7 +1616,25 @@ function useElementIds(_ref) {
1600
1616
  inputId: inputId || id + "-input"
1601
1617
  });
1602
1618
  return elementIdsRef.current;
1603
- }
1619
+ } : function useElementIds(_ref2) {
1620
+ var _ref2$id = _ref2.id,
1621
+ id = _ref2$id === void 0 ? "downshift-" + generateId() : _ref2$id,
1622
+ labelId = _ref2.labelId,
1623
+ menuId = _ref2.menuId,
1624
+ getItemId = _ref2.getItemId,
1625
+ toggleButtonId = _ref2.toggleButtonId,
1626
+ inputId = _ref2.inputId;
1627
+ var elementIdsRef = React.useRef({
1628
+ labelId: labelId || id + "-label",
1629
+ menuId: menuId || id + "-menu",
1630
+ getItemId: getItemId || function (index) {
1631
+ return id + "-item-" + index;
1632
+ },
1633
+ toggleButtonId: toggleButtonId || id + "-toggle-button",
1634
+ inputId: inputId || id + "-input"
1635
+ });
1636
+ return elementIdsRef.current;
1637
+ };
1604
1638
  function getItemAndIndex(itemProp, indexProp, items, errorMessage) {
1605
1639
  var item, index;
1606
1640
  if (itemProp === undefined) {
@@ -1622,7 +1656,7 @@ function capitalizeString(string) {
1622
1656
  return "" + string.slice(0, 1).toUpperCase() + string.slice(1);
1623
1657
  }
1624
1658
  function useLatestRef(val) {
1625
- var ref = react.useRef(val);
1659
+ var ref = React.useRef(val);
1626
1660
  // technically this is not "concurrent mode safe" because we're manipulating
1627
1661
  // the value during render (so it's not idempotent). However, the places this
1628
1662
  // hook is used is to support memoizing callbacks which will be called
@@ -1643,9 +1677,9 @@ function useLatestRef(val) {
1643
1677
  * @returns {Array} An array with the state and an action dispatcher.
1644
1678
  */
1645
1679
  function useEnhancedReducer(reducer, initialState, props) {
1646
- var prevStateRef = react.useRef();
1647
- var actionRef = react.useRef();
1648
- var enhancedReducer = react.useCallback(function (state, action) {
1680
+ var prevStateRef = React.useRef();
1681
+ var actionRef = React.useRef();
1682
+ var enhancedReducer = React.useCallback(function (state, action) {
1649
1683
  actionRef.current = action;
1650
1684
  state = getState(state, action.props);
1651
1685
  var changes = reducer(state, action);
@@ -1654,17 +1688,17 @@ function useEnhancedReducer(reducer, initialState, props) {
1654
1688
  }));
1655
1689
  return newState;
1656
1690
  }, [reducer]);
1657
- var _useReducer = react.useReducer(enhancedReducer, initialState),
1691
+ var _useReducer = React.useReducer(enhancedReducer, initialState),
1658
1692
  state = _useReducer[0],
1659
1693
  dispatch = _useReducer[1];
1660
1694
  var propsRef = useLatestRef(props);
1661
- var dispatchWithProps = react.useCallback(function (action) {
1695
+ var dispatchWithProps = React.useCallback(function (action) {
1662
1696
  return dispatch(_extends__default["default"]({
1663
1697
  props: propsRef.current
1664
1698
  }, action));
1665
1699
  }, [propsRef]);
1666
1700
  var action = actionRef.current;
1667
- react.useEffect(function () {
1701
+ React.useEffect(function () {
1668
1702
  if (action && prevStateRef.current && prevStateRef.current !== state) {
1669
1703
  callOnChangeProps(action, getState(prevStateRef.current, action.props), state);
1670
1704
  }
@@ -1768,11 +1802,11 @@ function getHighlightedIndexOnOpen(props, state, offset) {
1768
1802
  * @returns {Object} Ref containing whether mouseDown or touchMove event is happening
1769
1803
  */
1770
1804
  function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) {
1771
- var mouseAndTouchTrackersRef = react.useRef({
1805
+ var mouseAndTouchTrackersRef = React.useRef({
1772
1806
  isMouseDown: false,
1773
1807
  isTouchMove: false
1774
1808
  });
1775
- react.useEffect(function () {
1809
+ React.useEffect(function () {
1776
1810
  if ((environment == null ? void 0 : environment.addEventListener) == null) {
1777
1811
  return;
1778
1812
  }
@@ -1836,15 +1870,15 @@ var useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1836
1870
  /* istanbul ignore next */
1837
1871
  if (process.env.NODE_ENV !== 'production') {
1838
1872
  useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1839
- var isInitialMountRef = react.useRef(true);
1873
+ var isInitialMountRef = React.useRef(true);
1840
1874
  for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) {
1841
1875
  propKeys[_key] = arguments[_key];
1842
1876
  }
1843
- var getterPropsCalledRef = react.useRef(propKeys.reduce(function (acc, propKey) {
1877
+ var getterPropsCalledRef = React.useRef(propKeys.reduce(function (acc, propKey) {
1844
1878
  acc[propKey] = {};
1845
1879
  return acc;
1846
1880
  }, {}));
1847
- react.useEffect(function () {
1881
+ React.useEffect(function () {
1848
1882
  Object.keys(getterPropsCalledRef.current).forEach(function (propKey) {
1849
1883
  var propCallInfo = getterPropsCalledRef.current[propKey];
1850
1884
  if (isInitialMountRef.current) {
@@ -1864,7 +1898,7 @@ if (process.env.NODE_ENV !== 'production') {
1864
1898
  });
1865
1899
  isInitialMountRef.current = false;
1866
1900
  });
1867
- var setGetterPropCallInfo = react.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1901
+ var setGetterPropCallInfo = React.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1868
1902
  getterPropsCalledRef.current[propKey] = {
1869
1903
  suppressRefError: suppressRefError,
1870
1904
  refKey: refKey,
@@ -1874,14 +1908,14 @@ if (process.env.NODE_ENV !== 'production') {
1874
1908
  return setGetterPropCallInfo;
1875
1909
  };
1876
1910
  }
1877
- function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1878
- var isInitialMount = _ref2.isInitialMount,
1879
- highlightedIndex = _ref2.highlightedIndex,
1880
- items = _ref2.items,
1881
- environment = _ref2.environment,
1882
- rest = _objectWithoutPropertiesLoose__default["default"](_ref2, _excluded$3);
1911
+ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref3) {
1912
+ var isInitialMount = _ref3.isInitialMount,
1913
+ highlightedIndex = _ref3.highlightedIndex,
1914
+ items = _ref3.items,
1915
+ environment = _ref3.environment,
1916
+ rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded$3);
1883
1917
  // Sets a11y status message on changes in state.
1884
- react.useEffect(function () {
1918
+ React.useEffect(function () {
1885
1919
  if (isInitialMount || false) {
1886
1920
  return;
1887
1921
  }
@@ -1895,15 +1929,15 @@ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1895
1929
  // eslint-disable-next-line react-hooks/exhaustive-deps
1896
1930
  }, dependencyArray);
1897
1931
  }
1898
- function useScrollIntoView(_ref3) {
1899
- var highlightedIndex = _ref3.highlightedIndex,
1900
- isOpen = _ref3.isOpen,
1901
- itemRefs = _ref3.itemRefs,
1902
- getItemNodeFromIndex = _ref3.getItemNodeFromIndex,
1903
- menuElement = _ref3.menuElement,
1904
- scrollIntoViewProp = _ref3.scrollIntoView;
1932
+ function useScrollIntoView(_ref4) {
1933
+ var highlightedIndex = _ref4.highlightedIndex,
1934
+ isOpen = _ref4.isOpen,
1935
+ itemRefs = _ref4.itemRefs,
1936
+ getItemNodeFromIndex = _ref4.getItemNodeFromIndex,
1937
+ menuElement = _ref4.menuElement,
1938
+ scrollIntoViewProp = _ref4.scrollIntoView;
1905
1939
  // used not to scroll on highlight by mouse.
1906
- var shouldScrollRef = react.useRef(true);
1940
+ var shouldScrollRef = React.useRef(true);
1907
1941
  // Scroll on highlighted item if change comes from keyboard.
1908
1942
  useIsomorphicLayoutEffect(function () {
1909
1943
  if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {
@@ -1923,13 +1957,13 @@ function useScrollIntoView(_ref3) {
1923
1957
  var useControlPropsValidator = noop;
1924
1958
  /* istanbul ignore next */
1925
1959
  if (process.env.NODE_ENV !== 'production') {
1926
- useControlPropsValidator = function useControlPropsValidator(_ref4) {
1927
- var isInitialMount = _ref4.isInitialMount,
1928
- props = _ref4.props,
1929
- state = _ref4.state;
1960
+ useControlPropsValidator = function useControlPropsValidator(_ref5) {
1961
+ var isInitialMount = _ref5.isInitialMount,
1962
+ props = _ref5.props,
1963
+ state = _ref5.state;
1930
1964
  // used for checking when props are moving from controlled to uncontrolled.
1931
- var prevPropsRef = react.useRef(props);
1932
- react.useEffect(function () {
1965
+ var prevPropsRef = React.useRef(props);
1966
+ React.useEffect(function () {
1933
1967
  if (isInitialMount) {
1934
1968
  return;
1935
1969
  }
@@ -1965,6 +1999,47 @@ function getChangesOnSelection(props, highlightedIndex, inputValue) {
1965
1999
  }));
1966
2000
  }
1967
2001
 
2002
+ // Shared between all exports.
2003
+ var commonPropTypes = {
2004
+ environment: PropTypes__default["default"].shape({
2005
+ addEventListener: PropTypes__default["default"].func.isRequired,
2006
+ removeEventListener: PropTypes__default["default"].func.isRequired,
2007
+ document: PropTypes__default["default"].shape({
2008
+ createElement: PropTypes__default["default"].func.isRequired,
2009
+ getElementById: PropTypes__default["default"].func.isRequired,
2010
+ activeElement: PropTypes__default["default"].any.isRequired,
2011
+ body: PropTypes__default["default"].any.isRequired
2012
+ }).isRequired,
2013
+ Node: PropTypes__default["default"].func.isRequired
2014
+ }),
2015
+ itemToString: PropTypes__default["default"].func,
2016
+ stateReducer: PropTypes__default["default"].func
2017
+ };
2018
+
2019
+ // Shared between useSelect, useCombobox, Downshift.
2020
+ var commonDropdownPropTypes = _extends__default["default"]({}, commonPropTypes, {
2021
+ getA11yStatusMessage: PropTypes__default["default"].func,
2022
+ highlightedIndex: PropTypes__default["default"].number,
2023
+ defaultHighlightedIndex: PropTypes__default["default"].number,
2024
+ initialHighlightedIndex: PropTypes__default["default"].number,
2025
+ isOpen: PropTypes__default["default"].bool,
2026
+ defaultIsOpen: PropTypes__default["default"].bool,
2027
+ initialIsOpen: PropTypes__default["default"].bool,
2028
+ selectedItem: PropTypes__default["default"].any,
2029
+ initialSelectedItem: PropTypes__default["default"].any,
2030
+ defaultSelectedItem: PropTypes__default["default"].any,
2031
+ id: PropTypes__default["default"].string,
2032
+ labelId: PropTypes__default["default"].string,
2033
+ menuId: PropTypes__default["default"].string,
2034
+ getItemId: PropTypes__default["default"].func,
2035
+ toggleButtonId: PropTypes__default["default"].string,
2036
+ onSelectedItemChange: PropTypes__default["default"].func,
2037
+ onHighlightedIndexChange: PropTypes__default["default"].func,
2038
+ onStateChange: PropTypes__default["default"].func,
2039
+ onIsOpenChange: PropTypes__default["default"].func,
2040
+ scrollIntoView: PropTypes__default["default"].func
2041
+ });
2042
+
1968
2043
  function downshiftCommonReducer(state, action, stateChangeTypes) {
1969
2044
  var type = action.type,
1970
2045
  props = action.props;
@@ -2024,56 +2099,22 @@ function downshiftCommonReducer(state, action, stateChangeTypes) {
2024
2099
  /* eslint-enable complexity */
2025
2100
 
2026
2101
  function getItemIndexByCharacterKey(_a) {
2027
- var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, getItemNodeFromIndex = _a.getItemNodeFromIndex;
2102
+ var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, isItemDisabled = _a.isItemDisabled;
2028
2103
  var lowerCasedKeysSoFar = keysSoFar.toLowerCase();
2029
2104
  for (var index = 0; index < items.length; index++) {
2030
2105
  // if we already have a search query in progress, we also consider the current highlighted item.
2031
2106
  var offsetIndex = (index + highlightedIndex + (keysSoFar.length < 2 ? 1 : 0)) % items.length;
2032
2107
  var item = items[offsetIndex];
2033
2108
  if (item !== undefined &&
2034
- itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar)) {
2035
- var element = getItemNodeFromIndex(offsetIndex);
2036
- if (!(element === null || element === void 0 ? void 0 : element.hasAttribute('disabled'))) {
2037
- return offsetIndex;
2038
- }
2109
+ itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar) &&
2110
+ !isItemDisabled(item, offsetIndex)) {
2111
+ return offsetIndex;
2039
2112
  }
2040
2113
  }
2041
2114
  return highlightedIndex;
2042
2115
  }
2043
- var propTypes$2 = {
2044
- items: PropTypes__default["default"].array.isRequired,
2045
- itemToString: PropTypes__default["default"].func,
2046
- getA11yStatusMessage: PropTypes__default["default"].func,
2047
- getA11ySelectionMessage: PropTypes__default["default"].func,
2048
- highlightedIndex: PropTypes__default["default"].number,
2049
- defaultHighlightedIndex: PropTypes__default["default"].number,
2050
- initialHighlightedIndex: PropTypes__default["default"].number,
2051
- isOpen: PropTypes__default["default"].bool,
2052
- defaultIsOpen: PropTypes__default["default"].bool,
2053
- initialIsOpen: PropTypes__default["default"].bool,
2054
- selectedItem: PropTypes__default["default"].any,
2055
- initialSelectedItem: PropTypes__default["default"].any,
2056
- defaultSelectedItem: PropTypes__default["default"].any,
2057
- id: PropTypes__default["default"].string,
2058
- labelId: PropTypes__default["default"].string,
2059
- menuId: PropTypes__default["default"].string,
2060
- getItemId: PropTypes__default["default"].func,
2061
- toggleButtonId: PropTypes__default["default"].string,
2062
- stateReducer: PropTypes__default["default"].func,
2063
- onSelectedItemChange: PropTypes__default["default"].func,
2064
- onHighlightedIndexChange: PropTypes__default["default"].func,
2065
- onStateChange: PropTypes__default["default"].func,
2066
- onIsOpenChange: PropTypes__default["default"].func,
2067
- environment: PropTypes__default["default"].shape({
2068
- addEventListener: PropTypes__default["default"].func,
2069
- removeEventListener: PropTypes__default["default"].func,
2070
- document: PropTypes__default["default"].shape({
2071
- getElementById: PropTypes__default["default"].func,
2072
- activeElement: PropTypes__default["default"].any,
2073
- body: PropTypes__default["default"].any
2074
- })
2075
- })
2076
- };
2116
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2117
+ var propTypes$2 = tslib.__assign(tslib.__assign({}, commonDropdownPropTypes), { items: PropTypes__default["default"].array.isRequired, isItemDisabled: PropTypes__default["default"].func, getA11ySelectionMessage: PropTypes__default["default"].func });
2077
2118
  /**
2078
2119
  * Default implementation for status message. Only added when menu is open.
2079
2120
  * Will specift if there are results in the list, and if so, how many,
@@ -2095,7 +2136,9 @@ function getA11yStatusMessage(_a) {
2095
2136
  }
2096
2137
  return '';
2097
2138
  }
2098
- var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage });
2139
+ var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage, isItemDisabled: function () {
2140
+ return false;
2141
+ } });
2099
2142
  // eslint-disable-next-line import/no-mutable-exports
2100
2143
  var validatePropTypes$2 = noop;
2101
2144
  /* istanbul ignore next */
@@ -2179,7 +2222,7 @@ function downshiftSelectReducer(state, action) {
2179
2222
  highlightedIndex: prevHighlightedIndex,
2180
2223
  items: props.items,
2181
2224
  itemToString: props.itemToString,
2182
- getItemNodeFromIndex: action.getItemNodeFromIndex
2225
+ isItemDisabled: props.isItemDisabled
2183
2226
  });
2184
2227
  changes = {
2185
2228
  inputValue: inputValue,
@@ -2190,7 +2233,7 @@ function downshiftSelectReducer(state, action) {
2190
2233
  break;
2191
2234
  case ToggleButtonKeyDownArrowDown:
2192
2235
  {
2193
- var _highlightedIndex = state.isOpen ? getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2236
+ var _highlightedIndex = state.isOpen ? getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2194
2237
  changes = {
2195
2238
  highlightedIndex: _highlightedIndex,
2196
2239
  isOpen: true
@@ -2201,7 +2244,7 @@ function downshiftSelectReducer(state, action) {
2201
2244
  if (state.isOpen && altKey) {
2202
2245
  changes = getChangesOnSelection(props, state.highlightedIndex, false);
2203
2246
  } else {
2204
- var _highlightedIndex2 = state.isOpen ? getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : getHighlightedIndexOnOpen(props, state, -1);
2247
+ var _highlightedIndex2 = state.isOpen ? getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled) : getHighlightedIndexOnOpen(props, state, -1);
2205
2248
  changes = {
2206
2249
  highlightedIndex: _highlightedIndex2,
2207
2250
  isOpen: true
@@ -2215,24 +2258,24 @@ function downshiftSelectReducer(state, action) {
2215
2258
  break;
2216
2259
  case ToggleButtonKeyDownHome:
2217
2260
  changes = {
2218
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false),
2261
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled),
2219
2262
  isOpen: true
2220
2263
  };
2221
2264
  break;
2222
2265
  case ToggleButtonKeyDownEnd:
2223
2266
  changes = {
2224
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false),
2267
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled),
2225
2268
  isOpen: true
2226
2269
  };
2227
2270
  break;
2228
2271
  case ToggleButtonKeyDownPageUp:
2229
2272
  changes = {
2230
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2273
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled)
2231
2274
  };
2232
2275
  break;
2233
2276
  case ToggleButtonKeyDownPageDown:
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 ToggleButtonKeyDownEscape:
@@ -2263,7 +2306,7 @@ function downshiftSelectReducer(state, action) {
2263
2306
 
2264
2307
  var _excluded$2 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"],
2265
2308
  _excluded2$2 = ["onBlur", "onClick", "onPress", "onKeyDown", "refKey", "ref"],
2266
- _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "ref", "disabled"];
2309
+ _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "disabled", "ref"];
2267
2310
  useSelect.stateChangeTypes = stateChangeTypes$2;
2268
2311
  function useSelect(userProps) {
2269
2312
  if (userProps === void 0) {
@@ -2289,16 +2332,16 @@ function useSelect(userProps) {
2289
2332
  inputValue = state.inputValue;
2290
2333
 
2291
2334
  // Element efs.
2292
- var toggleButtonRef = react.useRef(null);
2293
- var menuRef = react.useRef(null);
2294
- var itemRefs = react.useRef({});
2335
+ var toggleButtonRef = React.useRef(null);
2336
+ var menuRef = React.useRef(null);
2337
+ var itemRefs = React.useRef({});
2295
2338
  // used to keep the inputValue clearTimeout object between renders.
2296
- var clearTimeoutRef = react.useRef(null);
2339
+ var clearTimeoutRef = React.useRef(null);
2297
2340
  // prevent id re-generation between renders.
2298
2341
  var elementIds = useElementIds(props);
2299
2342
  // used to keep track of how many items we had on previous cycle.
2300
- var previousResultCountRef = react.useRef();
2301
- var isInitialMountRef = react.useRef(true);
2343
+ var previousResultCountRef = React.useRef();
2344
+ var isInitialMountRef = React.useRef(true);
2302
2345
  // utility callback to get item element.
2303
2346
  var latest = useLatestRef({
2304
2347
  state: state,
@@ -2306,7 +2349,7 @@ function useSelect(userProps) {
2306
2349
  });
2307
2350
 
2308
2351
  // Some utils.
2309
- var getItemNodeFromIndex = react.useCallback(function (index) {
2352
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2310
2353
  return itemRefs.current[elementIds.getItemId(index)];
2311
2354
  }, [elementIds]);
2312
2355
 
@@ -2338,7 +2381,7 @@ function useSelect(userProps) {
2338
2381
  });
2339
2382
 
2340
2383
  // Sets cleanup for the keysSoFar callback, debounded after 500ms.
2341
- react.useEffect(function () {
2384
+ React.useEffect(function () {
2342
2385
  // init the clean function here as we need access to dispatch.
2343
2386
  clearTimeoutRef.current = debounce(function (outerDispatch) {
2344
2387
  outerDispatch({
@@ -2354,7 +2397,7 @@ function useSelect(userProps) {
2354
2397
  }, []);
2355
2398
 
2356
2399
  // Invokes the keysSoFar callback set up above.
2357
- react.useEffect(function () {
2400
+ React.useEffect(function () {
2358
2401
  if (!inputValue) {
2359
2402
  return;
2360
2403
  }
@@ -2365,7 +2408,7 @@ function useSelect(userProps) {
2365
2408
  props: props,
2366
2409
  state: state
2367
2410
  });
2368
- react.useEffect(function () {
2411
+ React.useEffect(function () {
2369
2412
  if (isInitialMountRef.current) {
2370
2413
  return;
2371
2414
  }
@@ -2379,27 +2422,26 @@ function useSelect(userProps) {
2379
2422
  });
2380
2423
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps');
2381
2424
  // Make initial ref false.
2382
- react.useEffect(function () {
2425
+ React.useEffect(function () {
2383
2426
  isInitialMountRef.current = false;
2384
2427
  return function () {
2385
2428
  isInitialMountRef.current = true;
2386
2429
  };
2387
2430
  }, []);
2388
2431
  // Reset itemRefs on close.
2389
- react.useEffect(function () {
2432
+ React.useEffect(function () {
2390
2433
  if (!isOpen) {
2391
2434
  itemRefs.current = {};
2392
2435
  }
2393
2436
  }, [isOpen]);
2394
2437
 
2395
2438
  // Event handler functions.
2396
- var toggleButtonKeyDownHandlers = react.useMemo(function () {
2439
+ var toggleButtonKeyDownHandlers = React.useMemo(function () {
2397
2440
  return {
2398
2441
  ArrowDown: function ArrowDown(event) {
2399
2442
  event.preventDefault();
2400
2443
  dispatch({
2401
2444
  type: ToggleButtonKeyDownArrowDown,
2402
- getItemNodeFromIndex: getItemNodeFromIndex,
2403
2445
  altKey: event.altKey
2404
2446
  });
2405
2447
  },
@@ -2407,22 +2449,19 @@ function useSelect(userProps) {
2407
2449
  event.preventDefault();
2408
2450
  dispatch({
2409
2451
  type: ToggleButtonKeyDownArrowUp,
2410
- getItemNodeFromIndex: getItemNodeFromIndex,
2411
2452
  altKey: event.altKey
2412
2453
  });
2413
2454
  },
2414
2455
  Home: function Home(event) {
2415
2456
  event.preventDefault();
2416
2457
  dispatch({
2417
- type: ToggleButtonKeyDownHome,
2418
- getItemNodeFromIndex: getItemNodeFromIndex
2458
+ type: ToggleButtonKeyDownHome
2419
2459
  });
2420
2460
  },
2421
2461
  End: function End(event) {
2422
2462
  event.preventDefault();
2423
2463
  dispatch({
2424
- type: ToggleButtonKeyDownEnd,
2425
- getItemNodeFromIndex: getItemNodeFromIndex
2464
+ type: ToggleButtonKeyDownEnd
2426
2465
  });
2427
2466
  },
2428
2467
  Escape: function Escape() {
@@ -2442,8 +2481,7 @@ function useSelect(userProps) {
2442
2481
  if (latest.current.state.isOpen) {
2443
2482
  event.preventDefault();
2444
2483
  dispatch({
2445
- type: ToggleButtonKeyDownPageUp,
2446
- getItemNodeFromIndex: getItemNodeFromIndex
2484
+ type: ToggleButtonKeyDownPageUp
2447
2485
  });
2448
2486
  }
2449
2487
  },
@@ -2451,8 +2489,7 @@ function useSelect(userProps) {
2451
2489
  if (latest.current.state.isOpen) {
2452
2490
  event.preventDefault();
2453
2491
  dispatch({
2454
- type: ToggleButtonKeyDownPageDown,
2455
- getItemNodeFromIndex: getItemNodeFromIndex
2492
+ type: ToggleButtonKeyDownPageDown
2456
2493
  });
2457
2494
  }
2458
2495
  },
@@ -2468,8 +2505,7 @@ function useSelect(userProps) {
2468
2505
  if (currentState.inputValue) {
2469
2506
  dispatch({
2470
2507
  type: ToggleButtonKeyDownCharacter,
2471
- key: ' ',
2472
- getItemNodeFromIndex: getItemNodeFromIndex
2508
+ key: ' '
2473
2509
  });
2474
2510
  } else {
2475
2511
  dispatch({
@@ -2478,55 +2514,55 @@ function useSelect(userProps) {
2478
2514
  }
2479
2515
  }
2480
2516
  };
2481
- }, [dispatch, getItemNodeFromIndex, latest]);
2517
+ }, [dispatch, latest]);
2482
2518
 
2483
2519
  // Action functions.
2484
- var toggleMenu = react.useCallback(function () {
2520
+ var toggleMenu = React.useCallback(function () {
2485
2521
  dispatch({
2486
2522
  type: FunctionToggleMenu$1
2487
2523
  });
2488
2524
  }, [dispatch]);
2489
- var closeMenu = react.useCallback(function () {
2525
+ var closeMenu = React.useCallback(function () {
2490
2526
  dispatch({
2491
2527
  type: FunctionCloseMenu$1
2492
2528
  });
2493
2529
  }, [dispatch]);
2494
- var openMenu = react.useCallback(function () {
2530
+ var openMenu = React.useCallback(function () {
2495
2531
  dispatch({
2496
2532
  type: FunctionOpenMenu$1
2497
2533
  });
2498
2534
  }, [dispatch]);
2499
- var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) {
2535
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
2500
2536
  dispatch({
2501
2537
  type: FunctionSetHighlightedIndex$1,
2502
2538
  highlightedIndex: newHighlightedIndex
2503
2539
  });
2504
2540
  }, [dispatch]);
2505
- var selectItem = react.useCallback(function (newSelectedItem) {
2541
+ var selectItem = React.useCallback(function (newSelectedItem) {
2506
2542
  dispatch({
2507
2543
  type: FunctionSelectItem$1,
2508
2544
  selectedItem: newSelectedItem
2509
2545
  });
2510
2546
  }, [dispatch]);
2511
- var reset = react.useCallback(function () {
2547
+ var reset = React.useCallback(function () {
2512
2548
  dispatch({
2513
2549
  type: FunctionReset$2
2514
2550
  });
2515
2551
  }, [dispatch]);
2516
- var setInputValue = react.useCallback(function (newInputValue) {
2552
+ var setInputValue = React.useCallback(function (newInputValue) {
2517
2553
  dispatch({
2518
2554
  type: FunctionSetInputValue$1,
2519
2555
  inputValue: newInputValue
2520
2556
  });
2521
2557
  }, [dispatch]);
2522
2558
  // Getter functions.
2523
- var getLabelProps = react.useCallback(function (labelProps) {
2559
+ var getLabelProps = React.useCallback(function (labelProps) {
2524
2560
  return _extends__default["default"]({
2525
2561
  id: elementIds.labelId,
2526
2562
  htmlFor: elementIds.toggleButtonId
2527
2563
  }, labelProps);
2528
2564
  }, [elementIds]);
2529
- var getMenuProps = react.useCallback(function (_temp, _temp2) {
2565
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
2530
2566
  var _extends2;
2531
2567
  var _ref = _temp === void 0 ? {} : _temp,
2532
2568
  onMouseLeave = _ref.onMouseLeave,
@@ -2549,7 +2585,7 @@ function useSelect(userProps) {
2549
2585
  menuRef.current = menuNode;
2550
2586
  }), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = rest && rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, menuHandleMouseLeave), _extends2), rest);
2551
2587
  }, [dispatch, setGetterPropCallInfo, elementIds]);
2552
- var getToggleButtonProps = react.useCallback(function (_temp3, _temp4) {
2588
+ var getToggleButtonProps = React.useCallback(function (_temp3, _temp4) {
2553
2589
  var _extends3;
2554
2590
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
2555
2591
  onBlur = _ref3.onBlur;
@@ -2587,8 +2623,8 @@ function useSelect(userProps) {
2587
2623
  }
2588
2624
  setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef);
2589
2625
  return toggleProps;
2590
- }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers, getItemNodeFromIndex]);
2591
- var getItemProps = react.useCallback(function (_temp5) {
2626
+ }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers]);
2627
+ var getItemProps = React.useCallback(function (_temp5) {
2592
2628
  var _extends4;
2593
2629
  var _ref5 = _temp5 === void 0 ? {} : _temp5,
2594
2630
  itemProp = _ref5.item,
@@ -2598,15 +2634,19 @@ function useSelect(userProps) {
2598
2634
  var onPress = _ref5.onPress,
2599
2635
  _ref5$refKey = _ref5.refKey,
2600
2636
  refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,
2637
+ disabledProp = _ref5.disabled,
2601
2638
  ref = _ref5.ref,
2602
- disabled = _ref5.disabled,
2603
2639
  rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3$1);
2640
+ if (disabledProp !== undefined) {
2641
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useSelect.');
2642
+ }
2604
2643
  var _latest$current = latest.current,
2605
2644
  latestState = _latest$current.state,
2606
2645
  latestProps = _latest$current.props;
2607
2646
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
2608
2647
  item = _getItemAndIndex[0],
2609
2648
  index = _getItemAndIndex[1];
2649
+ var disabled = latestProps.isItemDisabled(item, index);
2610
2650
  var itemHandleMouseMove = function itemHandleMouseMove() {
2611
2651
  if (index === latestState.highlightedIndex) {
2612
2652
  return;
@@ -2624,16 +2664,11 @@ function useSelect(userProps) {
2624
2664
  index: index
2625
2665
  });
2626
2666
  };
2627
- var itemProps = _extends__default["default"]((_extends4 = {
2628
- disabled: disabled,
2629
- role: 'option',
2630
- 'aria-selected': "" + (item === selectedItem),
2631
- id: elementIds.getItemId(index)
2632
- }, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2667
+ var itemProps = _extends__default["default"]((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2633
2668
  if (itemNode) {
2634
2669
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
2635
2670
  }
2636
- }), _extends4), rest);
2671
+ }), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = "" + (item === latestState.selectedItem), _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4), rest);
2637
2672
  if (!disabled) {
2638
2673
  /* istanbul ignore next (react-native) */
2639
2674
  {
@@ -2642,7 +2677,7 @@ function useSelect(userProps) {
2642
2677
  }
2643
2678
  itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove);
2644
2679
  return itemProps;
2645
- }, [latest, selectedItem, elementIds, shouldScrollRef, dispatch]);
2680
+ }, [latest, elementIds, shouldScrollRef, dispatch]);
2646
2681
  return {
2647
2682
  // prop getters.
2648
2683
  getToggleButtonProps: getToggleButtonProps,
@@ -2675,7 +2710,7 @@ var InputKeyDownPageDown = process.env.NODE_ENV !== "production" ? '__input_keyd
2675
2710
  var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 7;
2676
2711
  var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 8;
2677
2712
  var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 9;
2678
- var InputFocus = process.env.NODE_ENV !== "production" ? '__input_focus__' : 10;
2713
+ var InputClick = process.env.NODE_ENV !== "production" ? '__input_click__' : 10;
2679
2714
  var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 11;
2680
2715
  var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 12;
2681
2716
  var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 13;
@@ -2701,7 +2736,7 @@ var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({
2701
2736
  InputKeyDownEnter: InputKeyDownEnter,
2702
2737
  InputChange: InputChange,
2703
2738
  InputBlur: InputBlur,
2704
- InputFocus: InputFocus,
2739
+ InputClick: InputClick,
2705
2740
  MenuMouseLeave: MenuMouseLeave,
2706
2741
  ItemMouseMove: ItemMouseMove,
2707
2742
  ItemClick: ItemClick,
@@ -2727,46 +2762,17 @@ function getInitialState$1(props) {
2727
2762
  inputValue: inputValue
2728
2763
  });
2729
2764
  }
2730
- var propTypes$1 = {
2765
+ var propTypes$1 = _extends__default["default"]({}, commonDropdownPropTypes, {
2731
2766
  items: PropTypes__default["default"].array.isRequired,
2732
- itemToString: PropTypes__default["default"].func,
2767
+ isItemDisabled: PropTypes__default["default"].func,
2733
2768
  selectedItemChanged: PropTypes__default["default"].func,
2734
- getA11yStatusMessage: PropTypes__default["default"].func,
2735
2769
  getA11ySelectionMessage: PropTypes__default["default"].func,
2736
- highlightedIndex: PropTypes__default["default"].number,
2737
- defaultHighlightedIndex: PropTypes__default["default"].number,
2738
- initialHighlightedIndex: PropTypes__default["default"].number,
2739
- isOpen: PropTypes__default["default"].bool,
2740
- defaultIsOpen: PropTypes__default["default"].bool,
2741
- initialIsOpen: PropTypes__default["default"].bool,
2742
- selectedItem: PropTypes__default["default"].any,
2743
- initialSelectedItem: PropTypes__default["default"].any,
2744
- defaultSelectedItem: PropTypes__default["default"].any,
2745
2770
  inputValue: PropTypes__default["default"].string,
2746
2771
  defaultInputValue: PropTypes__default["default"].string,
2747
2772
  initialInputValue: PropTypes__default["default"].string,
2748
- id: PropTypes__default["default"].string,
2749
- labelId: PropTypes__default["default"].string,
2750
- menuId: PropTypes__default["default"].string,
2751
- getItemId: PropTypes__default["default"].func,
2752
2773
  inputId: PropTypes__default["default"].string,
2753
- toggleButtonId: PropTypes__default["default"].string,
2754
- stateReducer: PropTypes__default["default"].func,
2755
- onSelectedItemChange: PropTypes__default["default"].func,
2756
- onHighlightedIndexChange: PropTypes__default["default"].func,
2757
- onStateChange: PropTypes__default["default"].func,
2758
- onIsOpenChange: PropTypes__default["default"].func,
2759
- onInputValueChange: PropTypes__default["default"].func,
2760
- environment: PropTypes__default["default"].shape({
2761
- addEventListener: PropTypes__default["default"].func,
2762
- removeEventListener: PropTypes__default["default"].func,
2763
- document: PropTypes__default["default"].shape({
2764
- getElementById: PropTypes__default["default"].func,
2765
- activeElement: PropTypes__default["default"].any,
2766
- body: PropTypes__default["default"].any
2767
- })
2768
- })
2769
- };
2774
+ onInputValueChange: PropTypes__default["default"].func
2775
+ });
2770
2776
 
2771
2777
  /**
2772
2778
  * The useCombobox version of useControlledReducer, which also
@@ -2781,13 +2787,13 @@ var propTypes$1 = {
2781
2787
  * @returns {Array} An array with the state and an action dispatcher.
2782
2788
  */
2783
2789
  function useControlledReducer(reducer, initialState, props) {
2784
- var previousSelectedItemRef = react.useRef();
2790
+ var previousSelectedItemRef = React.useRef();
2785
2791
  var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props),
2786
2792
  state = _useEnhancedReducer[0],
2787
2793
  dispatch = _useEnhancedReducer[1];
2788
2794
 
2789
2795
  // ToDo: if needed, make same approach as selectedItemChanged from Downshift.
2790
- react.useEffect(function () {
2796
+ React.useEffect(function () {
2791
2797
  if (!isControlledProp(props, 'selectedItem')) {
2792
2798
  return;
2793
2799
  }
@@ -2815,7 +2821,10 @@ var defaultProps$1 = _extends__default["default"]({}, defaultProps$3, {
2815
2821
  selectedItemChanged: function selectedItemChanged(prevItem, item) {
2816
2822
  return prevItem !== item;
2817
2823
  },
2818
- getA11yStatusMessage: getA11yStatusMessage$1
2824
+ getA11yStatusMessage: getA11yStatusMessage$1,
2825
+ isItemDisabled: function isItemDisabled() {
2826
+ return false;
2827
+ }
2819
2828
  });
2820
2829
 
2821
2830
  /* eslint-disable complexity */
@@ -2837,11 +2846,11 @@ function downshiftUseComboboxReducer(state, action) {
2837
2846
  case InputKeyDownArrowDown:
2838
2847
  if (state.isOpen) {
2839
2848
  changes = {
2840
- highlightedIndex: getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2849
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled, true)
2841
2850
  };
2842
2851
  } else {
2843
2852
  changes = {
2844
- highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex),
2853
+ highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1),
2845
2854
  isOpen: props.items.length >= 0
2846
2855
  };
2847
2856
  }
@@ -2852,12 +2861,12 @@ function downshiftUseComboboxReducer(state, action) {
2852
2861
  changes = getChangesOnSelection(props, state.highlightedIndex);
2853
2862
  } else {
2854
2863
  changes = {
2855
- highlightedIndex: getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2864
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled, true)
2856
2865
  };
2857
2866
  }
2858
2867
  } else {
2859
2868
  changes = {
2860
- highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex),
2869
+ highlightedIndex: getHighlightedIndexOnOpen(props, state, -1),
2861
2870
  isOpen: props.items.length >= 0
2862
2871
  };
2863
2872
  }
@@ -2876,22 +2885,22 @@ function downshiftUseComboboxReducer(state, action) {
2876
2885
  break;
2877
2886
  case InputKeyDownPageUp:
2878
2887
  changes = {
2879
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2888
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled, true)
2880
2889
  };
2881
2890
  break;
2882
2891
  case InputKeyDownPageDown:
2883
2892
  changes = {
2884
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2893
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled, true)
2885
2894
  };
2886
2895
  break;
2887
2896
  case InputKeyDownHome:
2888
2897
  changes = {
2889
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false)
2898
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled)
2890
2899
  };
2891
2900
  break;
2892
2901
  case InputKeyDownEnd:
2893
2902
  changes = {
2894
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false)
2903
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled)
2895
2904
  };
2896
2905
  break;
2897
2906
  case InputBlur:
@@ -2910,10 +2919,10 @@ function downshiftUseComboboxReducer(state, action) {
2910
2919
  inputValue: action.inputValue
2911
2920
  };
2912
2921
  break;
2913
- case InputFocus:
2922
+ case InputClick:
2914
2923
  changes = {
2915
- isOpen: true,
2916
- highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)
2924
+ isOpen: !state.isOpen,
2925
+ highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)
2917
2926
  };
2918
2927
  break;
2919
2928
  case FunctionSelectItem:
@@ -2937,7 +2946,7 @@ function downshiftUseComboboxReducer(state, action) {
2937
2946
  var _excluded$1 = ["onMouseLeave", "refKey", "ref"],
2938
2947
  _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onMouseDown", "onClick", "onPress", "disabled"],
2939
2948
  _excluded3 = ["onClick", "onPress", "refKey", "ref"],
2940
- _excluded4 = ["onKeyDown", "onChange", "onInput", "onFocus", "onBlur", "onChangeText", "refKey", "ref"];
2949
+ _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "onClick", "refKey", "ref"];
2941
2950
  useCombobox.stateChangeTypes = stateChangeTypes$1;
2942
2951
  function useCombobox(userProps) {
2943
2952
  if (userProps === void 0) {
@@ -2965,21 +2974,21 @@ function useCombobox(userProps) {
2965
2974
  inputValue = state.inputValue;
2966
2975
 
2967
2976
  // Element refs.
2968
- var menuRef = react.useRef(null);
2969
- var itemRefs = react.useRef({});
2970
- var inputRef = react.useRef(null);
2971
- var toggleButtonRef = react.useRef(null);
2972
- var isInitialMountRef = react.useRef(true);
2977
+ var menuRef = React.useRef(null);
2978
+ var itemRefs = React.useRef({});
2979
+ var inputRef = React.useRef(null);
2980
+ var toggleButtonRef = React.useRef(null);
2981
+ var isInitialMountRef = React.useRef(true);
2973
2982
  // prevent id re-generation between renders.
2974
2983
  var elementIds = useElementIds(props);
2975
2984
  // used to keep track of how many items we had on previous cycle.
2976
- var previousResultCountRef = react.useRef();
2985
+ var previousResultCountRef = React.useRef();
2977
2986
  // utility callback to get item element.
2978
2987
  var latest = useLatestRef({
2979
2988
  state: state,
2980
2989
  props: props
2981
2990
  });
2982
- var getItemNodeFromIndex = react.useCallback(function (index) {
2991
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2983
2992
  return itemRefs.current[elementIds.getItemId(index)];
2984
2993
  }, [elementIds]);
2985
2994
 
@@ -3015,14 +3024,14 @@ function useCombobox(userProps) {
3015
3024
  state: state
3016
3025
  });
3017
3026
  // Focus the input on first render if required.
3018
- react.useEffect(function () {
3027
+ React.useEffect(function () {
3019
3028
  var focusOnOpen = initialIsOpen || defaultIsOpen || isOpen;
3020
3029
  if (focusOnOpen && inputRef.current) {
3021
3030
  inputRef.current.focus();
3022
3031
  }
3023
3032
  // eslint-disable-next-line react-hooks/exhaustive-deps
3024
3033
  }, []);
3025
- react.useEffect(function () {
3034
+ React.useEffect(function () {
3026
3035
  if (isInitialMountRef.current) {
3027
3036
  return;
3028
3037
  }
@@ -3037,14 +3046,14 @@ function useCombobox(userProps) {
3037
3046
  });
3038
3047
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getMenuProps');
3039
3048
  // Make initial ref false.
3040
- react.useEffect(function () {
3049
+ React.useEffect(function () {
3041
3050
  isInitialMountRef.current = false;
3042
3051
  return function () {
3043
3052
  isInitialMountRef.current = true;
3044
3053
  };
3045
3054
  }, []);
3046
3055
  // Reset itemRefs on close.
3047
- react.useEffect(function () {
3056
+ React.useEffect(function () {
3048
3057
  var _environment$document;
3049
3058
  if (!isOpen) {
3050
3059
  itemRefs.current = {};
@@ -3055,22 +3064,20 @@ function useCombobox(userProps) {
3055
3064
  }, [isOpen, environment]);
3056
3065
 
3057
3066
  /* Event handler functions */
3058
- var inputKeyDownHandlers = react.useMemo(function () {
3067
+ var inputKeyDownHandlers = React.useMemo(function () {
3059
3068
  return {
3060
3069
  ArrowDown: function ArrowDown(event) {
3061
3070
  event.preventDefault();
3062
3071
  dispatch({
3063
3072
  type: InputKeyDownArrowDown,
3064
- altKey: event.altKey,
3065
- getItemNodeFromIndex: getItemNodeFromIndex
3073
+ altKey: event.altKey
3066
3074
  });
3067
3075
  },
3068
3076
  ArrowUp: function ArrowUp(event) {
3069
3077
  event.preventDefault();
3070
3078
  dispatch({
3071
3079
  type: InputKeyDownArrowUp,
3072
- altKey: event.altKey,
3073
- getItemNodeFromIndex: getItemNodeFromIndex
3080
+ altKey: event.altKey
3074
3081
  });
3075
3082
  },
3076
3083
  Home: function Home(event) {
@@ -3079,8 +3086,7 @@ function useCombobox(userProps) {
3079
3086
  }
3080
3087
  event.preventDefault();
3081
3088
  dispatch({
3082
- type: InputKeyDownHome,
3083
- getItemNodeFromIndex: getItemNodeFromIndex
3089
+ type: InputKeyDownHome
3084
3090
  });
3085
3091
  },
3086
3092
  End: function End(event) {
@@ -3089,8 +3095,7 @@ function useCombobox(userProps) {
3089
3095
  }
3090
3096
  event.preventDefault();
3091
3097
  dispatch({
3092
- type: InputKeyDownEnd,
3093
- getItemNodeFromIndex: getItemNodeFromIndex
3098
+ type: InputKeyDownEnd
3094
3099
  });
3095
3100
  },
3096
3101
  Escape: function Escape(event) {
@@ -3111,16 +3116,14 @@ function useCombobox(userProps) {
3111
3116
  }
3112
3117
  event.preventDefault();
3113
3118
  dispatch({
3114
- type: InputKeyDownEnter,
3115
- getItemNodeFromIndex: getItemNodeFromIndex
3119
+ type: InputKeyDownEnter
3116
3120
  });
3117
3121
  },
3118
3122
  PageUp: function PageUp(event) {
3119
3123
  if (latest.current.state.isOpen) {
3120
3124
  event.preventDefault();
3121
3125
  dispatch({
3122
- type: InputKeyDownPageUp,
3123
- getItemNodeFromIndex: getItemNodeFromIndex
3126
+ type: InputKeyDownPageUp
3124
3127
  });
3125
3128
  }
3126
3129
  },
@@ -3128,22 +3131,21 @@ function useCombobox(userProps) {
3128
3131
  if (latest.current.state.isOpen) {
3129
3132
  event.preventDefault();
3130
3133
  dispatch({
3131
- type: InputKeyDownPageDown,
3132
- getItemNodeFromIndex: getItemNodeFromIndex
3134
+ type: InputKeyDownPageDown
3133
3135
  });
3134
3136
  }
3135
3137
  }
3136
3138
  };
3137
- }, [dispatch, latest, getItemNodeFromIndex]);
3139
+ }, [dispatch, latest]);
3138
3140
 
3139
3141
  // Getter props.
3140
- var getLabelProps = react.useCallback(function (labelProps) {
3142
+ var getLabelProps = React.useCallback(function (labelProps) {
3141
3143
  return _extends__default["default"]({
3142
3144
  id: elementIds.labelId,
3143
3145
  htmlFor: elementIds.inputId
3144
3146
  }, labelProps);
3145
3147
  }, [elementIds]);
3146
- var getMenuProps = react.useCallback(function (_temp, _temp2) {
3148
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
3147
3149
  var _extends2;
3148
3150
  var _ref = _temp === void 0 ? {} : _temp,
3149
3151
  onMouseLeave = _ref.onMouseLeave,
@@ -3163,7 +3165,7 @@ function useCombobox(userProps) {
3163
3165
  });
3164
3166
  }), _extends2), rest);
3165
3167
  }, [dispatch, setGetterPropCallInfo, elementIds]);
3166
- var getItemProps = react.useCallback(function (_temp3) {
3168
+ var getItemProps = React.useCallback(function (_temp3) {
3167
3169
  var _extends3, _ref4;
3168
3170
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
3169
3171
  itemProp = _ref3.item,
@@ -3175,14 +3177,19 @@ function useCombobox(userProps) {
3175
3177
  onMouseDown = _ref3.onMouseDown,
3176
3178
  onClick = _ref3.onClick;
3177
3179
  _ref3.onPress;
3178
- var disabled = _ref3.disabled,
3180
+ var disabledProp = _ref3.disabled,
3179
3181
  rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$1);
3182
+ if (disabledProp !== undefined) {
3183
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useCombobox.');
3184
+ }
3180
3185
  var _latest$current = latest.current,
3181
3186
  latestProps = _latest$current.props,
3182
3187
  latestState = _latest$current.state;
3183
3188
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
3189
+ item = _getItemAndIndex[0],
3184
3190
  index = _getItemAndIndex[1];
3185
- var onSelectKey = /* istanbul ignore next (react-native) */'onPress' ;
3191
+ var disabled = latestProps.isItemDisabled(item, index);
3192
+ var onSelectKey = 'onClick';
3186
3193
  var customClickHandler = onClick;
3187
3194
  var itemHandleMouseMove = function itemHandleMouseMove() {
3188
3195
  if (index === latestState.highlightedIndex) {
@@ -3208,12 +3215,12 @@ function useCombobox(userProps) {
3208
3215
  if (itemNode) {
3209
3216
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
3210
3217
  }
3211
- }), _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), {
3218
+ }), _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), {
3212
3219
  onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),
3213
3220
  onMouseDown: callAllEventHandlers(onMouseDown, itemHandleMouseDown)
3214
3221
  }, rest);
3215
3222
  }, [dispatch, latest, shouldScrollRef, elementIds]);
3216
- var getToggleButtonProps = react.useCallback(function (_temp4) {
3223
+ var getToggleButtonProps = React.useCallback(function (_temp4) {
3217
3224
  var _extends4;
3218
3225
  var _ref5 = _temp4 === void 0 ? {} : _temp4;
3219
3226
  _ref5.onClick;
@@ -3234,16 +3241,16 @@ function useCombobox(userProps) {
3234
3241
  onPress: callAllEventHandlers(onPress, toggleButtonHandleClick)
3235
3242
  } ), rest);
3236
3243
  }, [dispatch, latest, elementIds]);
3237
- var getInputProps = react.useCallback(function (_temp5, _temp6) {
3244
+ var getInputProps = React.useCallback(function (_temp5, _temp6) {
3238
3245
  var _extends5;
3239
3246
  var _ref6 = _temp5 === void 0 ? {} : _temp5,
3240
3247
  onKeyDown = _ref6.onKeyDown,
3241
3248
  onChange = _ref6.onChange,
3242
3249
  onInput = _ref6.onInput,
3243
- onFocus = _ref6.onFocus,
3244
3250
  onBlur = _ref6.onBlur;
3245
3251
  _ref6.onChangeText;
3246
- var _ref6$refKey = _ref6.refKey,
3252
+ var onClick = _ref6.onClick,
3253
+ _ref6$refKey = _ref6.refKey,
3247
3254
  refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,
3248
3255
  ref = _ref6.ref,
3249
3256
  rest = _objectWithoutPropertiesLoose__default["default"](_ref6, _excluded4);
@@ -3273,12 +3280,10 @@ function useCombobox(userProps) {
3273
3280
  });
3274
3281
  }
3275
3282
  };
3276
- var inputHandleFocus = function inputHandleFocus() {
3277
- if (!latestState.isOpen) {
3278
- dispatch({
3279
- type: InputFocus
3280
- });
3281
- }
3283
+ var inputHandleClick = function inputHandleClick() {
3284
+ dispatch({
3285
+ type: InputClick
3286
+ });
3282
3287
  };
3283
3288
 
3284
3289
  /* istanbul ignore next (preact) */
@@ -3286,48 +3291,48 @@ function useCombobox(userProps) {
3286
3291
  var eventHandlers = {};
3287
3292
  if (!rest.disabled) {
3288
3293
  var _eventHandlers;
3289
- eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onFocus = callAllEventHandlers(onFocus, inputHandleFocus), _eventHandlers);
3294
+ eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onClick = callAllEventHandlers(onClick, inputHandleClick), _eventHandlers);
3290
3295
  }
3291
3296
  return _extends__default["default"]((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {
3292
3297
  inputRef.current = inputNode;
3293
- }), _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);
3298
+ }), _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);
3294
3299
  }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo, elementIds]);
3295
3300
 
3296
3301
  // returns
3297
- var toggleMenu = react.useCallback(function () {
3302
+ var toggleMenu = React.useCallback(function () {
3298
3303
  dispatch({
3299
3304
  type: FunctionToggleMenu
3300
3305
  });
3301
3306
  }, [dispatch]);
3302
- var closeMenu = react.useCallback(function () {
3307
+ var closeMenu = React.useCallback(function () {
3303
3308
  dispatch({
3304
3309
  type: FunctionCloseMenu
3305
3310
  });
3306
3311
  }, [dispatch]);
3307
- var openMenu = react.useCallback(function () {
3312
+ var openMenu = React.useCallback(function () {
3308
3313
  dispatch({
3309
3314
  type: FunctionOpenMenu
3310
3315
  });
3311
3316
  }, [dispatch]);
3312
- var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) {
3317
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
3313
3318
  dispatch({
3314
3319
  type: FunctionSetHighlightedIndex,
3315
3320
  highlightedIndex: newHighlightedIndex
3316
3321
  });
3317
3322
  }, [dispatch]);
3318
- var selectItem = react.useCallback(function (newSelectedItem) {
3323
+ var selectItem = React.useCallback(function (newSelectedItem) {
3319
3324
  dispatch({
3320
3325
  type: FunctionSelectItem,
3321
3326
  selectedItem: newSelectedItem
3322
3327
  });
3323
3328
  }, [dispatch]);
3324
- var setInputValue = react.useCallback(function (newInputValue) {
3329
+ var setInputValue = React.useCallback(function (newInputValue) {
3325
3330
  dispatch({
3326
3331
  type: FunctionSetInputValue,
3327
3332
  inputValue: newInputValue
3328
3333
  });
3329
3334
  }, [dispatch]);
3330
- var reset = react.useCallback(function () {
3335
+ var reset = React.useCallback(function () {
3331
3336
  dispatch({
3332
3337
  type: FunctionReset$1
3333
3338
  });
@@ -3437,30 +3442,19 @@ function getA11yRemovalMessage(selectionParameters) {
3437
3442
  itemToStringLocal = selectionParameters.itemToString;
3438
3443
  return itemToStringLocal(removedSelectedItem) + " has been removed.";
3439
3444
  }
3440
- var propTypes = {
3445
+ var propTypes = _extends__default["default"]({}, commonPropTypes, {
3441
3446
  selectedItems: PropTypes__default["default"].array,
3442
3447
  initialSelectedItems: PropTypes__default["default"].array,
3443
3448
  defaultSelectedItems: PropTypes__default["default"].array,
3444
- itemToString: PropTypes__default["default"].func,
3445
3449
  getA11yRemovalMessage: PropTypes__default["default"].func,
3446
- stateReducer: PropTypes__default["default"].func,
3447
3450
  activeIndex: PropTypes__default["default"].number,
3448
3451
  initialActiveIndex: PropTypes__default["default"].number,
3449
3452
  defaultActiveIndex: PropTypes__default["default"].number,
3450
3453
  onActiveIndexChange: PropTypes__default["default"].func,
3451
3454
  onSelectedItemsChange: PropTypes__default["default"].func,
3452
3455
  keyNavigationNext: PropTypes__default["default"].string,
3453
- keyNavigationPrevious: PropTypes__default["default"].string,
3454
- environment: PropTypes__default["default"].shape({
3455
- addEventListener: PropTypes__default["default"].func,
3456
- removeEventListener: PropTypes__default["default"].func,
3457
- document: PropTypes__default["default"].shape({
3458
- getElementById: PropTypes__default["default"].func,
3459
- activeElement: PropTypes__default["default"].any,
3460
- body: PropTypes__default["default"].any
3461
- })
3462
- })
3463
- };
3456
+ keyNavigationPrevious: PropTypes__default["default"].string
3457
+ });
3464
3458
  var defaultProps = {
3465
3459
  itemToString: defaultProps$3.itemToString,
3466
3460
  stateReducer: defaultProps$3.stateReducer,
@@ -3644,10 +3638,10 @@ function useMultipleSelection(userProps) {
3644
3638
  selectedItems = state.selectedItems;
3645
3639
 
3646
3640
  // Refs.
3647
- var isInitialMountRef = react.useRef(true);
3648
- var dropdownRef = react.useRef(null);
3649
- var previousSelectedItemsRef = react.useRef(selectedItems);
3650
- var selectedItemRefs = react.useRef();
3641
+ var isInitialMountRef = React.useRef(true);
3642
+ var dropdownRef = React.useRef(null);
3643
+ var previousSelectedItemsRef = React.useRef(selectedItems);
3644
+ var selectedItemRefs = React.useRef();
3651
3645
  selectedItemRefs.current = [];
3652
3646
  var latest = useLatestRef({
3653
3647
  state: state,
@@ -3656,7 +3650,7 @@ function useMultipleSelection(userProps) {
3656
3650
 
3657
3651
  // Effects.
3658
3652
  /* Sets a11y status message on changes in selectedItem. */
3659
- react.useEffect(function () {
3653
+ React.useEffect(function () {
3660
3654
  if (isInitialMountRef.current || false) {
3661
3655
  return;
3662
3656
  }
@@ -3677,7 +3671,7 @@ function useMultipleSelection(userProps) {
3677
3671
  // eslint-disable-next-line react-hooks/exhaustive-deps
3678
3672
  }, [selectedItems.length]);
3679
3673
  // Sets focus on active item.
3680
- react.useEffect(function () {
3674
+ React.useEffect(function () {
3681
3675
  if (isInitialMountRef.current) {
3682
3676
  return;
3683
3677
  }
@@ -3694,7 +3688,7 @@ function useMultipleSelection(userProps) {
3694
3688
  });
3695
3689
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps');
3696
3690
  // Make initial ref false.
3697
- react.useEffect(function () {
3691
+ React.useEffect(function () {
3698
3692
  isInitialMountRef.current = false;
3699
3693
  return function () {
3700
3694
  isInitialMountRef.current = true;
@@ -3702,7 +3696,7 @@ function useMultipleSelection(userProps) {
3702
3696
  }, []);
3703
3697
 
3704
3698
  // Event handler functions.
3705
- var selectedItemKeyDownHandlers = react.useMemo(function () {
3699
+ var selectedItemKeyDownHandlers = React.useMemo(function () {
3706
3700
  var _ref;
3707
3701
  return _ref = {}, _ref[keyNavigationPrevious] = function () {
3708
3702
  dispatch({
@@ -3722,7 +3716,7 @@ function useMultipleSelection(userProps) {
3722
3716
  });
3723
3717
  }, _ref;
3724
3718
  }, [dispatch, keyNavigationNext, keyNavigationPrevious]);
3725
- var dropdownKeyDownHandlers = react.useMemo(function () {
3719
+ var dropdownKeyDownHandlers = React.useMemo(function () {
3726
3720
  var _ref2;
3727
3721
  return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) {
3728
3722
  if (isKeyDownOperationPermitted(event)) {
@@ -3740,7 +3734,7 @@ function useMultipleSelection(userProps) {
3740
3734
  }, [dispatch, keyNavigationPrevious]);
3741
3735
 
3742
3736
  // Getter props.
3743
- var getSelectedItemProps = react.useCallback(function (_temp) {
3737
+ var getSelectedItemProps = React.useCallback(function (_temp) {
3744
3738
  var _extends2;
3745
3739
  var _ref3 = _temp === void 0 ? {} : _temp,
3746
3740
  _ref3$refKey = _ref3.refKey,
@@ -3773,7 +3767,7 @@ function useMultipleSelection(userProps) {
3773
3767
  }
3774
3768
  }), _extends2.tabIndex = isFocusable ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, selectedItemHandleClick), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown), _extends2), rest);
3775
3769
  }, [dispatch, latest, selectedItemKeyDownHandlers]);
3776
- var getDropdownProps = react.useCallback(function (_temp2, _temp3) {
3770
+ var getDropdownProps = React.useCallback(function (_temp2, _temp3) {
3777
3771
  var _extends3;
3778
3772
  var _ref4 = _temp2 === void 0 ? {} : _temp2,
3779
3773
  _ref4$refKey = _ref4.refKey,
@@ -3810,31 +3804,31 @@ function useMultipleSelection(userProps) {
3810
3804
  }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]);
3811
3805
 
3812
3806
  // returns
3813
- var addSelectedItem = react.useCallback(function (selectedItem) {
3807
+ var addSelectedItem = React.useCallback(function (selectedItem) {
3814
3808
  dispatch({
3815
3809
  type: FunctionAddSelectedItem,
3816
3810
  selectedItem: selectedItem
3817
3811
  });
3818
3812
  }, [dispatch]);
3819
- var removeSelectedItem = react.useCallback(function (selectedItem) {
3813
+ var removeSelectedItem = React.useCallback(function (selectedItem) {
3820
3814
  dispatch({
3821
3815
  type: FunctionRemoveSelectedItem,
3822
3816
  selectedItem: selectedItem
3823
3817
  });
3824
3818
  }, [dispatch]);
3825
- var setSelectedItems = react.useCallback(function (newSelectedItems) {
3819
+ var setSelectedItems = React.useCallback(function (newSelectedItems) {
3826
3820
  dispatch({
3827
3821
  type: FunctionSetSelectedItems,
3828
3822
  selectedItems: newSelectedItems
3829
3823
  });
3830
3824
  }, [dispatch]);
3831
- var setActiveIndex = react.useCallback(function (newActiveIndex) {
3825
+ var setActiveIndex = React.useCallback(function (newActiveIndex) {
3832
3826
  dispatch({
3833
3827
  type: FunctionSetActiveIndex,
3834
3828
  activeIndex: newActiveIndex
3835
3829
  });
3836
3830
  }, [dispatch]);
3837
- var reset = react.useCallback(function () {
3831
+ var reset = React.useCallback(function () {
3838
3832
  dispatch({
3839
3833
  type: FunctionReset
3840
3834
  });