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
  });
@@ -940,8 +948,8 @@ var Downshift = /*#__PURE__*/function () {
940
948
  }
941
949
  return _extends__default["default"]({
942
950
  'aria-autocomplete': 'list',
943
- 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null,
944
- 'aria-controls': isOpen ? _this.menuId : null,
951
+ 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : undefined,
952
+ 'aria-controls': isOpen ? _this.menuId : undefined,
945
953
  'aria-labelledby': rest && rest['aria-label'] ? undefined : _this.labelId,
946
954
  // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
947
955
  // revert back since autocomplete="nope" is ignored on latest Chrome and Opera
@@ -993,7 +1001,7 @@ var Downshift = /*#__PURE__*/function () {
993
1001
  _this.getMenuProps.called = true;
994
1002
  _this.getMenuProps.refKey = refKey;
995
1003
  _this.getMenuProps.suppressRefError = suppressRefError;
996
- 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);
1004
+ 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);
997
1005
  };
998
1006
  //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU
999
1007
  /////////////////////////////// ITEM
@@ -1193,14 +1201,13 @@ var Downshift = /*#__PURE__*/function () {
1193
1201
  _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() {
1194
1202
  };
1195
1203
  _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) {
1196
- var _this6 = this;
1197
1204
  var itemCount = this.getItemCount();
1198
1205
  var _this$getState8 = this.getState(),
1199
1206
  highlightedIndex = _this$getState8.highlightedIndex;
1200
1207
  if (itemCount > 0) {
1201
- var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) {
1202
- return _this6.getItemNodeFromIndex(index);
1203
- });
1208
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, amount, {
1209
+ length: itemCount
1210
+ }, this.isItemDisabled, true);
1204
1211
  this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet);
1205
1212
  }
1206
1213
  };
@@ -1265,7 +1272,7 @@ var Downshift = /*#__PURE__*/function () {
1265
1272
  };
1266
1273
  };
1267
1274
  _proto.componentDidMount = function componentDidMount() {
1268
- var _this7 = this;
1275
+ var _this4 = this;
1269
1276
  /* istanbul ignore if (react-native) */
1270
1277
  if (process.env.NODE_ENV !== 'production' && !true && this.getMenuProps.called && !this.getMenuProps.suppressRefError) {
1271
1278
  validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);
@@ -1274,7 +1281,7 @@ var Downshift = /*#__PURE__*/function () {
1274
1281
  /* istanbul ignore if (react-native) */
1275
1282
  {
1276
1283
  this.cleanup = function () {
1277
- _this7.internalClearTimeouts();
1284
+ _this4.internalClearTimeouts();
1278
1285
  };
1279
1286
  }
1280
1287
  };
@@ -1337,7 +1344,7 @@ var Downshift = /*#__PURE__*/function () {
1337
1344
  } else if (isDOMElement(element)) {
1338
1345
  // they didn't apply the root props, but we can clone
1339
1346
  // this and apply the props ourselves
1340
- return /*#__PURE__*/react.cloneElement(element, this.getRootProps(getElementProps(element)));
1347
+ return /*#__PURE__*/React.cloneElement(element, this.getRootProps(getElementProps(element)));
1341
1348
  }
1342
1349
 
1343
1350
  /* istanbul ignore else */
@@ -1352,7 +1359,7 @@ var Downshift = /*#__PURE__*/function () {
1352
1359
  return undefined;
1353
1360
  };
1354
1361
  return Downshift;
1355
- }(react.Component);
1362
+ }(React.Component);
1356
1363
  Downshift.defaultProps = {
1357
1364
  defaultHighlightedIndex: null,
1358
1365
  defaultIsOpen: false,
@@ -1408,13 +1415,15 @@ process.env.NODE_ENV !== "production" ? Downshift.propTypes = {
1408
1415
  itemCount: PropTypes__default["default"].number,
1409
1416
  id: PropTypes__default["default"].string,
1410
1417
  environment: PropTypes__default["default"].shape({
1411
- addEventListener: PropTypes__default["default"].func,
1412
- removeEventListener: PropTypes__default["default"].func,
1418
+ addEventListener: PropTypes__default["default"].func.isRequired,
1419
+ removeEventListener: PropTypes__default["default"].func.isRequired,
1413
1420
  document: PropTypes__default["default"].shape({
1414
- getElementById: PropTypes__default["default"].func,
1415
- activeElement: PropTypes__default["default"].any,
1416
- body: PropTypes__default["default"].any
1417
- })
1421
+ createElement: PropTypes__default["default"].func.isRequired,
1422
+ getElementById: PropTypes__default["default"].func.isRequired,
1423
+ activeElement: PropTypes__default["default"].any.isRequired,
1424
+ body: PropTypes__default["default"].any.isRequired
1425
+ }).isRequired,
1426
+ Node: PropTypes__default["default"].func.isRequired
1418
1427
  }),
1419
1428
  suppressRefError: PropTypes__default["default"].bool,
1420
1429
  scrollIntoView: PropTypes__default["default"].func,
@@ -1521,16 +1530,23 @@ var updateA11yStatus = debounce(function (getA11yMessage, document) {
1521
1530
  }, 200);
1522
1531
 
1523
1532
  // istanbul ignore next
