downshift 5.2.0 → 5.2.1

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.
@@ -1793,21 +1793,33 @@ function isAcceptedCharacterKey(key) {
1793
1793
  function capitalizeString(string) {
1794
1794
  return "" + string.slice(0, 1).toUpperCase() + string.slice(1);
1795
1795
  }
1796
- function useEnhancedReducer(reducer, initialState, props) {
1797
- var enhancedReducer = react.useCallback(function (state, action) {
1798
- state = getState(state, action.props);
1799
- var stateReduceLocal = action.props.stateReducer;
1796
+ /**
1797
+ * Computes the controlled state using a the previous state, props,
1798
+ * two reducers, one from downshift and an optional one from the user.
1799
+ * Also calls the onChange handlers for state values that have changed.
1800
+ *
1801
+ * @param {Function} reducer Reducer function from downshift.
1802
+ * @param {Object} initialState Initial state of the hook.
1803
+ * @param {Object} props The hook props.
1804
+ * @returns {Array} An array with the state and an action dispatcher.
1805
+ */
1806
+
1807
+ function useControlledState(reducer, initialState, props) {
1808
+ var _useState = react.useState(initialState),
1809
+ uncontrolledState = _useState[0],
1810
+ setState = _useState[1];
1811
+
1812
+ var state = getState(uncontrolledState, props);
1813
+
1814
+ var dispatch = function (action) {
1815
+ var stateReducerFromProps = action.props.stateReducer;
1800
1816
  var changes = reducer(state, action);
1801
- var newState = stateReduceLocal(state, _extends({}, action, {
1817
+ var newState = stateReducerFromProps(state, _extends({}, action, {
1802
1818
  changes: changes
1803
1819
  }));
1804
1820
  callOnChangeProps(action, state, newState);
1805
- return newState;
1806
- }, [reducer]);
1807
-
1808
- var _useReducer = react.useReducer(enhancedReducer, initialState),
1809
- state = _useReducer[0],
1810
- dispatch = _useReducer[1];
1821
+ setState(newState);
1822
+ };
1811
1823
 
1812
1824
  return [getState(state, props), function dispatchWithProps(action) {
1813
1825
  return dispatch(_extends({
@@ -2250,13 +2262,13 @@ function useSelect(userProps) {
2250
2262
 
2251
2263
  var initialState = getInitialState(props); // Reducer init.
2252
2264
 
2253
- var _useEnhancedReducer = useEnhancedReducer(downshiftSelectReducer, initialState, props),
2254
- _useEnhancedReducer$ = _useEnhancedReducer[0],
2255
- isOpen = _useEnhancedReducer$.isOpen,
2256
- highlightedIndex = _useEnhancedReducer$.highlightedIndex,
2257
- selectedItem = _useEnhancedReducer$.selectedItem,
2258
- inputValue = _useEnhancedReducer$.inputValue,
2259
- dispatch = _useEnhancedReducer[1]; // Refs
2265
+ var _useControlledState = useControlledState(downshiftSelectReducer, initialState, props),
2266
+ _useControlledState$ = _useControlledState[0],
2267
+ isOpen = _useControlledState$.isOpen,
2268
+ highlightedIndex = _useControlledState$.highlightedIndex,
2269
+ selectedItem = _useControlledState$.selectedItem,
2270
+ inputValue = _useControlledState$.inputValue,
2271
+ dispatch = _useControlledState[1]; // Refs
2260
2272
 
2261
2273
 
2262
2274
  var toggleButtonRef = react.useRef(null);
@@ -2703,6 +2715,51 @@ function useSelect(userProps) {
2703
2715
  };
2704
2716
  }
2705
2717
 
2718
+ var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0;
2719
+ var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1;
2720
+ var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2;
2721
+ var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3;
2722
+ var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4;
2723
+ var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5;
2724
+ var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6;
2725
+ var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7;
2726
+ var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8;
2727
+ var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9;
2728
+ var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 10;
2729
+ var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11;
2730
+ var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12;
2731
+ var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13;
2732
+ var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14;
2733
+ var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15;
2734
+ var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16;
2735
+ var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17;
2736
+ var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18;
2737
+ var ControlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__controlled_prop_updated_selected_item__' : 19;
2738
+
2739
+ var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({
2740
+ __proto__: null,
2741
+ InputKeyDownArrowDown: InputKeyDownArrowDown,
2742
+ InputKeyDownArrowUp: InputKeyDownArrowUp,
2743
+ InputKeyDownEscape: InputKeyDownEscape,
2744
+ InputKeyDownHome: InputKeyDownHome,
2745
+ InputKeyDownEnd: InputKeyDownEnd,
2746
+ InputKeyDownEnter: InputKeyDownEnter,
2747
+ InputChange: InputChange,
2748
+ InputBlur: InputBlur,
2749
+ MenuMouseLeave: MenuMouseLeave$1,
2750
+ ItemMouseMove: ItemMouseMove$1,
2751
+ ItemClick: ItemClick$1,
2752
+ ToggleButtonClick: ToggleButtonClick$1,
2753
+ FunctionToggleMenu: FunctionToggleMenu$1,
2754
+ FunctionOpenMenu: FunctionOpenMenu$1,
2755
+ FunctionCloseMenu: FunctionCloseMenu$1,
2756
+ FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1,
2757
+ FunctionSelectItem: FunctionSelectItem$1,
2758
+ FunctionSetInputValue: FunctionSetInputValue$1,
2759
+ FunctionReset: FunctionReset$1,
2760
+ ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem
2761
+ });
2762
+
2706
2763
  function getElementIds$1(_ref) {
2707
2764
  var id = _ref.id,
2708
2765
  inputId = _ref.inputId,
@@ -2715,7 +2772,6 @@ function getElementIds$1(_ref) {
2715
2772
  id: id
2716
2773
  }, rest)));
2717
2774
  }
2718
-
2719
2775
  function getInitialState$1(props) {
2720
2776
  var initialState = getInitialState(props);
2721
2777
  var selectedItem = initialState.selectedItem;
@@ -2729,7 +2785,6 @@ function getInitialState$1(props) {
2729
2785
  inputValue: inputValue
2730
2786
  });
2731
2787
  }
2732
-
2733
2788
  var propTypes$1 = {
2734
2789
  items: PropTypes.array.isRequired,
2735
2790
  itemToString: PropTypes.func,
@@ -2770,55 +2825,43 @@ var propTypes$1 = {
2770
2825
  })
2771
2826
  })
2772
2827
  };
2828
+ /**
2829
+ * The useCombobox version of useControlledState, which also
2830
+ * checks if the controlled prop selectedItem changed between
2831
+ * renders. If so, it will also update inputValue with its
2832
+ * string equivalent. It uses the common useControlledState to
2833
+ * compute the rest of the state.
2834
+ *
2835
+ * @param {Function} reducer Reducer function from downshift.
2836
+ * @param {Object} initialState Initial state of the hook.
2837
+ * @param {Object} props The hook props.
2838
+ * @returns {Array} An array with the state and an action dispatcher.
2839
+ */
2840
+
2841
+ function useControlledState$1(reducer, initialState, props) {
2842
+ var _useControlledStateCo = useControlledState(reducer, initialState, props),
2843
+ newState = _useControlledStateCo[0],
2844
+ dispatch = _useControlledStateCo[1];
2773
2845
 
2846
+ var previousSelectedItemRef = react.useRef(null);
2847
+ var selectedItem = props.selectedItem,
2848
+ itemToString = props.itemToString; // ToDo: if needed, make same approach as selectedItemChanged from Downshift.
2849
+
2850
+ if (isControlledProp(props, 'selectedItem') && previousSelectedItemRef.current !== selectedItem) {
2851
+ dispatch({
2852
+ type: ControlledPropUpdatedSelectedItem,
2853
+ inputValue: itemToString(selectedItem)
2854
+ });
2855
+ }
2856
+
2857
+ previousSelectedItemRef.current = selectedItem;
2858
+ return [newState, dispatch];
2859
+ }
2774
2860
  var defaultProps$2 = _extends({}, defaultProps, {
2775
2861
  getA11yStatusMessage: getA11yStatusMessage,
2776
2862
  circularNavigation: true
2777
2863
  });
2778
2864
 
2779
- var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0;
2780
- var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1;
2781
- var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2;
2782
- var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3;
2783
- var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4;
2784
- var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5;
2785
- var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6;
2786
- var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7;
2787
- var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8;
2788
- var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9;
2789
- var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 10;
2790
- var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11;
2791
- var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12;
2792
- var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13;
2793
- var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14;
2794
- var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15;
2795
- var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16;
2796
- var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17;
2797
- var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18;
2798
-
2799
- var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({
2800
- __proto__: null,
2801
- InputKeyDownArrowDown: InputKeyDownArrowDown,
2802
- InputKeyDownArrowUp: InputKeyDownArrowUp,
2803
- InputKeyDownEscape: InputKeyDownEscape,
2804
- InputKeyDownHome: InputKeyDownHome,
2805
- InputKeyDownEnd: InputKeyDownEnd,
2806
- InputKeyDownEnter: InputKeyDownEnter,
2807
- InputChange: InputChange,
2808
- InputBlur: InputBlur,
2809
- MenuMouseLeave: MenuMouseLeave$1,
2810
- ItemMouseMove: ItemMouseMove$1,
2811
- ItemClick: ItemClick$1,
2812
- ToggleButtonClick: ToggleButtonClick$1,
2813
- FunctionToggleMenu: FunctionToggleMenu$1,
2814
- FunctionOpenMenu: FunctionOpenMenu$1,
2815
- FunctionCloseMenu: FunctionCloseMenu$1,
2816
- FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1,
2817
- FunctionSelectItem: FunctionSelectItem$1,
2818
- FunctionSetInputValue: FunctionSetInputValue$1,
2819
- FunctionReset: FunctionReset$1
2820
- });
2821
-
2822
2865
  /* eslint-disable complexity */
2823
2866
 
2824
2867
  function downshiftUseComboboxReducer(state, action) {
@@ -2958,6 +3001,7 @@ function downshiftUseComboboxReducer(state, action) {
2958
3001
  };
2959
3002
  break;
2960
3003
 
3004
+ case ControlledPropUpdatedSelectedItem:
2961
3005
  case FunctionSetInputValue$1:
2962
3006
  changes = {
2963
3007
  inputValue: action.inputValue
@@ -3010,13 +3054,13 @@ function useCombobox(userProps) {
3010
3054
 
3011
3055
  var initialState = getInitialState$1(props); // Reducer init.
3012
3056
 
3013
- var _useEnhancedReducer = useEnhancedReducer(downshiftUseComboboxReducer, initialState, props),
3014
- _useEnhancedReducer$ = _useEnhancedReducer[0],
3015
- isOpen = _useEnhancedReducer$.isOpen,
3016
- highlightedIndex = _useEnhancedReducer$.highlightedIndex,
3017
- selectedItem = _useEnhancedReducer$.selectedItem,
3018
- inputValue = _useEnhancedReducer$.inputValue,
3019
- dispatch = _useEnhancedReducer[1];
3057
+ var _useControlledState = useControlledState$1(downshiftUseComboboxReducer, initialState, props),
3058
+ _useControlledState$ = _useControlledState[0],
3059
+ isOpen = _useControlledState$.isOpen,
3060
+ highlightedIndex = _useControlledState$.highlightedIndex,
3061
+ selectedItem = _useControlledState$.selectedItem,
3062
+ inputValue = _useControlledState$.inputValue,
3063
+ dispatch = _useControlledState[1];
3020
3064
  /* Refs */
3021
3065
 
3022
3066
 
@@ -3743,11 +3787,11 @@ function useMultipleSelection(userProps) {
3743
3787
  keyNavigationNext = props.keyNavigationNext,
3744
3788
  keyNavigationPrevious = props.keyNavigationPrevious; // Reducer init.
3745
3789
 
3746
- var _useEnhancedReducer = useEnhancedReducer(downshiftMultipleSelectionReducer, getInitialState$2(props), props),
3747
- _useEnhancedReducer$ = _useEnhancedReducer[0],
3748
- activeIndex = _useEnhancedReducer$.activeIndex,
3749
- selectedItems = _useEnhancedReducer$.selectedItems,
3750
- dispatch = _useEnhancedReducer[1]; // Refs.
3790
+ var _useControlledState = useControlledState(downshiftMultipleSelectionReducer, getInitialState$2(props), props),
3791
+ _useControlledState$ = _useControlledState[0],
3792
+ activeIndex = _useControlledState$.activeIndex,
3793
+ selectedItems = _useControlledState$.selectedItems,
3794
+ dispatch = _useControlledState[1]; // Refs.
3751
3795
 
3752
3796
 
3753
3797
  var isInitialMount = react.useRef(true);
@@ -3,7 +3,7 @@ import _extends from '@babel/runtime/helpers/esm/extends';
3
3
  import _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized';
4
4
  import _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';
5
5
  import PropTypes from 'prop-types';
6
- import { cloneElement, Component, useCallback, useReducer, useRef, useEffect } from 'react';
6
+ import { cloneElement, Component, useState, useRef, useEffect } from 'react';
7
7
  import { isForwardRef } from 'react-is';
8
8
  import computeScrollIntoView from 'compute-scroll-into-view';
9
9
 
@@ -1787,21 +1787,33 @@ function isAcceptedCharacterKey(key) {
1787
1787
  function capitalizeString(string) {
1788
1788
  return "" + string.slice(0, 1).toUpperCase() + string.slice(1);
1789
1789
  }
1790
- function useEnhancedReducer(reducer, initialState, props) {
1791
- var enhancedReducer = useCallback(function (state, action) {
1792
- state = getState(state, action.props);
1793
- var stateReduceLocal = action.props.stateReducer;
1790
+ /**
1791
+ * Computes the controlled state using a the previous state, props,
1792
+ * two reducers, one from downshift and an optional one from the user.
1793
+ * Also calls the onChange handlers for state values that have changed.
1794
+ *
1795
+ * @param {Function} reducer Reducer function from downshift.
1796
+ * @param {Object} initialState Initial state of the hook.
1797
+ * @param {Object} props The hook props.
1798
+ * @returns {Array} An array with the state and an action dispatcher.
1799
+ */
1800
+
1801
+ function useControlledState(reducer, initialState, props) {
1802
+ var _useState = useState(initialState),
1803
+ uncontrolledState = _useState[0],
1804
+ setState = _useState[1];
1805
+
1806
+ var state = getState(uncontrolledState, props);
1807
+
1808
+ var dispatch = function (action) {
1809
+ var stateReducerFromProps = action.props.stateReducer;
1794
1810
  var changes = reducer(state, action);
1795
- var newState = stateReduceLocal(state, _extends({}, action, {
1811
+ var newState = stateReducerFromProps(state, _extends({}, action, {
1796
1812
  changes: changes
1797
1813
  }));
1798
1814
  callOnChangeProps(action, state, newState);
1799
- return newState;
1800
- }, [reducer]);
1801
-
1802
- var _useReducer = useReducer(enhancedReducer, initialState),
1803
- state = _useReducer[0],
1804
- dispatch = _useReducer[1];
1815
+ setState(newState);
1816
+ };
1805
1817
 
1806
1818
  return [getState(state, props), function dispatchWithProps(action) {
1807
1819
  return dispatch(_extends({
@@ -2244,13 +2256,13 @@ function useSelect(userProps) {
2244
2256
 
2245
2257
  var initialState = getInitialState(props); // Reducer init.
2246
2258
 
2247
- var _useEnhancedReducer = useEnhancedReducer(downshiftSelectReducer, initialState, props),
2248
- _useEnhancedReducer$ = _useEnhancedReducer[0],
2249
- isOpen = _useEnhancedReducer$.isOpen,
2250
- highlightedIndex = _useEnhancedReducer$.highlightedIndex,
2251
- selectedItem = _useEnhancedReducer$.selectedItem,
2252
- inputValue = _useEnhancedReducer$.inputValue,
2253
- dispatch = _useEnhancedReducer[1]; // Refs
2259
+ var _useControlledState = useControlledState(downshiftSelectReducer, initialState, props),
2260
+ _useControlledState$ = _useControlledState[0],
2261
+ isOpen = _useControlledState$.isOpen,
2262
+ highlightedIndex = _useControlledState$.highlightedIndex,
2263
+ selectedItem = _useControlledState$.selectedItem,
2264
+ inputValue = _useControlledState$.inputValue,
2265
+ dispatch = _useControlledState[1]; // Refs
2254
2266
 
2255
2267
 
2256
2268
  var toggleButtonRef = useRef(null);
@@ -2697,6 +2709,51 @@ function useSelect(userProps) {
2697
2709
  };
2698
2710
  }
2699
2711
 
2712
+ var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0;
2713
+ var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1;
2714
+ var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2;
2715
+ var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3;
2716
+ var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4;
2717
+ var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5;
2718
+ var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6;
2719
+ var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7;
2720
+ var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8;
2721
+ var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9;
2722
+ var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 10;
2723
+ var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11;
2724
+ var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12;
2725
+ var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13;
2726
+ var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14;
2727
+ var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15;
2728
+ var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16;
2729
+ var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17;
2730
+ var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18;
2731
+ var ControlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__controlled_prop_updated_selected_item__' : 19;
2732
+
2733
+ var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({
2734
+ __proto__: null,
2735
+ InputKeyDownArrowDown: InputKeyDownArrowDown,
2736
+ InputKeyDownArrowUp: InputKeyDownArrowUp,
2737
+ InputKeyDownEscape: InputKeyDownEscape,
2738
+ InputKeyDownHome: InputKeyDownHome,
2739
+ InputKeyDownEnd: InputKeyDownEnd,
2740
+ InputKeyDownEnter: InputKeyDownEnter,
2741
+ InputChange: InputChange,
2742
+ InputBlur: InputBlur,
2743
+ MenuMouseLeave: MenuMouseLeave$1,
2744
+ ItemMouseMove: ItemMouseMove$1,
2745
+ ItemClick: ItemClick$1,
2746
+ ToggleButtonClick: ToggleButtonClick$1,
2747
+ FunctionToggleMenu: FunctionToggleMenu$1,
2748
+ FunctionOpenMenu: FunctionOpenMenu$1,
2749
+ FunctionCloseMenu: FunctionCloseMenu$1,
2750
+ FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1,
2751
+ FunctionSelectItem: FunctionSelectItem$1,
2752
+ FunctionSetInputValue: FunctionSetInputValue$1,
2753
+ FunctionReset: FunctionReset$1,
2754
+ ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem
2755
+ });
2756
+
2700
2757
  function getElementIds$1(_ref) {
2701
2758
  var id = _ref.id,
2702
2759
  inputId = _ref.inputId,
@@ -2709,7 +2766,6 @@ function getElementIds$1(_ref) {
2709
2766
  id: id
2710
2767
  }, rest)));
2711
2768
  }
2712
-
2713
2769
  function getInitialState$1(props) {
2714
2770
  var initialState = getInitialState(props);
2715
2771
  var selectedItem = initialState.selectedItem;
@@ -2723,7 +2779,6 @@ function getInitialState$1(props) {
2723
2779
  inputValue: inputValue
2724
2780
  });
2725
2781
  }
2726
-
2727
2782
  var propTypes$1 = {
2728
2783
  items: PropTypes.array.isRequired,
2729
2784
  itemToString: PropTypes.func,
@@ -2764,55 +2819,43 @@ var propTypes$1 = {
2764
2819
  })
2765
2820
  })
2766
2821
  };
2822
+ /**
2823
+ * The useCombobox version of useControlledState, which also
2824
+ * checks if the controlled prop selectedItem changed between
2825
+ * renders. If so, it will also update inputValue with its
2826
+ * string equivalent. It uses the common useControlledState to
2827
+ * compute the rest of the state.
2828
+ *
2829
+ * @param {Function} reducer Reducer function from downshift.
2830
+ * @param {Object} initialState Initial state of the hook.
2831
+ * @param {Object} props The hook props.
2832
+ * @returns {Array} An array with the state and an action dispatcher.
2833
+ */
2834
+
2835
+ function useControlledState$1(reducer, initialState, props) {
2836
+ var _useControlledStateCo = useControlledState(reducer, initialState, props),
2837
+ newState = _useControlledStateCo[0],
2838
+ dispatch = _useControlledStateCo[1];
2767
2839
 
2840
+ var previousSelectedItemRef = useRef(null);
2841
+ var selectedItem = props.selectedItem,
2842
+ itemToString = props.itemToString; // ToDo: if needed, make same approach as selectedItemChanged from Downshift.
2843
+
2844
+ if (isControlledProp(props, 'selectedItem') && previousSelectedItemRef.current !== selectedItem) {
2845
+ dispatch({
2846
+ type: ControlledPropUpdatedSelectedItem,
2847
+ inputValue: itemToString(selectedItem)
2848
+ });
2849
+ }
2850
+
2851
+ previousSelectedItemRef.current = selectedItem;
2852
+ return [newState, dispatch];
2853
+ }
2768
2854
  var defaultProps$2 = _extends({}, defaultProps, {
2769
2855
  getA11yStatusMessage: getA11yStatusMessage,
2770
2856
  circularNavigation: true
2771
2857
  });
2772
2858
 
2773
- var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0;
2774
- var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1;
2775
- var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2;
2776
- var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3;
2777
- var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4;
2778
- var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5;
2779
- var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6;
2780
- var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7;
2781
- var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8;
2782
- var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9;
2783
- var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 10;
2784
- var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11;
2785
- var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12;
2786
- var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13;
2787
- var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14;
2788
- var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15;
2789
- var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16;
2790
- var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17;
2791
- var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18;
2792
-
2793
- var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({
2794
- __proto__: null,
2795
- InputKeyDownArrowDown: InputKeyDownArrowDown,
2796
- InputKeyDownArrowUp: InputKeyDownArrowUp,
2797
- InputKeyDownEscape: InputKeyDownEscape,
2798
- InputKeyDownHome: InputKeyDownHome,
2799
- InputKeyDownEnd: InputKeyDownEnd,
2800
- InputKeyDownEnter: InputKeyDownEnter,
2801
- InputChange: InputChange,
2802
- InputBlur: InputBlur,
2803
- MenuMouseLeave: MenuMouseLeave$1,
2804
- ItemMouseMove: ItemMouseMove$1,
2805
- ItemClick: ItemClick$1,
2806
- ToggleButtonClick: ToggleButtonClick$1,
2807
- FunctionToggleMenu: FunctionToggleMenu$1,
2808
- FunctionOpenMenu: FunctionOpenMenu$1,
2809
- FunctionCloseMenu: FunctionCloseMenu$1,
2810
- FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1,
2811
- FunctionSelectItem: FunctionSelectItem$1,
2812
- FunctionSetInputValue: FunctionSetInputValue$1,
2813
- FunctionReset: FunctionReset$1
2814
- });
2815
-
2816
2859
  /* eslint-disable complexity */
2817
2860
 
2818
2861
  function downshiftUseComboboxReducer(state, action) {
@@ -2952,6 +2995,7 @@ function downshiftUseComboboxReducer(state, action) {
2952
2995
  };
2953
2996
  break;
2954
2997
 
2998
+ case ControlledPropUpdatedSelectedItem:
2955
2999
  case FunctionSetInputValue$1:
2956
3000
  changes = {
2957
3001
  inputValue: action.inputValue
@@ -3004,13 +3048,13 @@ function useCombobox(userProps) {
3004
3048
 
3005
3049
  var initialState = getInitialState$1(props); // Reducer init.
3006
3050
 
3007
- var _useEnhancedReducer = useEnhancedReducer(downshiftUseComboboxReducer, initialState, props),
3008
- _useEnhancedReducer$ = _useEnhancedReducer[0],
3009
- isOpen = _useEnhancedReducer$.isOpen,
3010
- highlightedIndex = _useEnhancedReducer$.highlightedIndex,
3011
- selectedItem = _useEnhancedReducer$.selectedItem,
3012
- inputValue = _useEnhancedReducer$.inputValue,
3013
- dispatch = _useEnhancedReducer[1];
3051
+ var _useControlledState = useControlledState$1(downshiftUseComboboxReducer, initialState, props),
3052
+ _useControlledState$ = _useControlledState[0],
3053
+ isOpen = _useControlledState$.isOpen,
3054
+ highlightedIndex = _useControlledState$.highlightedIndex,
3055
+ selectedItem = _useControlledState$.selectedItem,
3056
+ inputValue = _useControlledState$.inputValue,
3057
+ dispatch = _useControlledState[1];
3014
3058
  /* Refs */
3015
3059
 
3016
3060
 
@@ -3737,11 +3781,11 @@ function useMultipleSelection(userProps) {
3737
3781
  keyNavigationNext = props.keyNavigationNext,
3738
3782
  keyNavigationPrevious = props.keyNavigationPrevious; // Reducer init.
3739
3783
 
3740
- var _useEnhancedReducer = useEnhancedReducer(downshiftMultipleSelectionReducer, getInitialState$2(props), props),
3741
- _useEnhancedReducer$ = _useEnhancedReducer[0],
3742
- activeIndex = _useEnhancedReducer$.activeIndex,
3743
- selectedItems = _useEnhancedReducer$.selectedItems,
3744
- dispatch = _useEnhancedReducer[1]; // Refs.
3784
+ var _useControlledState = useControlledState(downshiftMultipleSelectionReducer, getInitialState$2(props), props),
3785
+ _useControlledState$ = _useControlledState[0],
3786
+ activeIndex = _useControlledState$.activeIndex,
3787
+ selectedItems = _useControlledState$.selectedItems,
3788
+ dispatch = _useControlledState[1]; // Refs.
3745
3789
 
3746
3790
 
3747
3791
  var isInitialMount = useRef(true);