1524
- var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? react.useLayoutEffect : react.useEffect;
1525
- function useElementIds(_ref) {
1526
- var _ref$id = _ref.id,
1527
- id = _ref$id === void 0 ? "downshift-" + generateId() : _ref$id,
1533
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React.useLayoutEffect : React.useEffect;
1534
+
1535
+ // istanbul ignore next
1536
+ var useElementIds = 'useId' in React__default["default"] // Avoid conditional useId call
1537
+ ? function useElementIds(_ref) {
1538
+ var id = _ref.id,
1528
1539
  labelId = _ref.labelId,
1529
1540
  menuId = _ref.menuId,
1530
1541
  getItemId = _ref.getItemId,
1531
1542
  toggleButtonId = _ref.toggleButtonId,
1532
1543
  inputId = _ref.inputId;
1533
- var elementIdsRef = react.useRef({
1544
+ // Avoid conditional useId call
1545
+ var reactId = "downshift-" + React__default["default"].useId();
1546
+ if (!id) {
1547
+ id = reactId;
1548
+ }
1549
+ var elementIdsRef = React.useRef({
1534
1550
  labelId: labelId || id + "-label",
1535
1551
  menuId: menuId || id + "-menu",
1536
1552
  getItemId: getItemId || function (index) {
@@ -1540,7 +1556,25 @@ function useElementIds(_ref) {
1540
1556
  inputId: inputId || id + "-input"
1541
1557
  });
1542
1558
  return elementIdsRef.current;
1543
- }
1559
+ } : function useElementIds(_ref2) {
1560
+ var _ref2$id = _ref2.id,
1561
+ id = _ref2$id === void 0 ? "downshift-" + generateId() : _ref2$id,
1562
+ labelId = _ref2.labelId,
1563
+ menuId = _ref2.menuId,
1564
+ getItemId = _ref2.getItemId,
1565
+ toggleButtonId = _ref2.toggleButtonId,
1566
+ inputId = _ref2.inputId;
1567
+ var elementIdsRef = React.useRef({
1568
+ labelId: labelId || id + "-label",
1569
+ menuId: menuId || id + "-menu",
1570
+ getItemId: getItemId || function (index) {
1571
+ return id + "-item-" + index;
1572
+ },
1573
+ toggleButtonId: toggleButtonId || id + "-toggle-button",
1574
+ inputId: inputId || id + "-input"
1575
+ });
1576
+ return elementIdsRef.current;
1577
+ };
1544
1578
  function getItemAndIndex(itemProp, indexProp, items, errorMessage) {
1545
1579
  var item, index;
1546
1580
  if (itemProp === undefined) {
@@ -1562,7 +1596,7 @@ function capitalizeString(string) {
1562
1596
  return "" + string.slice(0, 1).toUpperCase() + string.slice(1);
1563
1597
  }
1564
1598
  function useLatestRef(val) {
1565
- var ref = react.useRef(val);
1599
+ var ref = React.useRef(val);
1566
1600
  // technically this is not "concurrent mode safe" because we're manipulating
1567
1601
  // the value during render (so it's not idempotent). However, the places this
1568
1602
  // hook is used is to support memoizing callbacks which will be called
@@ -1583,9 +1617,9 @@ function useLatestRef(val) {
1583
1617
  * @returns {Array} An array with the state and an action dispatcher.
1584
1618
  */
1585
1619
  function useEnhancedReducer(reducer, initialState, props) {
1586
- var prevStateRef = react.useRef();
1587
- var actionRef = react.useRef();
1588
- var enhancedReducer = react.useCallback(function (state, action) {
1620
+ var prevStateRef = React.useRef();
1621
+ var actionRef = React.useRef();
1622
+ var enhancedReducer = React.useCallback(function (state, action) {
1589
1623
  actionRef.current = action;
1590
1624
  state = getState(state, action.props);
1591
1625
  var changes = reducer(state, action);
@@ -1594,17 +1628,17 @@ function useEnhancedReducer(reducer, initialState, props) {
1594
1628
  }));
1595
1629
  return newState;
1596
1630
  }, [reducer]);
1597
- var _useReducer = react.useReducer(enhancedReducer, initialState),
1631
+ var _useReducer = React.useReducer(enhancedReducer, initialState),
1598
1632
  state = _useReducer[0],
1599
1633
  dispatch = _useReducer[1];
1600
1634
  var propsRef = useLatestRef(props);
1601
- var dispatchWithProps = react.useCallback(function (action) {
1635
+ var dispatchWithProps = React.useCallback(function (action) {
1602
1636
  return dispatch(_extends__default["default"]({
1603
1637
  props: propsRef.current
1604
1638
  }, action));
1605
1639
  }, [propsRef]);
1606
1640
  var action = actionRef.current;
1607
- react.useEffect(function () {
1641
+ React.useEffect(function () {
1608
1642
  if (action && prevStateRef.current && prevStateRef.current !== state) {
1609
1643
  callOnChangeProps(action, getState(prevStateRef.current, action.props), state);
1610
1644
  }
@@ -1708,11 +1742,11 @@ function getHighlightedIndexOnOpen(props, state, offset) {
1708
1742
  * @returns {Object} Ref containing whether mouseDown or touchMove event is happening
1709
1743
  */
1710
1744
  function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) {
1711
- var mouseAndTouchTrackersRef = react.useRef({
1745
+ var mouseAndTouchTrackersRef = React.useRef({
1712
1746
  isMouseDown: false,
1713
1747
  isTouchMove: false
1714
1748
  });
1715
- react.useEffect(function () {
1749
+ React.useEffect(function () {
1716
1750
  if ((environment == null ? void 0 : environment.addEventListener) == null) {
1717
1751
  return;
1718
1752
  }
@@ -1776,15 +1810,15 @@ var useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1776
1810
  /* istanbul ignore next */
1777
1811
  if (process.env.NODE_ENV !== 'production') {
1778
1812
  useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1779
- var isInitialMountRef = react.useRef(true);
1813
+ var isInitialMountRef = React.useRef(true);
1780
1814
  for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) {
1781
1815
  propKeys[_key] = arguments[_key];
1782
1816
  }
1783
- var getterPropsCalledRef = react.useRef(propKeys.reduce(function (acc, propKey) {
1817
+ var getterPropsCalledRef = React.useRef(propKeys.reduce(function (acc, propKey) {
1784
1818
  acc[propKey] = {};
1785
1819
  return acc;
1786
1820
  }, {}));
1787
- react.useEffect(function () {
1821
+ React.useEffect(function () {
1788
1822
  Object.keys(getterPropsCalledRef.current).forEach(function (propKey) {
1789
1823
  var propCallInfo = getterPropsCalledRef.current[propKey];
1790
1824
  if (isInitialMountRef.current) {
@@ -1804,7 +1838,7 @@ if (process.env.NODE_ENV !== 'production') {
1804
1838
  });
1805
1839
  isInitialMountRef.current = false;
1806
1840
  });
1807
- var setGetterPropCallInfo = react.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1841
+ var setGetterPropCallInfo = React.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1808
1842
  getterPropsCalledRef.current[propKey] = {
1809
1843
  suppressRefError: suppressRefError,
1810
1844
  refKey: refKey,
@@ -1814,14 +1848,14 @@ if (process.env.NODE_ENV !== 'production') {
1814
1848
  return setGetterPropCallInfo;
1815
1849
  };
1816
1850
  }
1817
- function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1818
- var isInitialMount = _ref2.isInitialMount,
1819
- highlightedIndex = _ref2.highlightedIndex,
1820
- items = _ref2.items,
1821
- environment = _ref2.environment,
1822
- rest = _objectWithoutPropertiesLoose__default["default"](_ref2, _excluded$3);
1851
+ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref3) {
1852
+ var isInitialMount = _ref3.isInitialMount,
1853
+ highlightedIndex = _ref3.highlightedIndex,
1854
+ items = _ref3.items,
1855
+ environment = _ref3.environment,
1856
+ rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded$3);
1823
1857
  // Sets a11y status message on changes in state.
1824
- react.useEffect(function () {
1858
+ React.useEffect(function () {
1825
1859
  if (isInitialMount || true) {
1826
1860
  return;
1827
1861
  }
@@ -1835,15 +1869,15 @@ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1835
1869
  // eslint-disable-next-line react-hooks/exhaustive-deps
1836
1870
  }, dependencyArray);
1837
1871
  }
1838
- function useScrollIntoView(_ref3) {
1839
- var highlightedIndex = _ref3.highlightedIndex,
1840
- isOpen = _ref3.isOpen,
1841
- itemRefs = _ref3.itemRefs,
1842
- getItemNodeFromIndex = _ref3.getItemNodeFromIndex,
1843
- menuElement = _ref3.menuElement,
1844
- scrollIntoViewProp = _ref3.scrollIntoView;
1872
+ function useScrollIntoView(_ref4) {
1873
+ var highlightedIndex = _ref4.highlightedIndex,
1874
+ isOpen = _ref4.isOpen,
1875
+ itemRefs = _ref4.itemRefs,
1876
+ getItemNodeFromIndex = _ref4.getItemNodeFromIndex,
1877
+ menuElement = _ref4.menuElement,
1878
+ scrollIntoViewProp = _ref4.scrollIntoView;
1845
1879
  // used not to scroll on highlight by mouse.
1846
- var shouldScrollRef = react.useRef(true);
1880
+ var shouldScrollRef = React.useRef(true);
1847
1881
  // Scroll on highlighted item if change comes from keyboard.
1848
1882
  useIsomorphicLayoutEffect(function () {
1849
1883
  if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {
@@ -1863,13 +1897,13 @@ function useScrollIntoView(_ref3) {
1863
1897
  var useControlPropsValidator = noop;
1864
1898
  /* istanbul ignore next */
1865
1899
  if (process.env.NODE_ENV !== 'production') {
1866
- useControlPropsValidator = function useControlPropsValidator(_ref4) {
1867
- var isInitialMount = _ref4.isInitialMount,
1868
- props = _ref4.props,
1869
- state = _ref4.state;
1900
+ useControlPropsValidator = function useControlPropsValidator(_ref5) {
1901
+ var isInitialMount = _ref5.isInitialMount,
1902
+ props = _ref5.props,
1903
+ state = _ref5.state;
1870
1904
  // used for checking when props are moving from controlled to uncontrolled.
1871
- var prevPropsRef = react.useRef(props);
1872
- react.useEffect(function () {
1905
+ var prevPropsRef = React.useRef(props);
1906
+ React.useEffect(function () {
1873
1907
  if (isInitialMount) {
1874
1908
  return;
1875
1909
  }
@@ -1905,6 +1939,47 @@ function getChangesOnSelection(props, highlightedIndex, inputValue) {
1905
1939
  }));
1906
1940
  }
1907
1941
 
1942
+ // Shared between all exports.
1943
+ var commonPropTypes = {
1944
+ environment: PropTypes__default["default"].shape({
1945
+ addEventListener: PropTypes__default["default"].func.isRequired,
1946
+ removeEventListener: PropTypes__default["default"].func.isRequired,
1947
+ document: PropTypes__default["default"].shape({
1948
+ createElement: PropTypes__default["default"].func.isRequired,
1949
+ getElementById: PropTypes__default["default"].func.isRequired,
1950
+ activeElement: PropTypes__default["default"].any.isRequired,
1951
+ body: PropTypes__default["default"].any.isRequired
1952
+ }).isRequired,
1953
+ Node: PropTypes__default["default"].func.isRequired
1954
+ }),
1955
+ itemToString: PropTypes__default["default"].func,
1956
+ stateReducer: PropTypes__default["default"].func
1957
+ };
1958
+
1959
+ // Shared between useSelect, useCombobox, Downshift.
1960
+ var commonDropdownPropTypes = _extends__default["default"]({}, commonPropTypes, {
1961
+ getA11yStatusMessage: PropTypes__default["default"].func,
1962
+ highlightedIndex: PropTypes__default["default"].number,
1963
+ defaultHighlightedIndex: PropTypes__default["default"].number,
1964
+ initialHighlightedIndex: PropTypes__default["default"].number,
1965
+ isOpen: PropTypes__default["default"].bool,
1966
+ defaultIsOpen: PropTypes__default["default"].bool,
1967
+ initialIsOpen: PropTypes__default["default"].bool,
1968
+ selectedItem: PropTypes__default["default"].any,
1969
+ initialSelectedItem: PropTypes__default["default"].any,
1970
+ defaultSelectedItem: PropTypes__default["default"].any,
1971
+ id: PropTypes__default["default"].string,
1972
+ labelId: PropTypes__default["default"].string,
1973
+ menuId: PropTypes__default["default"].string,
1974
+ getItemId: PropTypes__default["default"].func,
1975
+ toggleButtonId: PropTypes__default["default"].string,
1976
+ onSelectedItemChange: PropTypes__default["default"].func,
1977
+ onHighlightedIndexChange: PropTypes__default["default"].func,
1978
+ onStateChange: PropTypes__default["default"].func,
1979
+ onIsOpenChange: PropTypes__default["default"].func,
1980
+ scrollIntoView: PropTypes__default["default"].func
1981
+ });
1982
+
1908
1983
  function downshiftCommonReducer(state, action, stateChangeTypes) {
1909
1984
  var type = action.type,
1910
1985
  props = action.props;
@@ -1964,56 +2039,22 @@ function downshiftCommonReducer(state, action, stateChangeTypes) {
1964
2039
  /* eslint-enable complexity */
1965
2040
 
1966
2041
  function getItemIndexByCharacterKey(_a) {
1967
- var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, getItemNodeFromIndex = _a.getItemNodeFromIndex;
2042
+ var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, isItemDisabled = _a.isItemDisabled;
1968
2043
  var lowerCasedKeysSoFar = keysSoFar.toLowerCase();
1969
2044
  for (var index = 0; index < items.length; index++) {
1970
2045
  // if we already have a search query in progress, we also consider the current highlighted item.
1971
2046
  var offsetIndex = (index + highlightedIndex + (keysSoFar.length < 2 ? 1 : 0)) % items.length;
1972
2047
  var item = items[offsetIndex];
1973
2048
  if (item !== undefined &&
1974
- itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar)) {
1975
- var element = getItemNodeFromIndex(offsetIndex);
1976
- if (!(element === null || element === void 0 ? void 0 : element.hasAttribute('disabled'))) {
1977
- return offsetIndex;
1978
- }
2049
+ itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar) &&
2050
+ !isItemDisabled(item, offsetIndex)) {
2051
+ return offsetIndex;
1979
2052
  }
1980
2053
  }
1981
2054
  return highlightedIndex;
1982
2055
  }
1983
- var propTypes$2 = {
1984
- items: PropTypes__default["default"].array.isRequired,
1985
- itemToString: PropTypes__default["default"].func,
1986
- getA11yStatusMessage: PropTypes__default["default"].func,
1987
- getA11ySelectionMessage: PropTypes__default["default"].func,
1988
- highlightedIndex: PropTypes__default["default"].number,
1989
- defaultHighlightedIndex: PropTypes__default["default"].number,
1990
- initialHighlightedIndex: PropTypes__default["default"].number,
1991
- isOpen: PropTypes__default["default"].bool,
1992
- defaultIsOpen: PropTypes__default["default"].bool,
1993
- initialIsOpen: PropTypes__default["default"].bool,
1994
- selectedItem: PropTypes__default["default"].any,
1995
- initialSelectedItem: PropTypes__default["default"].any,
1996
- defaultSelectedItem: PropTypes__default["default"].any,
1997
- id: PropTypes__default["default"].string,
1998
- labelId: PropTypes__default["default"].string,
1999
- menuId: PropTypes__default["default"].string,
2000
- getItemId: PropTypes__default["default"].func,
2001
- toggleButtonId: PropTypes__default["default"].string,
2002
- stateReducer: PropTypes__default["default"].func,
2003
- onSelectedItemChange: PropTypes__default["default"].func,
2004
- onHighlightedIndexChange: PropTypes__default["default"].func,
2005
- onStateChange: PropTypes__default["default"].func,
2006
- onIsOpenChange: PropTypes__default["default"].func,
2007
- environment: PropTypes__default["default"].shape({
2008
- addEventListener: PropTypes__default["default"].func,
2009
- removeEventListener: PropTypes__default["default"].func,
2010
- document: PropTypes__default["default"].shape({
2011
- getElementById: PropTypes__default["default"].func,
2012
- activeElement: PropTypes__default["default"].any,
2013
- body: PropTypes__default["default"].any
2014
- })
2015
- })
2016
- };
2056
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2057
+ var propTypes$2 = tslib.__assign(tslib.__assign({}, commonDropdownPropTypes), { items: PropTypes__default["default"].array.isRequired, isItemDisabled: PropTypes__default["default"].func, getA11ySelectionMessage: PropTypes__default["default"].func });
2017
2058
  /**
2018
2059
  * Default implementation for status message. Only added when menu is open.
2019
2060
  * Will specift if there are results in the list, and if so, how many,
@@ -2035,7 +2076,9 @@ function getA11yStatusMessage(_a) {
2035
2076
  }
2036
2077
  return '';
2037
2078
  }
2038
- var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage });
2079
+ var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage, isItemDisabled: function () {
2080
+ return false;
2081
+ } });
2039
2082
  // eslint-disable-next-line import/no-mutable-exports
2040
2083
  var validatePropTypes$2 = noop;
2041
2084
  /* istanbul ignore next */
@@ -2119,7 +2162,7 @@ function downshiftSelectReducer(state, action) {
2119
2162
  highlightedIndex: prevHighlightedIndex,
2120
2163
  items: props.items,
2121
2164
  itemToString: props.itemToString,
2122
- getItemNodeFromIndex: action.getItemNodeFromIndex
2165
+ isItemDisabled: props.isItemDisabled
2123
2166
  });
2124
2167
  changes = {
2125
2168
  inputValue: inputValue,
@@ -2130,7 +2173,7 @@ function downshiftSelectReducer(state, action) {
2130
2173
  break;
2131
2174
  case ToggleButtonKeyDownArrowDown:
2132
2175
  {
2133
- var _highlightedIndex = state.isOpen ? getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2176
+ var _highlightedIndex = state.isOpen ? getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2134
2177
  changes = {
2135
2178
  highlightedIndex: _highlightedIndex,
2136
2179
  isOpen: true
@@ -2141,7 +2184,7 @@ function downshiftSelectReducer(state, action) {
2141
2184
  if (state.isOpen && altKey) {
2142
2185
  changes = getChangesOnSelection(props, state.highlightedIndex, false);
2143
2186
  } else {
2144
- var _highlightedIndex2 = state.isOpen ? getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : getHighlightedIndexOnOpen(props, state, -1);
2187
+ var _highlightedIndex2 = state.isOpen ? getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled) : getHighlightedIndexOnOpen(props, state, -1);
2145
2188
  changes = {
2146
2189
  highlightedIndex: _highlightedIndex2,
2147
2190
  isOpen: true
@@ -2155,24 +2198,24 @@ function downshiftSelectReducer(state, action) {
2155
2198
  break;
2156
2199
  case ToggleButtonKeyDownHome:
2157
2200
  changes = {
2158
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false),
2201
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled),
2159
2202
  isOpen: true
2160
2203
  };
2161
2204
  break;
2162
2205
  case ToggleButtonKeyDownEnd:
2163
2206
  changes = {
2164
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false),
2207
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled),
2165
2208
  isOpen: true
2166
2209
  };
2167
2210
  break;
2168
2211
  case ToggleButtonKeyDownPageUp:
2169
2212
  changes = {
2170
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2213
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled)
2171
2214
  };
2172
2215
  break;
2173
2216
  case ToggleButtonKeyDownPageDown:
2174
2217
  changes = {
2175
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2218
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled)
2176
2219
  };
2177
2220
  break;
2178
2221
  case ToggleButtonKeyDownEscape:
@@ -2203,7 +2246,7 @@ function downshiftSelectReducer(state, action) {
2203
2246
 
2204
2247
  var _excluded$2 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"],
2205
2248
  _excluded2$2 = ["onBlur", "onClick", "onPress", "onKeyDown", "refKey", "ref"],
2206
- _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "ref", "disabled"];
2249
+ _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "disabled", "ref"];
2207
2250
  useSelect.stateChangeTypes = stateChangeTypes$2;
2208
2251
  function useSelect(userProps) {
2209
2252
  if (userProps === void 0) {
@@ -2229,16 +2272,16 @@ function useSelect(userProps) {
2229
2272
  inputValue = state.inputValue;
2230
2273
 
2231
2274
  // Element efs.
2232
- var toggleButtonRef = react.useRef(null);
2233
- var menuRef = react.useRef(null);
2234
- var itemRefs = react.useRef({});
2275
+ var toggleButtonRef = React.useRef(null);
2276
+ var menuRef = React.useRef(null);
2277
+ var itemRefs = React.useRef({});
2235
2278
  // used to keep the inputValue clearTimeout object between renders.
2236
- var clearTimeoutRef = react.useRef(null);
2279
+ var clearTimeoutRef = React.useRef(null);
2237
2280
  // prevent id re-generation between renders.
2238
2281
  var elementIds = useElementIds(props);
2239
2282
  // used to keep track of how many items we had on previous cycle.
2240
- var previousResultCountRef = react.useRef();
2241
- var isInitialMountRef = react.useRef(true);
2283
+ var previousResultCountRef = React.useRef();
2284
+ var isInitialMountRef = React.useRef(true);
2242
2285
  // utility callback to get item element.
2243
2286
  var latest = useLatestRef({
2244
2287
  state: state,
@@ -2246,7 +2289,7 @@ function useSelect(userProps) {
2246
2289
  });
2247
2290
 
2248
2291
  // Some utils.
2249
- var getItemNodeFromIndex = react.useCallback(function (index) {
2292
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2250
2293
  return itemRefs.current[elementIds.getItemId(index)];
2251
2294
  }, [elementIds]);
2252
2295
 
@@ -2278,7 +2321,7 @@ function useSelect(userProps) {
2278
2321
  });
2279
2322
 
2280
2323
  // Sets cleanup for the keysSoFar callback, debounded after 500ms.
2281
- react.useEffect(function () {
2324
+ React.useEffect(function () {
2282
2325
  // init the clean function here as we need access to dispatch.
2283
2326
  clearTimeoutRef.current = debounce(function (outerDispatch) {
2284
2327
  outerDispatch({
@@ -2294,7 +2337,7 @@ function useSelect(userProps) {
2294
2337
  }, []);
2295
2338
 
2296
2339
  // Invokes the keysSoFar callback set up above.
2297
- react.useEffect(function () {
2340
+ React.useEffect(function () {
2298
2341
  if (!inputValue) {
2299
2342
  return;
2300
2343
  }
@@ -2305,7 +2348,7 @@ function useSelect(userProps) {
2305
2348
  props: props,
2306
2349
  state: state
2307
2350
  });
2308
- react.useEffect(function () {
2351
+ React.useEffect(function () {
2309
2352
  if (isInitialMountRef.current) {
2310
2353
  return;
2311
2354
  }
@@ -2319,27 +2362,26 @@ function useSelect(userProps) {
2319
2362
  });
2320
2363
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps');
2321
2364
  // Make initial ref false.
2322
- react.useEffect(function () {
2365
+ React.useEffect(function () {
2323
2366
  isInitialMountRef.current = false;
2324
2367
  return function () {
2325
2368
  isInitialMountRef.current = true;
2326
2369
  };
2327
2370
  }, []);
2328
2371
  // Reset itemRefs on close.
2329
- react.useEffect(function () {
2372
+ React.useEffect(function () {
2330
2373
  if (!isOpen) {
2331
2374
  itemRefs.current = {};
2332
2375
  }
2333
2376
  }, [isOpen]);
2334
2377
 
2335
2378
  // Event handler functions.
2336
- var toggleButtonKeyDownHandlers = react.useMemo(function () {
2379
+ var toggleButtonKeyDownHandlers = React.useMemo(function () {
2337
2380
  return {
2338
2381
  ArrowDown: function ArrowDown(event) {
2339
2382
  event.preventDefault();
2340
2383
  dispatch({
2341
2384
  type: ToggleButtonKeyDownArrowDown,
2342
- getItemNodeFromIndex: getItemNodeFromIndex,
2343
2385
  altKey: event.altKey
2344
2386
  });
2345
2387
  },
@@ -2347,22 +2389,19 @@ function useSelect(userProps) {
2347
2389
  event.preventDefault();
2348
2390
  dispatch({
2349
2391
  type: ToggleButtonKeyDownArrowUp,
2350
- getItemNodeFromIndex: getItemNodeFromIndex,
2351
2392
  altKey: event.altKey
2352
2393
  });
2353
2394
  },
2354
2395
  Home: function Home(event) {
2355
2396
  event.preventDefault();
2356
2397
  dispatch({
2357
- type: ToggleButtonKeyDownHome,
2358
- getItemNodeFromIndex: getItemNodeFromIndex
2398
+ type: ToggleButtonKeyDownHome
2359
2399
  });
2360
2400
  },
2361
2401
  End: function End(event) {
2362
2402
  event.preventDefault();
2363
2403
  dispatch({
2364
- type: ToggleButtonKeyDownEnd,
2365
- getItemNodeFromIndex: getItemNodeFromIndex
2404
+ type: ToggleButtonKeyDownEnd
2366
2405
  });
2367
2406
  },
2368
2407
  Escape: function Escape() {
@@ -2382,8 +2421,7 @@ function useSelect(userProps) {
2382
2421
  if (latest.current.state.isOpen) {
2383
2422
  event.preventDefault();
2384
2423
  dispatch({
2385
- type: ToggleButtonKeyDownPageUp,
2386
- getItemNodeFromIndex: getItemNodeFromIndex
2424
+ type: ToggleButtonKeyDownPageUp
2387
2425
  });
2388
2426
  }
2389
2427
  },
@@ -2391,8 +2429,7 @@ function useSelect(userProps) {
2391
2429
  if (latest.current.state.isOpen) {
2392
2430
  event.preventDefault();
2393
2431
  dispatch({
2394
- type: ToggleButtonKeyDownPageDown,
2395
- getItemNodeFromIndex: getItemNodeFromIndex
2432
+ type: ToggleButtonKeyDownPageDown
2396
2433
  });
2397
2434
  }
2398
2435
  },
@@ -2408,8 +2445,7 @@ function useSelect(userProps) {
2408
2445
  if (currentState.inputValue) {
2409
2446
  dispatch({
2410
2447
  type: ToggleButtonKeyDownCharacter,
2411
- key: ' ',
2412
- getItemNodeFromIndex: getItemNodeFromIndex
2448
+ key: ' '
2413
2449
  });
2414
2450
  } else {
2415
2451
  dispatch({
@@ -2418,55 +2454,55 @@ function useSelect(userProps) {
2418
2454
  }
2419
2455
  }
2420
2456
  };
2421
- }, [dispatch, getItemNodeFromIndex, latest]);
2457
+ }, [dispatch, latest]);
2422
2458
 
2423
2459
  // Action functions.
2424
- var toggleMenu = react.useCallback(function () {
2460
+ var toggleMenu = React.useCallback(function () {
2425
2461
  dispatch({
2426
2462
  type: FunctionToggleMenu$1
2427
2463
  });
2428
2464
  }, [dispatch]);
2429
- var closeMenu = react.useCallback(function () {
2465
+ var closeMenu = React.useCallback(function () {
2430
2466
  dispatch({
2431
2467
  type: FunctionCloseMenu$1
2432
2468
  });
2433
2469
  }, [dispatch]);
2434
- var openMenu = react.useCallback(function () {
2470
+ var openMenu = React.useCallback(function () {
2435
2471
  dispatch({
2436
2472
  type: FunctionOpenMenu$1
2437
2473
  });
2438
2474
  }, [dispatch]);
2439
- var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) {
2475
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
2440
2476
  dispatch({
2441
2477
  type: FunctionSetHighlightedIndex$1,
2442
2478
  highlightedIndex: newHighlightedIndex
2443
2479
  });
2444
2480
  }, [dispatch]);
2445
- var selectItem = react.useCallback(function (newSelectedItem) {
2481
+ var selectItem = React.useCallback(function (newSelectedItem) {
2446
2482
  dispatch({
2447
2483
  type: FunctionSelectItem$1,
2448
2484
  selectedItem: newSelectedItem
2449
2485
  });
2450
2486
  }, [dispatch]);
2451
- var reset = react.useCallback(function () {
2487
+ var reset = React.useCallback(function () {
2452
2488
  dispatch({
2453
2489
  type: FunctionReset$2
2454
2490
  });
2455
2491
  }, [dispatch]);
2456
- var setInputValue = react.useCallback(function (newInputValue) {
2492
+ var setInputValue = React.useCallback(function (newInputValue) {
2457
2493
  dispatch({
2458
2494
  type: FunctionSetInputValue$1,
2459
2495
  inputValue: newInputValue
2460
2496
  });
2461
2497
  }, [dispatch]);
2462
2498
  // Getter functions.
2463
- var getLabelProps = react.useCallback(function (labelProps) {
2499
+ var getLabelProps = React.useCallback(function (labelProps) {
2464
2500
  return _extends__default["default"]({
2465
2501
  id: elementIds.labelId,
2466
2502
  htmlFor: elementIds.toggleButtonId
2467
2503
  }, labelProps);
2468
2504
  }, [elementIds]);
2469
- var getMenuProps = react.useCallback(function (_temp, _temp2) {
2505
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
2470
2506
  var _extends2;
2471
2507
  var _ref = _temp === void 0 ? {} : _temp,
2472
2508
  onMouseLeave = _ref.onMouseLeave,
@@ -2489,7 +2525,7 @@ function useSelect(userProps) {
2489
2525
  menuRef.current = menuNode;
2490
2526
  }), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = rest && rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, menuHandleMouseLeave), _extends2), rest);
2491
2527
  }, [dispatch, setGetterPropCallInfo, elementIds]);
2492
- var getToggleButtonProps = react.useCallback(function (_temp3, _temp4) {
2528
+ var getToggleButtonProps = React.useCallback(function (_temp3, _temp4) {
2493
2529
  var _extends3;
2494
2530
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
2495
2531
  onBlur = _ref3.onBlur;
@@ -2527,8 +2563,8 @@ function useSelect(userProps) {
2527
2563
  }
2528
2564
  setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef);
2529
2565
  return toggleProps;
2530
- }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers, getItemNodeFromIndex]);
2531
- var getItemProps = react.useCallback(function (_temp5) {
2566
+ }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers]);
2567
+ var getItemProps = React.useCallback(function (_temp5) {
2532
2568
  var _extends4;
2533
2569
  var _ref5 = _temp5 === void 0 ? {} : _temp5,
2534
2570
  itemProp = _ref5.item,
@@ -2538,15 +2574,19 @@ function useSelect(userProps) {
2538
2574
  var onPress = _ref5.onPress,
2539
2575
  _ref5$refKey = _ref5.refKey,
2540
2576
  refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,
2577
+ disabledProp = _ref5.disabled,
2541
2578
  ref = _ref5.ref,
2542
- disabled = _ref5.disabled,
2543
2579
  rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3$1);
2580
+ if (disabledProp !== undefined) {
2581
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useSelect.');
2582
+ }
2544
2583
  var _latest$current = latest.current,
2545
2584
  latestState = _latest$current.state,
2546
2585
  latestProps = _latest$current.props;
2547
2586
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
2548
2587
  item = _getItemAndIndex[0],
2549
2588
  index = _getItemAndIndex[1];
2589
+ var disabled = latestProps.isItemDisabled(item, index);
2550
2590
  var itemHandleMouseMove = function itemHandleMouseMove() {
2551
2591
  if (index === latestState.highlightedIndex) {
2552
2592
  return;
@@ -2564,16 +2604,11 @@ function useSelect(userProps) {
2564
2604
  index: index
2565
2605
  });
2566
2606
  };
2567
- var itemProps = _extends__default["default"]((_extends4 = {
2568
- disabled: disabled,
2569
- role: 'option',
2570
- 'aria-selected': "" + (item === selectedItem),
2571
- id: elementIds.getItemId(index)
2572
- }, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2607
+ var itemProps = _extends__default["default"]((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2573
2608
  if (itemNode) {
2574
2609
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
2575
2610
  }
2576
- }), _extends4), rest);
2611
+ }), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = "" + (item === latestState.selectedItem), _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4), rest);
2577
2612
  if (!disabled) {
2578
2613
  /* istanbul ignore next (react-native) */
2579
2614
  {
@@ -2582,7 +2617,7 @@ function useSelect(userProps) {
2582
2617
  }
2583
2618
  itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove);
2584
2619
  return itemProps;
2585
- }, [latest, selectedItem, elementIds, shouldScrollRef, dispatch]);
2620
+ }, [latest, elementIds, shouldScrollRef, dispatch]);
2586
2621
  return {
2587
2622
  // prop getters.
2588
2623
  getToggleButtonProps: getToggleButtonProps,
@@ -2615,7 +2650,7 @@ var InputKeyDownPageDown = process.env.NODE_ENV !== "production" ? '__input_keyd
2615
2650
  var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 7;
2616
2651
  var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 8;
2617
2652
  var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 9;
2618
- var InputFocus = process.env.NODE_ENV !== "production" ? '__input_focus__' : 10;
2653
+ var InputClick = process.env.NODE_ENV !== "production" ? '__input_click__' : 10;
2619
2654
  var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 11;
2620
2655
  var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 12;
2621
2656
  var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 13;
@@ -2641,7 +2676,7 @@ var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({
2641
2676
  InputKeyDownEnter: InputKeyDownEnter,
2642
2677
  InputChange: InputChange,
2643
2678
  InputBlur: InputBlur,
2644
- InputFocus: InputFocus,
2679
+ InputClick: InputClick,
2645
2680
  MenuMouseLeave: MenuMouseLeave,
2646
2681
  ItemMouseMove: ItemMouseMove,
2647
2682
  ItemClick: ItemClick,
@@ -2667,46 +2702,17 @@ function getInitialState$1(props) {
2667
2702
  inputValue: inputValue
2668
2703
  });
2669
2704
  }
2670
- var propTypes$1 = {
2705
+ var propTypes$1 = _extends__default["default"]({}, commonDropdownPropTypes, {
2671
2706
  items: PropTypes__default["default"].array.isRequired,
2672
- itemToString: PropTypes__default["default"].func,
2707
+ isItemDisabled: PropTypes__default["default"].func,
2673
2708
  selectedItemChanged: PropTypes__default["default"].func,
2674
- getA11yStatusMessage: PropTypes__default["default"].func,
2675
2709
  getA11ySelectionMessage: PropTypes__default["default"].func,
2676
- highlightedIndex: PropTypes__default["default"].number,
2677
- defaultHighlightedIndex: PropTypes__default["default"].number,
2678
- initialHighlightedIndex: PropTypes__default["default"].number,
2679
- isOpen: PropTypes__default["default"].bool,
2680
- defaultIsOpen: PropTypes__default["default"].bool,
2681
- initialIsOpen: PropTypes__default["default"].bool,
2682
- selectedItem: PropTypes__default["default"].any,
2683
- initialSelectedItem: PropTypes__default["default"].any,
2684
- defaultSelectedItem: PropTypes__default["default"].any,
2685
2710
  inputValue: PropTypes__default["default"].string,
2686
2711
  defaultInputValue: PropTypes__default["default"].string,
2687
2712
  initialInputValue: PropTypes__default["default"].string,
2688
- id: PropTypes__default["default"].string,
2689
- labelId: PropTypes__default["default"].string,
2690
- menuId: PropTypes__default["default"].string,
2691
- getItemId: PropTypes__default["default"].func,
2692
2713
  inputId: PropTypes__default["default"].string,
2693
- toggleButtonId: PropTypes__default["default"].string,
2694
- stateReducer: PropTypes__default["default"].func,
2695
- onSelectedItemChange: PropTypes__default["default"].func,
2696
- onHighlightedIndexChange: PropTypes__default["default"].func,
2697
- onStateChange: PropTypes__default["default"].func,
2698
- onIsOpenChange: PropTypes__default["default"].func,
2699
- onInputValueChange: PropTypes__default["default"].func,
2700
- environment: PropTypes__default["default"].shape({
2701
- addEventListener: PropTypes__default["default"].func,
2702
- removeEventListener: PropTypes__default["default"].func,
2703
- document: PropTypes__default["default"].shape({
2704
- getElementById: PropTypes__default["default"].func,
2705
- activeElement: PropTypes__default["default"].any,
2706
- body: PropTypes__default["default"].any
2707
- })
2708
- })
2709
- };
2714
+ onInputValueChange: PropTypes__default["default"].func
2715
+ });
2710
2716
 
2711
2717
  /**
2712
2718
  * The useCombobox version of useControlledReducer, which also
@@ -2721,13 +2727,13 @@ var propTypes$1 = {
2721
2727
  * @returns {Array} An array with the state and an action dispatcher.
2722
2728
  */
2723
2729
  function useControlledReducer(reducer, initialState, props) {
2724
- var previousSelectedItemRef = react.useRef();
2730
+ var previousSelectedItemRef = React.useRef();
2725
2731
  var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props),
2726
2732
  state = _useEnhancedReducer[0],
2727
2733
  dispatch = _useEnhancedReducer[1];
2728
2734
 
2729
2735
  // ToDo: if needed, make same approach as selectedItemChanged from Downshift.
2730
- react.useEffect(function () {
2736
+ React.useEffect(function () {
2731
2737
  if (!isControlledProp(props, 'selectedItem')) {
2732
2738
  return;
2733
2739
  }
@@ -2755,7 +2761,10 @@ var defaultProps$1 = _extends__default["default"]({}, defaultProps$3, {
2755
2761
  selectedItemChanged: function selectedItemChanged(prevItem, item) {
2756
2762
  return prevItem !== item;
2757
2763
  },
2758
- getA11yStatusMessage: getA11yStatusMessage$1
2764
+ getA11yStatusMessage: getA11yStatusMessage$1,
2765
+ isItemDisabled: function isItemDisabled() {
2766
+ return false;
2767
+ }
2759
2768
  });
2760
2769
 
2761
2770
  /* eslint-disable complexity */
@@ -2777,11 +2786,11 @@ function downshiftUseComboboxReducer(state, action) {
2777
2786
  case InputKeyDownArrowDown:
2778
2787
  if (state.isOpen) {
2779
2788
  changes = {
2780
- highlightedIndex: getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2789
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled, true)
2781
2790
  };
2782
2791
  } else {
2783
2792
  changes = {
2784
- highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex),
2793
+ highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1),
2785
2794
  isOpen: props.items.length >= 0
2786
2795
  };
2787
2796
  }
@@ -2792,12 +2801,12 @@ function downshiftUseComboboxReducer(state, action) {
2792
2801
  changes = getChangesOnSelection(props, state.highlightedIndex);
2793
2802
  } else {
2794
2803
  changes = {
2795
- highlightedIndex: getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2804
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled, true)
2796
2805
  };
2797
2806
  }
2798
2807
  } else {
2799
2808
  changes = {
2800
- highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex),
2809
+ highlightedIndex: getHighlightedIndexOnOpen(props, state, -1),
2801
2810
  isOpen: props.items.length >= 0
2802
2811
  };
2803
2812
  }
@@ -2816,22 +2825,22 @@ function downshiftUseComboboxReducer(state, action) {
2816
2825
  break;
2817
2826
  case InputKeyDownPageUp:
2818
2827
  changes = {
2819
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2828
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled, true)
2820
2829
  };
2821
2830
  break;
2822
2831
  case InputKeyDownPageDown:
2823
2832
  changes = {
2824
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2833
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled, true)
2825
2834
  };
2826
2835
  break;
2827
2836
  case InputKeyDownHome:
2828
2837
  changes = {
2829
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false)
2838
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled)
2830
2839
  };
2831
2840
  break;
2832
2841
  case InputKeyDownEnd:
2833
2842
  changes = {
2834
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false)
2843
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled)
2835
2844
  };
2836
2845
  break;
2837
2846
  case InputBlur:
@@ -2850,10 +2859,10 @@ function downshiftUseComboboxReducer(state, action) {
2850
2859
  inputValue: action.inputValue
2851
2860
  };
2852
2861
  break;
2853
- case InputFocus:
2862
+ case InputClick:
2854
2863
  changes = {
2855
- isOpen: true,
2856
- highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)
2864
+ isOpen: !state.isOpen,
2865
+ highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)
2857
2866
  };
2858
2867
  break;
2859
2868
  case FunctionSelectItem:
@@ -2877,7 +2886,7 @@ function downshiftUseComboboxReducer(state, action) {
2877
2886
  var _excluded$1 = ["onMouseLeave", "refKey", "ref"],
2878
2887
  _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onMouseDown", "onClick", "onPress", "disabled"],
2879
2888
  _excluded3 = ["onClick", "onPress", "refKey", "ref"],
2880
- _excluded4 = ["onKeyDown", "onChange", "onInput", "onFocus", "onBlur", "onChangeText", "refKey", "ref"];
2889
+ _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "onClick", "refKey", "ref"];
2881
2890
  useCombobox.stateChangeTypes = stateChangeTypes$1;
2882
2891
  function useCombobox(userProps) {
2883
2892
  if (userProps === void 0) {
@@ -2905,21 +2914,21 @@ function useCombobox(userProps) {
2905
2914
  inputValue = state.inputValue;
2906
2915
 
2907
2916
  // Element refs.
2908
- var menuRef = react.useRef(null);
2909
- var itemRefs = react.useRef({});
2910
- var inputRef = react.useRef(null);
2911
- var toggleButtonRef = react.useRef(null);
2912
- var isInitialMountRef = react.useRef(true);
2917
+ var menuRef = React.useRef(null);
2918
+ var itemRefs = React.useRef({});
2919
+ var inputRef = React.useRef(null);
2920
+ var toggleButtonRef = React.useRef(null);
2921
+ var isInitialMountRef = React.useRef(true);
2913
2922
  // prevent id re-generation between renders.
2914
2923
  var elementIds = useElementIds(props);
2915
2924
  // used to keep track of how many items we had on previous cycle.
2916
- var previousResultCountRef = react.useRef();
2925
+ var previousResultCountRef = React.useRef();
2917
2926
  // utility callback to get item element.
2918
2927
  var latest = useLatestRef({
2919
2928
  state: state,
2920
2929
  props: props
2921
2930
  });
2922
- var getItemNodeFromIndex = react.useCallback(function (index) {
2931
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2923
2932
  return itemRefs.current[elementIds.getItemId(index)];
2924
2933
  }, [elementIds]);
2925
2934
 
@@ -2955,14 +2964,14 @@ function useCombobox(userProps) {
2955
2964
  state: state
2956
2965
  });
2957
2966
  // Focus the input on first render if required.
2958
- react.useEffect(function () {
2967
+ React.useEffect(function () {
2959
2968
  var focusOnOpen = initialIsOpen || defaultIsOpen || isOpen;
2960
2969
  if (focusOnOpen && inputRef.current) {
2961
2970
  inputRef.current.focus();
2962
2971
  }
2963
2972
  // eslint-disable-next-line react-hooks/exhaustive-deps
2964
2973
  }, []);
2965
- react.useEffect(function () {
2974
+ React.useEffect(function () {
2966
2975
  if (isInitialMountRef.current) {
2967
2976
  return;
2968
2977
  }
@@ -2977,14 +2986,14 @@ function useCombobox(userProps) {
2977
2986
  });
2978
2987
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getMenuProps');
2979
2988
  // Make initial ref false.
2980
- react.useEffect(function () {
2989
+ React.useEffect(function () {
2981
2990
  isInitialMountRef.current = false;
2982
2991
  return function () {
2983
2992
  isInitialMountRef.current = true;
2984
2993
  };
2985
2994
  }, []);
2986
2995
  // Reset itemRefs on close.
2987
- react.useEffect(function () {
2996
+ React.useEffect(function () {
2988
2997
  var _environment$document;
2989
2998
  if (!isOpen) {
2990
2999
  itemRefs.current = {};
@@ -2995,22 +3004,20 @@ function useCombobox(userProps) {
2995
3004
  }, [isOpen, environment]);
2996
3005
 
2997
3006
  /* Event handler functions */
2998
- var inputKeyDownHandlers = react.useMemo(function () {
3007
+ var inputKeyDownHandlers = React.useMemo(function () {
2999
3008
  return {
3000
3009
  ArrowDown: function ArrowDown(event) {
3001
3010
  event.preventDefault();
3002
3011
  dispatch({
3003
3012
  type: InputKeyDownArrowDown,
3004
- altKey: event.altKey,
3005
- getItemNodeFromIndex: getItemNodeFromIndex
3013
+ altKey: event.altKey
3006
3014
  });
3007
3015
  },
3008
3016
  ArrowUp: function ArrowUp(event) {
3009
3017
  event.preventDefault();
3010
3018
  dispatch({
3011
3019
  type: InputKeyDownArrowUp,
3012
- altKey: event.altKey,
3013
- getItemNodeFromIndex: getItemNodeFromIndex
3020
+ altKey: event.altKey
3014
3021
  });
3015
3022
  },
3016
3023
  Home: function Home(event) {
@@ -3019,8 +3026,7 @@ function useCombobox(userProps) {
3019
3026
  }
3020
3027
  event.preventDefault();
3021
3028
  dispatch({
3022
- type: InputKeyDownHome,
3023
- getItemNodeFromIndex: getItemNodeFromIndex
3029
+ type: InputKeyDownHome
3024
3030
  });
3025
3031
  },
3026
3032
  End: function End(event) {
@@ -3029,8 +3035,7 @@ function useCombobox(userProps) {
3029
3035
  }
3030
3036
  event.preventDefault();
3031
3037
  dispatch({
3032
- type: InputKeyDownEnd,
3033
- getItemNodeFromIndex: getItemNodeFromIndex
3038
+ type: InputKeyDownEnd
3034
3039
  });
3035
3040
  },
3036
3041
  Escape: function Escape(event) {
@@ -3051,16 +3056,14 @@ function useCombobox(userProps) {
3051
3056
  }
3052
3057
  event.preventDefault();
3053
3058
  dispatch({
3054
- type: InputKeyDownEnter,
3055
- getItemNodeFromIndex: getItemNodeFromIndex
3059
+ type: InputKeyDownEnter
3056
3060
  });
3057
3061
  },
3058
3062
  PageUp: function PageUp(event) {
3059
3063
  if (latest.current.state.isOpen) {
3060
3064
  event.preventDefault();
3061
3065
  dispatch({
3062
- type: InputKeyDownPageUp,
3063
- getItemNodeFromIndex: getItemNodeFromIndex
3066
+ type: InputKeyDownPageUp
3064
3067
  });
3065
3068
  }
3066
3069
  },
@@ -3068,22 +3071,21 @@ function useCombobox(userProps) {
3068
3071
  if (latest.current.state.isOpen) {
3069
3072
  event.preventDefault();
3070
3073
  dispatch({
3071
- type: InputKeyDownPageDown,
3072
- getItemNodeFromIndex: getItemNodeFromIndex
3074
+ type: InputKeyDownPageDown
3073
3075
  });
3074
3076
  }
3075
3077
  }
3076
3078
  };
3077
- }, [dispatch, latest, getItemNodeFromIndex]);
3079
+ }, [dispatch, latest]);
3078
3080
 
3079
3081
  // Getter props.
3080
- var getLabelProps = react.useCallback(function (labelProps) {
3082
+ var getLabelProps = React.useCallback(function (labelProps) {
3081
3083
  return _extends__default["default"]({
3082
3084
  id: elementIds.labelId,
3083
3085
  htmlFor: elementIds.inputId
3084
3086
  }, labelProps);
3085
3087
  }, [elementIds]);
3086
- var getMenuProps = react.useCallback(function (_temp, _temp2) {
3088
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
3087
3089
  var _extends2;
3088
3090
  var _ref = _temp === void 0 ? {} : _temp,
3089
3091
  onMouseLeave = _ref.onMouseLeave,
@@ -3103,7 +3105,7 @@ function useCombobox(userProps) {
3103
3105
  });
3104
3106
  }), _extends2), rest);
3105
3107
  }, [dispatch, setGetterPropCallInfo, elementIds]);
3106
- var getItemProps = react.useCallback(function (_temp3) {
3108
+ var getItemProps = React.useCallback(function (_temp3) {
3107
3109
  var _extends3, _ref4;
3108
3110
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
3109
3111
  itemProp = _ref3.item,
@@ -3115,13 +3117,18 @@ function useCombobox(userProps) {
3115
3117
  onMouseDown = _ref3.onMouseDown;
3116
3118
  _ref3.onClick;
3117
3119
  var onPress = _ref3.onPress,
3118
- disabled = _ref3.disabled,
3120
+ disabledProp = _ref3.disabled,
3119
3121
  rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$1);
3122
+ if (disabledProp !== undefined) {
3123
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useCombobox.');
3124
+ }
3120
3125
  var _latest$current = latest.current,
3121
3126
  latestProps = _latest$current.props,
3122
3127
  latestState = _latest$current.state;
3123
3128
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
3129
+ item = _getItemAndIndex[0],
3124
3130
  index = _getItemAndIndex[1];
3131
+ var disabled = latestProps.isItemDisabled(item, index);
3125
3132
  var onSelectKey = /* istanbul ignore next (react-native) */'onPress' ;
3126
3133
  var customClickHandler = /* istanbul ignore next (react-native) */onPress ;
3127
3134
  var itemHandleMouseMove = function itemHandleMouseMove() {
@@ -3148,12 +3155,12 @@ function useCombobox(userProps) {
3148
3155
  if (itemNode) {
3149
3156
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
3150
3157
  }
3151
- }), _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), {
3158
+ }), _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), {
3152
3159
  onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),
3153
3160
  onMouseDown: callAllEventHandlers(onMouseDown, itemHandleMouseDown)
3154
3161
  }, rest);
3155
3162
  }, [dispatch, latest, shouldScrollRef, elementIds]);
3156
- var getToggleButtonProps = react.useCallback(function (_temp4) {
3163
+ var getToggleButtonProps = React.useCallback(function (_temp4) {
3157
3164
  var _extends4;
3158
3165
  var _ref5 = _temp4 === void 0 ? {} : _temp4;
3159
3166
  _ref5.onClick;
@@ -3174,15 +3181,15 @@ function useCombobox(userProps) {
3174
3181
  onPress: callAllEventHandlers(onPress, toggleButtonHandleClick)
3175
3182
  } ), rest);
3176
3183
  }, [dispatch, latest, elementIds]);
3177
- var getInputProps = react.useCallback(function (_temp5, _temp6) {
3184
+ var getInputProps = React.useCallback(function (_temp5, _temp6) {
3178
3185
  var _extends5;
3179
3186
  var _ref6 = _temp5 === void 0 ? {} : _temp5,
3180
3187
  onKeyDown = _ref6.onKeyDown,
3181
3188
  onChange = _ref6.onChange,
3182
3189
  onInput = _ref6.onInput,
3183
- onFocus = _ref6.onFocus,
3184
3190
  onBlur = _ref6.onBlur,
3185
3191
  onChangeText = _ref6.onChangeText,
3192
+ onClick = _ref6.onClick,
3186
3193
  _ref6$refKey = _ref6.refKey,
3187
3194
  refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,
3188
3195
  ref = _ref6.ref,
@@ -3213,12 +3220,10 @@ function useCombobox(userProps) {
3213
3220
  });
3214
3221
  }
3215
3222
  };
3216
- var inputHandleFocus = function inputHandleFocus() {
3217
- if (!latestState.isOpen) {
3218
- dispatch({
3219
- type: InputFocus
3220
- });
3221
- }
3223
+ var inputHandleClick = function inputHandleClick() {
3224
+ dispatch({
3225
+ type: InputClick
3226
+ });
3222
3227
  };
3223
3228
 
3224
3229
  /* istanbul ignore next (preact) */
@@ -3226,7 +3231,7 @@ function useCombobox(userProps) {
3226
3231
  var eventHandlers = {};
3227
3232
  if (!rest.disabled) {
3228
3233
  var _eventHandlers;
3229
- eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onFocus = callAllEventHandlers(onFocus, inputHandleFocus), _eventHandlers);
3234
+ eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onClick = callAllEventHandlers(onClick, inputHandleClick), _eventHandlers);
3230
3235
  }
3231
3236
 
3232
3237
  /* istanbul ignore if (react-native) */
@@ -3242,44 +3247,44 @@ function useCombobox(userProps) {
3242
3247
  }
3243
3248
  return _extends__default["default"]((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {
3244
3249
  inputRef.current = inputNode;
3245
- }), _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);
3250
+ }), _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);
3246
3251
  }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo, elementIds]);
3247
3252
 
3248
3253
  // returns
3249
- var toggleMenu = react.useCallback(function () {
3254
+ var toggleMenu = React.useCallback(function () {
3250
3255
  dispatch({
3251
3256
  type: FunctionToggleMenu
3252
3257
  });
3253
3258
  }, [dispatch]);
3254
- var closeMenu = react.useCallback(function () {
3259
+ var closeMenu = React.useCallback(function () {
3255
3260
  dispatch({
3256
3261
  type: FunctionCloseMenu
3257
3262
  });
3258
3263
  }, [dispatch]);
3259
- var openMenu = react.useCallback(function () {
3264
+ var openMenu = React.useCallback(function () {
3260
3265
  dispatch({
3261
3266
  type: FunctionOpenMenu
3262
3267
  });
3263
3268
  }, [dispatch]);
3264
- var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) {
3269
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
3265
3270
  dispatch({
3266
3271
  type: FunctionSetHighlightedIndex,
3267
3272
  highlightedIndex: newHighlightedIndex
3268
3273
  });
3269
3274
  }, [dispatch]);
3270
- var selectItem = react.useCallback(function (newSelectedItem) {
3275
+ var selectItem = React.useCallback(function (newSelectedItem) {
3271
3276
  dispatch({
3272
3277
  type: FunctionSelectItem,
3273
3278
  selectedItem: newSelectedItem
3274
3279
  });
3275
3280
  }, [dispatch]);
3276
- var setInputValue = react.useCallback(function (newInputValue) {
3281
+ var setInputValue = React.useCallback(function (newInputValue) {
3277
3282
  dispatch({
3278
3283
  type: FunctionSetInputValue,
3279
3284
  inputValue: newInputValue
3280
3285
  });
3281
3286
  }, [dispatch]);
3282
- var reset = react.useCallback(function () {
3287
+ var reset = React.useCallback(function () {
3283
3288
  dispatch({
3284
3289
  type: FunctionReset$1
3285
3290
  });
@@ -3389,30 +3394,19 @@ function getA11yRemovalMessage(selectionParameters) {
3389
3394
  itemToStringLocal = selectionParameters.itemToString;
3390
3395
  return itemToStringLocal(removedSelectedItem) + " has been removed.";
3391
3396
  }
3392
- var propTypes = {
3397
+ var propTypes = _extends__default["default"]({}, commonPropTypes, {
3393
3398
  selectedItems: PropTypes__default["default"].array,
3394
3399
  initialSelectedItems: PropTypes__default["default"].array,
3395
3400
  defaultSelectedItems: PropTypes__default["default"].array,
3396
- itemToString: PropTypes__default["default"].func,
3397
3401
  getA11yRemovalMessage: PropTypes__default["default"].func,
3398
- stateReducer: PropTypes__default["default"].func,
3399
3402
  activeIndex: PropTypes__default["default"].number,
3400
3403
  initialActiveIndex: PropTypes__default["default"].number,
3401
3404
  defaultActiveIndex: PropTypes__default["default"].number,
3402
3405
  onActiveIndexChange: PropTypes__default["default"].func,
3403
3406
  onSelectedItemsChange: PropTypes__default["default"].func,
3404
3407
  keyNavigationNext: PropTypes__default["default"].string,
3405
- keyNavigationPrevious: PropTypes__default["default"].string,
3406
- environment: PropTypes__default["default"].shape({
3407
- addEventListener: PropTypes__default["default"].func,
3408
- removeEventListener: PropTypes__default["default"].func,
3409
- document: PropTypes__default["default"].shape({
3410
- getElementById: PropTypes__default["default"].func,
3411
- activeElement: PropTypes__default["default"].any,
3412
- body: PropTypes__default["default"].any
3413
- })
3414
- })
3415
- };
3408
+ keyNavigationPrevious: PropTypes__default["default"].string
3409
+ });
3416
3410
  var defaultProps = {
3417
3411
  itemToString: defaultProps$3.itemToString,
3418
3412
  stateReducer: defaultProps$3.stateReducer,
@@ -3596,10 +3590,10 @@ function useMultipleSelection(userProps) {
3596
3590
  selectedItems = state.selectedItems;
3597
3591
 
3598
3592
  // Refs.
3599
- var isInitialMountRef = react.useRef(true);
3600
- var dropdownRef = react.useRef(null);
3601
- var previousSelectedItemsRef = react.useRef(selectedItems);
3602
- var selectedItemRefs = react.useRef();
3593
+ var isInitialMountRef = React.useRef(true);
3594
+ var dropdownRef = React.useRef(null);
3595
+ var previousSelectedItemsRef = React.useRef(selectedItems);
3596
+ var selectedItemRefs = React.useRef();
3603
3597
  selectedItemRefs.current = [];
3604
3598
  var latest = useLatestRef({
3605
3599
  state: state,
@@ -3608,7 +3602,7 @@ function useMultipleSelection(userProps) {
3608
3602
 
3609
3603
  // Effects.
3610
3604
  /* Sets a11y status message on changes in selectedItem. */
3611
- react.useEffect(function () {
3605
+ React.useEffect(function () {
3612
3606
  if (isInitialMountRef.current || true) {
3613
3607
  return;
3614
3608
  }
@@ -3629,7 +3623,7 @@ function useMultipleSelection(userProps) {
3629
3623
  // eslint-disable-next-line react-hooks/exhaustive-deps
3630
3624
  }, [selectedItems.length]);
3631
3625
  // Sets focus on active item.
3632
- react.useEffect(function () {
3626
+ React.useEffect(function () {
3633
3627
  if (isInitialMountRef.current) {
3634
3628
  return;
3635
3629
  }
@@ -3646,7 +3640,7 @@ function useMultipleSelection(userProps) {
3646
3640
  });
3647
3641
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps');
3648
3642
  // Make initial ref false.
3649
- react.useEffect(function () {
3643
+ React.useEffect(function () {
3650
3644
  isInitialMountRef.current = false;
3651
3645
  return function () {
3652
3646
  isInitialMountRef.current = true;
@@ -3654,7 +3648,7 @@ function useMultipleSelection(userProps) {
3654
3648
  }, []);
3655
3649
 
3656
3650
  // Event handler functions.
3657
- var selectedItemKeyDownHandlers = react.useMemo(function () {
3651
+ var selectedItemKeyDownHandlers = React.useMemo(function () {
3658
3652
  var _ref;
3659
3653
  return _ref = {}, _ref[keyNavigationPrevious] = function () {
3660
3654
  dispatch({
@@ -3674,7 +3668,7 @@ function useMultipleSelection(userProps) {
3674
3668
  });
3675
3669
  }, _ref;
3676
3670
  }, [dispatch, keyNavigationNext, keyNavigationPrevious]);
3677
- var dropdownKeyDownHandlers = react.useMemo(function () {
3671
+ var dropdownKeyDownHandlers = React.useMemo(function () {
3678
3672
  var _ref2;
3679
3673
  return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) {
3680
3674
  if (isKeyDownOperationPermitted(event)) {
@@ -3692,7 +3686,7 @@ function useMultipleSelection(userProps) {
3692
3686
  }, [dispatch, keyNavigationPrevious]);
3693
3687
 
3694
3688
  // Getter props.
3695
- var getSelectedItemProps = react.useCallback(function (_temp) {
3689
+ var getSelectedItemProps = React.useCallback(function (_temp) {
3696
3690
  var _extends2;
3697
3691
  var _ref3 = _temp === void 0 ? {} : _temp,
3698
3692
  _ref3$refKey = _ref3.refKey,
@@ -3725,7 +3719,7 @@ function useMultipleSelection(userProps) {
3725
3719
  }
3726
3720
  }), _extends2.tabIndex = isFocusable ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, selectedItemHandleClick), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown), _extends2), rest);
3727
3721
  }, [dispatch, latest, selectedItemKeyDownHandlers]);
3728
- var getDropdownProps = react.useCallback(function (_temp2, _temp3) {
3722
+ var getDropdownProps = React.useCallback(function (_temp2, _temp3) {
3729
3723
  var _extends3;
3730
3724
  var _ref4 = _temp2 === void 0 ? {} : _temp2,
3731
3725
  _ref4$refKey = _ref4.refKey,
@@ -3762,31 +3756,31 @@ function useMultipleSelection(userProps) {
3762
3756
  }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]);
3763
3757
 
3764
3758
  // returns
3765
- var addSelectedItem = react.useCallback(function (selectedItem) {
3759
+ var addSelectedItem = React.useCallback(function (selectedItem) {
3766
3760
  dispatch({
3767
3761
  type: FunctionAddSelectedItem,
3768
3762
  selectedItem: selectedItem
3769
3763
  });
3770
3764
  }, [dispatch]);
3771
- var removeSelectedItem = react.useCallback(function (selectedItem) {
3765
+ var removeSelectedItem = React.useCallback(function (selectedItem) {
3772
3766
  dispatch({
3773
3767
  type: FunctionRemoveSelectedItem,
3774
3768
  selectedItem: selectedItem
3775
3769
  });
3776
3770
  }, [dispatch]);
3777
- var setSelectedItems = react.useCallback(function (newSelectedItems) {
3771
+ var setSelectedItems = React.useCallback(function (newSelectedItems) {
3778
3772
  dispatch({
3779
3773
  type: FunctionSetSelectedItems,
3780
3774
  selectedItems: newSelectedItems
3781
3775
  });
3782
3776
  }, [dispatch]);
3783
- var setActiveIndex = react.useCallback(function (newActiveIndex) {
3777
+ var setActiveIndex = React.useCallback(function (newActiveIndex) {
3784
3778
  dispatch({
3785
3779
  type: FunctionSetActiveIndex,
3786
3780
  activeIndex: newActiveIndex
3787
3781
  });
3788
3782
  }, [dispatch]);
3789
- var reset = react.useCallback(function () {
3783
+ var reset = React.useCallback(function () {
3790
3784
  dispatch({
3791
3785
  type: FunctionReset
3792
3786
  });