diff --git a/.size-snapshot.json b/.size-snapshot.json index a12649472..d3a3ac9da 100644 --- a/.size-snapshot.json +++ b/.size-snapshot.json @@ -1,23 +1,23 @@ { "downshift.cjs.js": { - "bundled": 144818, - "minified": 65296, - "gzipped": 13968 + "bundled": 150116, + "minified": 68693, + "gzipped": 14157 }, "downshift.umd.min.js": { - "bundled": 159243, - "minified": 50766, - "gzipped": 13742 + "bundled": 154302, + "minified": 50662, + "gzipped": 13721 }, "downshift.umd.js": { - "bundled": 195949, - "minified": 67230, - "gzipped": 17332 + "bundled": 194804, + "minified": 68414, + "gzipped": 17744 }, "downshift.esm.js": { - "bundled": 143825, - "minified": 64379, - "gzipped": 13875, + "bundled": 145547, + "minified": 64783, + "gzipped": 13945, "treeshaked": { "rollup": { "code": 2275, diff --git a/dist/downshift.cjs.js b/dist/downshift.cjs.js new file mode 100644 index 000000000..4cb10f350 --- /dev/null +++ b/dist/downshift.cjs.js @@ -0,0 +1,3826 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var _objectWithoutPropertiesLoose = require('@babel/runtime/helpers/objectWithoutPropertiesLoose'); +var _extends = require('@babel/runtime/helpers/extends'); +var _assertThisInitialized = require('@babel/runtime/helpers/assertThisInitialized'); +var _inheritsLoose = require('@babel/runtime/helpers/inheritsLoose'); +var PropTypes = require('prop-types'); +var react = require('react'); +var reactIs = require('react-is'); +var computeScrollIntoView = require('compute-scroll-into-view'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var _objectWithoutPropertiesLoose__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutPropertiesLoose); +var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends); +var _assertThisInitialized__default = /*#__PURE__*/_interopDefaultLegacy(_assertThisInitialized); +var _inheritsLoose__default = /*#__PURE__*/_interopDefaultLegacy(_inheritsLoose); +var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); +var computeScrollIntoView__default = /*#__PURE__*/_interopDefaultLegacy(computeScrollIntoView); + +var idCounter = 0; + +/** + * Accepts a parameter and returns it if it's a function + * or a noop function if it's not. This allows us to + * accept a callback, but not worry about it if it's not + * passed. + * @param {Function} cb the callback + * @return {Function} a function + */ +function cbToCb(cb) { + return typeof cb === 'function' ? cb : noop; +} +function noop() {} + +/** + * Scroll node into view if necessary + * @param {HTMLElement} node the element that should scroll into view + * @param {HTMLElement} menuNode the menu element of the component + */ +function scrollIntoView(node, menuNode) { + if (!node) { + return; + } + var actions = computeScrollIntoView__default["default"](node, { + boundary: menuNode, + block: 'nearest', + scrollMode: 'if-needed' + }); + actions.forEach(function (_ref) { + var el = _ref.el, + top = _ref.top, + left = _ref.left; + el.scrollTop = top; + el.scrollLeft = left; + }); +} + +/** + * @param {HTMLElement} parent the parent node + * @param {HTMLElement} child the child node + * @return {Boolean} whether the parent is the child or the child is in the parent + */ +function isOrContainsNode(parent, child) { + return parent === child || parent.contains && parent.contains(child); +} + +/** + * Simple debounce implementation. Will call the given + * function once after the time given has passed since + * it was last called. + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + * @return {Function} the debounced function + */ +function debounce(fn, time) { + var timeoutId; + function cancel() { + if (timeoutId) { + clearTimeout(timeoutId); + } + } + function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + cancel(); + timeoutId = setTimeout(function () { + timeoutId = null; + fn.apply(void 0, args); + }, time); + } + wrapper.cancel = cancel; + return wrapper; +} + +/** + * This is intended to be used to compose event handlers. + * They are executed in order until one of them sets + * `event.preventDownshiftDefault = true`. + * @param {...Function} fns the event handler functions + * @return {Function} the event handler to add to an element + */ +function callAllEventHandlers() { + for (var _len2 = arguments.length, fns = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + fns[_key2] = arguments[_key2]; + } + return function (event) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return fns.some(function (fn) { + if (fn) { + fn.apply(void 0, [event].concat(args)); + } + return event.preventDownshiftDefault || event.hasOwnProperty('nativeEvent') && event.nativeEvent.preventDownshiftDefault; + }); + }; +} +function handleRefs() { + for (var _len4 = arguments.length, refs = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + refs[_key4] = arguments[_key4]; + } + return function (node) { + refs.forEach(function (ref) { + if (typeof ref === 'function') { + ref(node); + } else if (ref) { + ref.current = node; + } + }); + }; +} + +/** + * This generates a unique ID for an instance of Downshift + * @return {String} the unique ID + */ +function generateId() { + return String(idCounter++); +} + +/** + * Resets idCounter to 0. Used for SSR. + */ +function resetIdCounter() { + idCounter = 0; +} + +/** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ +function getA11yStatusMessage$1(_ref2) { + var isOpen = _ref2.isOpen, + resultCount = _ref2.resultCount, + previousResultCount = _ref2.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter key to select."; + } + return ''; +} + +/** + * Takes an argument and if it's an array, returns the first item in the array + * otherwise returns the argument + * @param {*} arg the maybe-array + * @param {*} defaultValue the value if arg is falsey not defined + * @return {*} the arg or it's first item + */ +function unwrapArray(arg, defaultValue) { + arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */arg[0] : arg; + if (!arg && defaultValue) { + return defaultValue; + } else { + return arg; + } +} + +/** + * @param {Object} element (P)react element + * @return {Boolean} whether it's a DOM element + */ +function isDOMElement(element) { + // then we assume this is react + return typeof element.type === 'string'; +} + +/** + * @param {Object} element (P)react element + * @return {Object} the props + */ +function getElementProps(element) { + return element.props; +} + +/** + * Throws a helpful error message for required properties. Useful + * to be used as a default in destructuring or object params. + * @param {String} fnName the function name + * @param {String} propName the prop name + */ +function requiredProp(fnName, propName) { + // eslint-disable-next-line no-console + console.error("The property \"" + propName + "\" is required in \"" + fnName + "\""); +} +var stateKeys = ['highlightedIndex', 'inputValue', 'isOpen', 'selectedItem', 'type']; +/** + * @param {Object} state the state object + * @return {Object} state that is relevant to downshift + */ +function pickState(state) { + if (state === void 0) { + state = {}; + } + var result = {}; + stateKeys.forEach(function (k) { + if (state.hasOwnProperty(k)) { + result[k] = state[k]; + } + }); + return result; +} + +/** + * This will perform a shallow merge of the given state object + * with the state coming from props + * (for the controlled component scenario) + * This is used in state updater functions so they're referencing + * the right state regardless of where it comes from. + * + * @param {Object} state The state of the component/hook. + * @param {Object} props The props that may contain controlled values. + * @returns {Object} The merged controlled state. + */ +function getState(state, props) { + return Object.keys(state).reduce(function (prevState, key) { + prevState[key] = isControlledProp(props, key) ? props[key] : state[key]; + return prevState; + }, {}); +} + +/** + * This determines whether a prop is a "controlled prop" meaning it is + * state which is controlled by the outside of this component rather + * than within this component. + * + * @param {Object} props The props that may contain controlled values. + * @param {String} key the key to check + * @return {Boolean} whether it is a controlled controlled prop + */ +function isControlledProp(props, key) { + return props[key] !== undefined; +} + +/** + * Normalizes the 'key' property of a KeyboardEvent in IE/Edge + * @param {Object} event a keyboardEvent object + * @return {String} keyboard key + */ +function normalizeArrowKey(event) { + var key = event.key, + keyCode = event.keyCode; + /* istanbul ignore next (ie) */ + if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) { + return "Arrow" + key; + } + return key; +} + +/** + * Simple check if the value passed is object literal + * @param {*} obj any things + * @return {Boolean} whether it's object literal + */ +function isPlainObject(obj) { + return Object.prototype.toString.call(obj) === '[object Object]'; +} + +/** + * Returns the new index in the list, in a circular way. If next value is out of bonds from the total, + * it will wrap to either 0 or itemCount - 1. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @returns {number} The new index after the move. + */ +function getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + if (circular === void 0) { + circular = true; + } + if (itemCount === 0) { + return -1; + } + var itemsLastIndex = itemCount - 1; + if (typeof baseIndex !== 'number' || baseIndex < 0 || baseIndex >= itemCount) { + baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1; + } + var newIndex = baseIndex + moveAmount; + if (newIndex < 0) { + newIndex = circular ? itemsLastIndex : 0; + } else if (newIndex > itemsLastIndex) { + newIndex = circular ? 0 : itemsLastIndex; + } + var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular); + return nonDisabledNewIndex === -1 ? baseIndex : nonDisabledNewIndex; +} + +/** + * Returns the next index in the list of an item that is not disabled. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @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. + */ +function getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + var currentElementNode = getItemNodeFromIndex(baseIndex); + if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) { + return baseIndex; + } + if (moveAmount > 0) { + for (var index = baseIndex + 1; index < itemCount; index++) { + if (!getItemNodeFromIndex(index).hasAttribute('disabled')) { + return index; + } + } + } else { + for (var _index = baseIndex - 1; _index >= 0; _index--) { + if (!getItemNodeFromIndex(_index).hasAttribute('disabled')) { + return _index; + } + } + } + if (circular) { + return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false); + } + return -1; +} + +/** + * Checks if event target is within the downshift elements. + * + * @param {EventTarget} target Target to check. + * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc). + * @param {Document} document The document. + * @param {boolean} checkActiveElement Whether to also check activeElement. + * + * @returns {boolean} Whether or not the target is within downshift elements. + */ +function targetWithinDownshift(target, downshiftElements, document, checkActiveElement) { + if (checkActiveElement === void 0) { + checkActiveElement = true; + } + return downshiftElements.some(function (contextNode) { + return contextNode && (isOrContainsNode(contextNode, target) || checkActiveElement && isOrContainsNode(contextNode, document.activeElement)); + }); +} +function validateControlledUnchanged(state, prevProps, nextProps) { + if (process.env.NODE_ENV === 'production') { + return; + } + var warningDescription = "This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props"; + Object.keys(state).forEach(function (propKey) { + if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the controlled prop \"" + propKey + "\" to be uncontrolled. " + warningDescription); + } else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the uncontrolled prop \"" + propKey + "\" to be controlled. " + warningDescription); + } + }); +} + +var cleanupStatus = debounce(function () { + getStatusDiv().textContent = ''; +}, 500); + +/** + * @param {String} status the status message + * @param {Object} documentProp document passed by the user. + */ +function setStatus(status, documentProp) { + var div = getStatusDiv(documentProp); + if (!status) { + return; + } + div.textContent = status; + cleanupStatus(); +} + +/** + * Get the status node or create it if it does not already exist. + * @param {Object} documentProp document passed by the user. + * @return {HTMLElement} the status node. + */ +function getStatusDiv(documentProp) { + if (documentProp === void 0) { + documentProp = document; + } + var statusDiv = documentProp.getElementById('a11y-status-message'); + if (statusDiv) { + return statusDiv; + } + statusDiv = documentProp.createElement('div'); + statusDiv.setAttribute('id', 'a11y-status-message'); + statusDiv.setAttribute('role', 'status'); + statusDiv.setAttribute('aria-live', 'polite'); + statusDiv.setAttribute('aria-relevant', 'additions text'); + Object.assign(statusDiv.style, { + border: '0', + clip: 'rect(0 0 0 0)', + height: '1px', + margin: '-1px', + overflow: 'hidden', + padding: '0', + position: 'absolute', + width: '1px' + }); + documentProp.body.appendChild(statusDiv); + return statusDiv; +} + +var unknown = process.env.NODE_ENV !== "production" ? '__autocomplete_unknown__' : 0; +var mouseUp = process.env.NODE_ENV !== "production" ? '__autocomplete_mouseup__' : 1; +var itemMouseEnter = process.env.NODE_ENV !== "production" ? '__autocomplete_item_mouseenter__' : 2; +var keyDownArrowUp = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_arrow_up__' : 3; +var keyDownArrowDown = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_arrow_down__' : 4; +var keyDownEscape = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_escape__' : 5; +var keyDownEnter = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_enter__' : 6; +var keyDownHome = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_home__' : 7; +var keyDownEnd = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_end__' : 8; +var clickItem = process.env.NODE_ENV !== "production" ? '__autocomplete_click_item__' : 9; +var blurInput = process.env.NODE_ENV !== "production" ? '__autocomplete_blur_input__' : 10; +var changeInput = process.env.NODE_ENV !== "production" ? '__autocomplete_change_input__' : 11; +var keyDownSpaceButton = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_space_button__' : 12; +var clickButton = process.env.NODE_ENV !== "production" ? '__autocomplete_click_button__' : 13; +var blurButton = process.env.NODE_ENV !== "production" ? '__autocomplete_blur_button__' : 14; +var controlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__autocomplete_controlled_prop_updated_selected_item__' : 15; +var touchEnd = process.env.NODE_ENV !== "production" ? '__autocomplete_touchend__' : 16; + +var stateChangeTypes$3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + unknown: unknown, + mouseUp: mouseUp, + itemMouseEnter: itemMouseEnter, + keyDownArrowUp: keyDownArrowUp, + keyDownArrowDown: keyDownArrowDown, + keyDownEscape: keyDownEscape, + keyDownEnter: keyDownEnter, + keyDownHome: keyDownHome, + keyDownEnd: keyDownEnd, + clickItem: clickItem, + blurInput: blurInput, + changeInput: changeInput, + keyDownSpaceButton: keyDownSpaceButton, + clickButton: clickButton, + blurButton: blurButton, + controlledPropUpdatedSelectedItem: controlledPropUpdatedSelectedItem, + touchEnd: touchEnd +}); + +var _excluded$4 = ["refKey", "ref"], + _excluded2$3 = ["onClick", "onPress", "onKeyDown", "onKeyUp", "onBlur"], + _excluded3$2 = ["onKeyDown", "onBlur", "onChange", "onInput", "onChangeText"], + _excluded4$1 = ["refKey", "ref"], + _excluded5$1 = ["onMouseMove", "onMouseDown", "onClick", "onPress", "index", "item"]; +var Downshift = /*#__PURE__*/function () { + var Downshift = /*#__PURE__*/function (_Component) { + _inheritsLoose__default["default"](Downshift, _Component); + function Downshift(_props) { + var _this = _Component.call(this, _props) || this; + // fancy destructuring + defaults + aliases + // this basically says each value of state should either be set to + // the initial value or the default value if the initial value is not provided + _this.id = _this.props.id || "downshift-" + generateId(); + _this.menuId = _this.props.menuId || _this.id + "-menu"; + _this.labelId = _this.props.labelId || _this.id + "-label"; + _this.inputId = _this.props.inputId || _this.id + "-input"; + _this.getItemId = _this.props.getItemId || function (index) { + return _this.id + "-item-" + index; + }; + _this.input = null; + _this.items = []; + // itemCount can be changed asynchronously + // from within downshift (so it can't come from a prop) + // this is why we store it as an instance and use + // getItemCount rather than just use items.length + // (to support windowing + async) + _this.itemCount = null; + _this.previousResultCount = 0; + _this.timeoutIds = []; + /** + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + */ + _this.internalSetTimeout = function (fn, time) { + var id = setTimeout(function () { + _this.timeoutIds = _this.timeoutIds.filter(function (i) { + return i !== id; + }); + fn(); + }, time); + _this.timeoutIds.push(id); + }; + _this.setItemCount = function (count) { + _this.itemCount = count; + }; + _this.unsetItemCount = function () { + _this.itemCount = null; + }; + _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) { + if (highlightedIndex === void 0) { + highlightedIndex = _this.props.defaultHighlightedIndex; + } + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends__default["default"]({ + highlightedIndex: highlightedIndex + }, otherStateToSet)); + }; + _this.clearSelection = function (cb) { + _this.internalSetState({ + selectedItem: null, + inputValue: '', + highlightedIndex: _this.props.defaultHighlightedIndex, + isOpen: _this.props.defaultIsOpen + }, cb); + }; + _this.selectItem = function (item, otherStateToSet, cb) { + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends__default["default"]({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + selectedItem: item, + inputValue: _this.props.itemToString(item) + }, otherStateToSet), cb); + }; + _this.selectItemAtIndex = function (itemIndex, otherStateToSet, cb) { + var item = _this.items[itemIndex]; + if (item == null) { + return; + } + _this.selectItem(item, otherStateToSet, cb); + }; + _this.selectHighlightedItem = function (otherStateToSet, cb) { + return _this.selectItemAtIndex(_this.getState().highlightedIndex, otherStateToSet, cb); + }; + // any piece of our state can live in two places: + // 1. Uncontrolled: it's internal (this.state) + // We will call this.setState to update that state + // 2. Controlled: it's external (this.props) + // We will call this.props.onStateChange to update that state + // + // In addition, we'll call this.props.onChange if the + // selectedItem is changed. + _this.internalSetState = function (stateToSet, cb) { + var isItemSelected, onChangeArg; + var onStateChangeArg = {}; + var isStateToSetFunction = typeof stateToSet === 'function'; + + // we want to call `onInputValueChange` before the `setState` call + // so someone controlling the `inputValue` state gets notified of + // the input change as soon as possible. This avoids issues with + // preserving the cursor position. + // See https://github.com/downshift-js/downshift/issues/217 for more info. + if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(stateToSet.inputValue, _extends__default["default"]({}, _this.getStateAndHelpers(), stateToSet)); + } + return _this.setState(function (state) { + state = _this.getState(state); + var newStateToSet = isStateToSetFunction ? stateToSet(state) : stateToSet; + + // Your own function that could modify the state that will be set. + newStateToSet = _this.props.stateReducer(state, newStateToSet); + + // checks if an item is selected, regardless of if it's different from + // what was selected before + // used to determine if onSelect and onChange callbacks should be called + isItemSelected = newStateToSet.hasOwnProperty('selectedItem'); + // this keeps track of the object we want to call with setState + var nextState = {}; + // we need to call on change if the outside world is controlling any of our state + // and we're trying to update that state. OR if the selection has changed and we're + // trying to update the selection + if (isItemSelected && newStateToSet.selectedItem !== state.selectedItem) { + onChangeArg = newStateToSet.selectedItem; + } + newStateToSet.type = newStateToSet.type || unknown; + Object.keys(newStateToSet).forEach(function (key) { + // onStateChangeArg should only have the state that is + // actually changing + if (state[key] !== newStateToSet[key]) { + onStateChangeArg[key] = newStateToSet[key]; + } + // the type is useful for the onStateChangeArg + // but we don't actually want to set it in internal state. + // this is an undocumented feature for now... Not all internalSetState + // calls support it and I'm not certain we want them to yet. + // But it enables users controlling the isOpen state to know when + // the isOpen state changes due to mouseup events which is quite handy. + if (key === 'type') { + return; + } + newStateToSet[key]; + // if it's coming from props, then we don't care to set it internally + if (!isControlledProp(_this.props, key)) { + nextState[key] = newStateToSet[key]; + } + }); + + // if stateToSet is a function, then we weren't able to call onInputValueChange + // earlier, so we'll call it now that we know what the inputValue state will be. + if (isStateToSetFunction && newStateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(newStateToSet.inputValue, _extends__default["default"]({}, _this.getStateAndHelpers(), newStateToSet)); + } + return nextState; + }, function () { + // call the provided callback if it's a function + cbToCb(cb)(); + + // only call the onStateChange and onChange callbacks if + // we have relevant information to pass them. + var hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1; + if (hasMoreStateThanType) { + _this.props.onStateChange(onStateChangeArg, _this.getStateAndHelpers()); + } + if (isItemSelected) { + _this.props.onSelect(stateToSet.selectedItem, _this.getStateAndHelpers()); + } + if (onChangeArg !== undefined) { + _this.props.onChange(onChangeArg, _this.getStateAndHelpers()); + } + // this is currently undocumented and therefore subject to change + // We'll try to not break it, but just be warned. + _this.props.onUserAction(onStateChangeArg, _this.getStateAndHelpers()); + }); + }; + //////////////////////////// ROOT + _this.rootRef = function (node) { + return _this._rootNode = node; + }; + _this.getRootProps = function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$4); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + // this is used in the render to know whether the user has called getRootProps. + // It uses that to know whether to apply the props automatically + _this.getRootProps.called = true; + _this.getRootProps.refKey = refKey; + _this.getRootProps.suppressRefError = suppressRefError; + var _this$getState = _this.getState(), + isOpen = _this$getState.isOpen; + 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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT + _this.keyDownHandlers = { + ArrowDown: function ArrowDown(event) { + var _this2 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? 5 : 1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowDown + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowDown + }, function () { + var itemCount = _this2.getItemCount(); + if (itemCount > 0) { + var _this2$getState = _this2.getState(), + highlightedIndex = _this2$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) { + return _this2.getItemNodeFromIndex(index); + }); + _this2.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowDown + }); + } + }); + } + }, + ArrowUp: function ArrowUp(event) { + var _this3 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? -5 : -1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowUp + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowUp + }, function () { + var itemCount = _this3.getItemCount(); + if (itemCount > 0) { + var _this3$getState = _this3.getState(), + highlightedIndex = _this3$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) { + return _this3.getItemNodeFromIndex(index); + }); + _this3.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowUp + }); + } + }); + } + }, + Enter: function Enter(event) { + if (event.which === 229) { + return; + } + var _this$getState2 = this.getState(), + isOpen = _this$getState2.isOpen, + highlightedIndex = _this$getState2.highlightedIndex; + if (isOpen && highlightedIndex != null) { + event.preventDefault(); + var item = this.items[highlightedIndex]; + var itemNode = this.getItemNodeFromIndex(highlightedIndex); + if (item == null || itemNode && itemNode.hasAttribute('disabled')) { + return; + } + this.selectHighlightedItem({ + type: keyDownEnter + }); + } + }, + Escape: function Escape(event) { + event.preventDefault(); + this.reset({ + type: keyDownEscape, + selectedItem: null, + inputValue: '' + }); + } + }; + //////////////////////////// BUTTON + _this.buttonKeyDownHandlers = _extends__default["default"]({}, _this.keyDownHandlers, { + ' ': function _(event) { + event.preventDefault(); + this.toggleMenu({ + type: keyDownSpaceButton + }); + } + }); + _this.inputKeyDownHandlers = _extends__default["default"]({}, _this.keyDownHandlers, { + Home: function Home(event) { + var _this4 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState3 = this.getState(), + isOpen = _this$getState3.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting downwards from 0 if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) { + return _this4.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownHome + }); + }, + End: function End(event) { + var _this5 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState4 = this.getState(), + isOpen = _this$getState4.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting upwards from last index if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) { + return _this5.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownEnd + }); + } + }); + _this.getToggleButtonProps = function (_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick; + _ref3.onPress; + var onKeyDown = _ref3.onKeyDown, + onKeyUp = _ref3.onKeyUp, + onBlur = _ref3.onBlur, + rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$3); + var _this$getState5 = _this.getState(), + isOpen = _this$getState5.isOpen; + var enabledEventHandlers = { + onClick: callAllEventHandlers(onClick, _this.buttonHandleClick), + onKeyDown: callAllEventHandlers(onKeyDown, _this.buttonHandleKeyDown), + onKeyUp: callAllEventHandlers(onKeyUp, _this.buttonHandleKeyUp), + onBlur: callAllEventHandlers(onBlur, _this.buttonHandleBlur) + }; + var eventHandlers = rest.disabled ? {} : enabledEventHandlers; + return _extends__default["default"]({ + type: 'button', + role: 'button', + 'aria-label': isOpen ? 'close menu' : 'open menu', + 'aria-haspopup': true, + 'data-toggle': true + }, eventHandlers, rest); + }; + _this.buttonHandleKeyUp = function (event) { + // Prevent click event from emitting in Firefox + event.preventDefault(); + }; + _this.buttonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (_this.buttonKeyDownHandlers[key]) { + _this.buttonKeyDownHandlers[key].call(_assertThisInitialized__default["default"](_this), event); + } + }; + _this.buttonHandleClick = function (event) { + event.preventDefault(); + // handle odd case for Safari and Firefox which + // don't give the button the focus properly. + /* istanbul ignore if (can't reasonably test this) */ + if (_this.props.environment.document.activeElement === _this.props.environment.document.body) { + event.target.focus(); + } + // to simplify testing components that use downshift, we'll not wrap this in a setTimeout + // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated + // when building for production and should therefore have no impact on production code. + if (process.env.NODE_ENV === 'test') { + _this.toggleMenu({ + type: clickButton + }); + } else { + // Ensure that toggle of menu occurs after the potential blur event in iOS + _this.internalSetTimeout(function () { + return _this.toggleMenu({ + type: clickButton + }); + }); + } + }; + _this.buttonHandleBlur = function (event) { + var blurTarget = event.target; // Save blur target for comparison with activeElement later + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element + _this.internalSetTimeout(function () { + if (!_this.isMouseDown && (_this.props.environment.document.activeElement == null || _this.props.environment.document.activeElement.id !== _this.inputId) && _this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS) + ) { + _this.reset({ + type: blurButton + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON + /////////////////////////////// LABEL + _this.getLabelProps = function (props) { + return _extends__default["default"]({ + htmlFor: _this.inputId, + id: _this.labelId + }, props); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL + /////////////////////////////// INPUT + _this.getInputProps = function (_temp4) { + var _ref4 = _temp4 === void 0 ? {} : _temp4, + onKeyDown = _ref4.onKeyDown, + onBlur = _ref4.onBlur, + onChange = _ref4.onChange, + onInput = _ref4.onInput; + _ref4.onChangeText; + var rest = _objectWithoutPropertiesLoose__default["default"](_ref4, _excluded3$2); + var onChangeKey; + var eventHandlers = {}; + + /* istanbul ignore next (preact) */ + + onChangeKey = 'onChange'; + var _this$getState6 = _this.getState(), + inputValue = _this$getState6.inputValue, + isOpen = _this$getState6.isOpen, + highlightedIndex = _this$getState6.highlightedIndex; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, _this.inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, _this.inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, _this.inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + return _extends__default["default"]({ + 'aria-autocomplete': 'list', + 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null, + 'aria-controls': isOpen ? _this.menuId : null, + 'aria-labelledby': _this.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: inputValue, + id: _this.inputId + }, eventHandlers, rest); + }; + _this.inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && _this.inputKeyDownHandlers[key]) { + _this.inputKeyDownHandlers[key].call(_assertThisInitialized__default["default"](_this), event); + } + }; + _this.inputHandleChange = function (event) { + _this.internalSetState({ + type: changeInput, + isOpen: true, + inputValue: event.target.value, + highlightedIndex: _this.props.defaultHighlightedIndex + }); + }; + _this.inputHandleBlur = function () { + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element + _this.internalSetTimeout(function () { + var downshiftButtonIsActive = _this.props.environment.document && !!_this.props.environment.document.activeElement && !!_this.props.environment.document.activeElement.dataset && _this.props.environment.document.activeElement.dataset.toggle && _this._rootNode && _this._rootNode.contains(_this.props.environment.document.activeElement); + if (!_this.isMouseDown && !downshiftButtonIsActive) { + _this.reset({ + type: blurInput + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT + /////////////////////////////// MENU + _this.menuRef = function (node) { + _this._menuNode = node; + }; + _this.getMenuProps = function (_temp5, _temp6) { + var _extends3; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + props = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded4$1); + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$suppressRefErro = _ref6.suppressRefError, + suppressRefError = _ref6$suppressRefErro === void 0 ? false : _ref6$suppressRefErro; + _this.getMenuProps.called = true; + _this.getMenuProps.refKey = refKey; + _this.getMenuProps.suppressRefError = suppressRefError; + 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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU + /////////////////////////////// ITEM + _this.getItemProps = function (_temp7) { + var _enabledEventHandlers; + var _ref7 = _temp7 === void 0 ? {} : _temp7, + onMouseMove = _ref7.onMouseMove, + onMouseDown = _ref7.onMouseDown, + onClick = _ref7.onClick; + _ref7.onPress; + var index = _ref7.index, + _ref7$item = _ref7.item, + item = _ref7$item === void 0 ? process.env.NODE_ENV === 'production' ? /* istanbul ignore next */undefined : requiredProp('getItemProps', 'item') : _ref7$item, + rest = _objectWithoutPropertiesLoose__default["default"](_ref7, _excluded5$1); + if (index === undefined) { + _this.items.push(item); + index = _this.items.indexOf(item); + } else { + _this.items[index] = item; + } + var onSelectKey = 'onClick'; + var customClickHandler = onClick; + var enabledEventHandlers = (_enabledEventHandlers = { + // onMouseMove is used over onMouseEnter here. onMouseMove + // is only triggered on actual mouse movement while onMouseEnter + // can fire on DOM changes, interrupting keyboard navigation + onMouseMove: callAllEventHandlers(onMouseMove, function () { + if (index === _this.getState().highlightedIndex) { + return; + } + _this.setHighlightedIndex(index, { + type: itemMouseEnter + }); + + // We never want to manually scroll when changing state based + // on `onMouseMove` because we will be moving the element out + // from under the user which is currently scrolling/moving the + // cursor + _this.avoidScrolling = true; + _this.internalSetTimeout(function () { + return _this.avoidScrolling = false; + }, 250); + }), + onMouseDown: callAllEventHandlers(onMouseDown, function (event) { + // This prevents the activeElement from being changed + // to the item so it can remain with the current activeElement + // which is a more common use case. + event.preventDefault(); + }) + }, _enabledEventHandlers[onSelectKey] = callAllEventHandlers(customClickHandler, function () { + _this.selectItemAtIndex(index, { + type: clickItem + }); + }), _enabledEventHandlers); + + // Passing down the onMouseDown handler to prevent redirect + // of the activeElement if clicking on disabled items + var eventHandlers = rest.disabled ? { + onMouseDown: enabledEventHandlers.onMouseDown + } : enabledEventHandlers; + return _extends__default["default"]({ + id: _this.getItemId(index), + role: 'option', + 'aria-selected': _this.getState().highlightedIndex === index + }, eventHandlers, rest); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM + _this.clearItems = function () { + _this.items = []; + }; + _this.reset = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref8) { + var selectedItem = _ref8.selectedItem; + return _extends__default["default"]({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + inputValue: _this.props.itemToString(selectedItem) + }, otherStateToSet); + }, cb); + }; + _this.toggleMenu = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref9) { + var isOpen = _ref9.isOpen; + return _extends__default["default"]({ + isOpen: !isOpen + }, isOpen && { + highlightedIndex: _this.props.defaultHighlightedIndex + }, otherStateToSet); + }, function () { + var _this$getState7 = _this.getState(), + isOpen = _this$getState7.isOpen, + highlightedIndex = _this$getState7.highlightedIndex; + if (isOpen) { + if (_this.getItemCount() > 0 && typeof highlightedIndex === 'number') { + _this.setHighlightedIndex(highlightedIndex, otherStateToSet); + } + } + cbToCb(cb)(); + }); + }; + _this.openMenu = function (cb) { + _this.internalSetState({ + isOpen: true + }, cb); + }; + _this.closeMenu = function (cb) { + _this.internalSetState({ + isOpen: false + }, cb); + }; + _this.updateStatus = debounce(function () { + var state = _this.getState(); + var item = _this.items[state.highlightedIndex]; + var resultCount = _this.getItemCount(); + var status = _this.props.getA11yStatusMessage(_extends__default["default"]({ + itemToString: _this.props.itemToString, + previousResultCount: _this.previousResultCount, + resultCount: resultCount, + highlightedItem: item + }, state)); + _this.previousResultCount = resultCount; + setStatus(status, _this.props.environment.document); + }, 200); + var _this$props = _this.props, + defaultHighlightedIndex = _this$props.defaultHighlightedIndex, + _this$props$initialHi = _this$props.initialHighlightedIndex, + _highlightedIndex = _this$props$initialHi === void 0 ? defaultHighlightedIndex : _this$props$initialHi, + defaultIsOpen = _this$props.defaultIsOpen, + _this$props$initialIs = _this$props.initialIsOpen, + _isOpen = _this$props$initialIs === void 0 ? defaultIsOpen : _this$props$initialIs, + _this$props$initialIn = _this$props.initialInputValue, + _inputValue = _this$props$initialIn === void 0 ? '' : _this$props$initialIn, + _this$props$initialSe = _this$props.initialSelectedItem, + _selectedItem = _this$props$initialSe === void 0 ? null : _this$props$initialSe; + var _state = _this.getState({ + highlightedIndex: _highlightedIndex, + isOpen: _isOpen, + inputValue: _inputValue, + selectedItem: _selectedItem + }); + if (_state.selectedItem != null && _this.props.initialInputValue === undefined) { + _state.inputValue = _this.props.itemToString(_state.selectedItem); + } + _this.state = _state; + return _this; + } + var _proto = Downshift.prototype; + /** + * Clear all running timeouts + */ + _proto.internalClearTimeouts = function internalClearTimeouts() { + this.timeoutIds.forEach(function (id) { + clearTimeout(id); + }); + this.timeoutIds = []; + } + + /** + * Gets the state based on internal state or props + * If a state value is passed via props, then that + * is the value given, otherwise it's retrieved from + * stateToMerge + * + * @param {Object} stateToMerge defaults to this.state + * @return {Object} the state + */; + _proto.getState = function getState$1(stateToMerge) { + if (stateToMerge === void 0) { + stateToMerge = this.state; + } + return getState(stateToMerge, this.props); + }; + _proto.getItemCount = function getItemCount() { + // things read better this way. They're in priority order: + // 1. `this.itemCount` + // 2. `this.props.itemCount` + // 3. `this.items.length` + var itemCount = this.items.length; + if (this.itemCount != null) { + itemCount = this.itemCount; + } else if (this.props.itemCount !== undefined) { + itemCount = this.props.itemCount; + } + return itemCount; + }; + _proto.getItemNodeFromIndex = function getItemNodeFromIndex(index) { + return this.props.environment.document.getElementById(this.getItemId(index)); + }; + _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() { + /* istanbul ignore else (react-native) */ + + var node = this.getItemNodeFromIndex(this.getState().highlightedIndex); + this.props.scrollIntoView(node, this._menuNode); + }; + _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) { + var _this6 = this; + var itemCount = this.getItemCount(); + var _this$getState8 = this.getState(), + highlightedIndex = _this$getState8.highlightedIndex; + if (itemCount > 0) { + var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) { + return _this6.getItemNodeFromIndex(index); + }); + this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet); + } + }; + _proto.getStateAndHelpers = function getStateAndHelpers() { + var _this$getState9 = this.getState(), + highlightedIndex = _this$getState9.highlightedIndex, + inputValue = _this$getState9.inputValue, + selectedItem = _this$getState9.selectedItem, + isOpen = _this$getState9.isOpen; + var itemToString = this.props.itemToString; + var id = this.id; + var getRootProps = this.getRootProps, + getToggleButtonProps = this.getToggleButtonProps, + getLabelProps = this.getLabelProps, + getMenuProps = this.getMenuProps, + getInputProps = this.getInputProps, + getItemProps = this.getItemProps, + openMenu = this.openMenu, + closeMenu = this.closeMenu, + toggleMenu = this.toggleMenu, + selectItem = this.selectItem, + selectItemAtIndex = this.selectItemAtIndex, + selectHighlightedItem = this.selectHighlightedItem, + setHighlightedIndex = this.setHighlightedIndex, + clearSelection = this.clearSelection, + clearItems = this.clearItems, + reset = this.reset, + setItemCount = this.setItemCount, + unsetItemCount = this.unsetItemCount, + setState = this.internalSetState; + return { + // prop getters + getRootProps: getRootProps, + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getItemProps: getItemProps, + // actions + reset: reset, + openMenu: openMenu, + closeMenu: closeMenu, + toggleMenu: toggleMenu, + selectItem: selectItem, + selectItemAtIndex: selectItemAtIndex, + selectHighlightedItem: selectHighlightedItem, + setHighlightedIndex: setHighlightedIndex, + clearSelection: clearSelection, + clearItems: clearItems, + setItemCount: setItemCount, + unsetItemCount: unsetItemCount, + setState: setState, + // props + itemToString: itemToString, + // derived + id: id, + // state + highlightedIndex: highlightedIndex, + inputValue: inputValue, + isOpen: isOpen, + selectedItem: selectedItem + }; + }; + _proto.componentDidMount = function componentDidMount() { + var _this7 = this; + /* istanbul ignore if (react-native) */ + if (process.env.NODE_ENV !== 'production' && !false && this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + + /* istanbul ignore if (react-native) */ + + // this.isMouseDown helps us track whether the mouse is currently held down. + // This is useful when the user clicks on an item in the list, but holds the mouse + // down long enough for the list to disappear (because the blur event fires on the input) + // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should + // trigger hiding the menu. + var onMouseDown = function () { + _this7.isMouseDown = true; + }; + var onMouseUp = function (event) { + _this7.isMouseDown = false; + // if the target element or the activeElement is within a downshift node + // then we don't want to reset downshift + var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment.document); + if (!contextWithinDownshift && _this7.getState().isOpen) { + _this7.reset({ + type: mouseUp + }, function () { + return _this7.props.onOuterClick(_this7.getStateAndHelpers()); + }); + } + }; + // Touching an element in iOS gives focus and hover states, but touching out of + // the element will remove hover, and persist the focus state, resulting in the + // blur event not being triggered. + // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen. + // If the user taps outside of Downshift, the component should be reset, + // but not if the user is swiping + var onTouchStart = function () { + _this7.isTouchMove = false; + }; + var onTouchMove = function () { + _this7.isTouchMove = true; + }; + var onTouchEnd = function (event) { + var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment.document, false); + if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) { + _this7.reset({ + type: touchEnd + }, function () { + return _this7.props.onOuterClick(_this7.getStateAndHelpers()); + }); + } + }; + var environment = this.props.environment; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + this.cleanup = function () { + _this7.internalClearTimeouts(); + _this7.updateStatus.cancel(); + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + }; + _proto.shouldScroll = function shouldScroll(prevState, prevProps) { + var _ref10 = this.props.highlightedIndex === undefined ? this.getState() : this.props, + currentHighlightedIndex = _ref10.highlightedIndex; + var _ref11 = prevProps.highlightedIndex === undefined ? prevState : prevProps, + prevHighlightedIndex = _ref11.highlightedIndex; + var scrollWhenOpen = currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen; + return scrollWhenOpen || currentHighlightedIndex !== prevHighlightedIndex; + }; + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + if (process.env.NODE_ENV !== 'production') { + validateControlledUnchanged(this.state, prevProps, this.props); + /* istanbul ignore if (react-native) */ + if (this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + } + if (isControlledProp(this.props, 'selectedItem') && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) { + this.internalSetState({ + type: controlledPropUpdatedSelectedItem, + inputValue: this.props.itemToString(this.props.selectedItem) + }); + } + if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) { + this.scrollHighlightedItemIntoView(); + } + + /* istanbul ignore else (react-native) */ + + this.updateStatus(); + }; + _proto.componentWillUnmount = function componentWillUnmount() { + this.cleanup(); // avoids memory leak + }; + _proto.render = function render() { + var children = unwrapArray(this.props.children, noop); + // because the items are rerendered every time we call the children + // we clear this out each render and it will be populated again as + // getItemProps is called. + this.clearItems(); + // we reset this so we know whether the user calls getRootProps during + // this render. If they do then we don't need to do anything, + // if they don't then we need to clone the element they return and + // apply the props for them. + this.getRootProps.called = false; + this.getRootProps.refKey = undefined; + this.getRootProps.suppressRefError = undefined; + // we do something similar for getMenuProps + this.getMenuProps.called = false; + this.getMenuProps.refKey = undefined; + this.getMenuProps.suppressRefError = undefined; + // we do something similar for getLabelProps + this.getLabelProps.called = false; + // and something similar for getInputProps + this.getInputProps.called = false; + var element = unwrapArray(children(this.getStateAndHelpers())); + if (!element) { + return null; + } + if (this.getRootProps.called || this.props.suppressRefError) { + if (process.env.NODE_ENV !== 'production' && !this.getRootProps.suppressRefError && !this.props.suppressRefError) { + validateGetRootPropsCalledCorrectly(element, this.getRootProps); + } + return element; + } else if (isDOMElement(element)) { + // they didn't apply the root props, but we can clone + // this and apply the props ourselves + return /*#__PURE__*/react.cloneElement(element, this.getRootProps(getElementProps(element))); + } + + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + // they didn't apply the root props, but they need to + // otherwise we can't query around the autocomplete + + throw new Error('downshift: If you return a non-DOM element, you must apply the getRootProps function'); + } + + /* istanbul ignore next */ + return undefined; + }; + return Downshift; + }(react.Component); + Downshift.defaultProps = { + defaultHighlightedIndex: null, + defaultIsOpen: false, + getA11yStatusMessage: getA11yStatusMessage$1, + itemToString: function itemToString(i) { + if (i == null) { + return ''; + } + if (process.env.NODE_ENV !== 'production' && isPlainObject(i) && !i.hasOwnProperty('toString')) { + // eslint-disable-next-line no-console + console.warn('downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.', 'The object that was passed:', i); + } + return String(i); + }, + onStateChange: noop, + onInputValueChange: noop, + onUserAction: noop, + onChange: noop, + onSelect: noop, + onOuterClick: noop, + selectedItemChanged: function selectedItemChanged(prevItem, item) { + return prevItem !== item; + }, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window, + stateReducer: function stateReducer(state, stateToSet) { + return stateToSet; + }, + suppressRefError: false, + scrollIntoView: scrollIntoView + }; + Downshift.stateChangeTypes = stateChangeTypes$3; + return Downshift; +}(); +process.env.NODE_ENV !== "production" ? Downshift.propTypes = { + children: PropTypes__default["default"].func, + defaultHighlightedIndex: PropTypes__default["default"].number, + defaultIsOpen: PropTypes__default["default"].bool, + initialHighlightedIndex: PropTypes__default["default"].number, + initialSelectedItem: PropTypes__default["default"].any, + initialInputValue: PropTypes__default["default"].string, + initialIsOpen: PropTypes__default["default"].bool, + getA11yStatusMessage: PropTypes__default["default"].func, + itemToString: PropTypes__default["default"].func, + onChange: PropTypes__default["default"].func, + onSelect: PropTypes__default["default"].func, + onStateChange: PropTypes__default["default"].func, + onInputValueChange: PropTypes__default["default"].func, + onUserAction: PropTypes__default["default"].func, + onOuterClick: PropTypes__default["default"].func, + selectedItemChanged: PropTypes__default["default"].func, + stateReducer: PropTypes__default["default"].func, + itemCount: PropTypes__default["default"].number, + id: PropTypes__default["default"].string, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }), + suppressRefError: PropTypes__default["default"].bool, + scrollIntoView: PropTypes__default["default"].func, + // things we keep in state for uncontrolled components + // but can accept as props for controlled components + /* eslint-disable react/no-unused-prop-types */ + selectedItem: PropTypes__default["default"].any, + isOpen: PropTypes__default["default"].bool, + inputValue: PropTypes__default["default"].string, + highlightedIndex: PropTypes__default["default"].number, + labelId: PropTypes__default["default"].string, + inputId: PropTypes__default["default"].string, + menuId: PropTypes__default["default"].string, + getItemId: PropTypes__default["default"].func + /* eslint-enable react/no-unused-prop-types */ +} : void 0; +var Downshift$1 = Downshift; +function validateGetMenuPropsCalledCorrectly(node, _ref12) { + var refKey = _ref12.refKey; + if (!node) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from getMenuProps was not applied correctly on your menu element."); + } +} +function validateGetRootPropsCalledCorrectly(element, _ref13) { + var refKey = _ref13.refKey; + var refKeySpecified = refKey !== 'ref'; + var isComposite = !isDOMElement(element); + if (isComposite && !refKeySpecified && !reactIs.isForwardRef(element)) { + // eslint-disable-next-line no-console + console.error('downshift: You returned a non-DOM element. You must specify a refKey in getRootProps'); + } else if (!isComposite && refKeySpecified) { + // eslint-disable-next-line no-console + console.error("downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \"" + refKey + "\""); + } + if (!reactIs.isForwardRef(element) && !getElementProps(element)[refKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You must apply the ref prop \"" + refKey + "\" from getRootProps onto your root element."); + } +} + +var dropdownDefaultStateValues = { + highlightedIndex: -1, + isOpen: false, + selectedItem: null, + inputValue: '' +}; +function callOnChangeProps(action, state, newState) { + var props = action.props, + type = action.type; + var changes = {}; + Object.keys(state).forEach(function (key) { + invokeOnChangeHandler(key, props, state, newState); + if (newState[key] !== state[key]) { + changes[key] = newState[key]; + } + }); + if (props.onStateChange && Object.keys(changes).length) { + props.onStateChange(_extends__default["default"]({ + type: type + }, changes)); + } +} +function invokeOnChangeHandler(key, props, state, newState) { + var handler = "on" + capitalizeString(key) + "Change"; + if (props[handler] && newState[key] !== undefined && newState[key] !== state[key]) { + props[handler](newState); + } +} + +/** + * Default state reducer that returns the changes. + * + * @param {Object} s state. + * @param {Object} a action with changes. + * @returns {Object} changes. + */ +function stateReducer(s, a) { + return a.changes; +} + +/** + * Returns a message to be added to aria-live region when item is selected. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ +function getA11ySelectionMessage(selectionParameters) { + var selectedItem = selectionParameters.selectedItem, + itemToStringLocal = selectionParameters.itemToString; + return selectedItem ? itemToStringLocal(selectedItem) + " has been selected." : ''; +} + +/** + * Debounced call for updating the a11y message. + */ +var updateA11yStatus = debounce(function (getA11yMessage, document) { + setStatus(getA11yMessage(), document); +}, 200); +function getElementIds$1(_ref) { + var id = _ref.id, + labelId = _ref.labelId, + menuId = _ref.menuId, + getItemId = _ref.getItemId, + toggleButtonId = _ref.toggleButtonId; + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return { + labelId: labelId || uniqueId + "-label", + menuId: menuId || uniqueId + "-menu", + getItemId: getItemId || function (index) { + return uniqueId + "-item-" + index; + }, + toggleButtonId: toggleButtonId || uniqueId + "-toggle-button" + }; +} +function getItemIndex(index, item, items) { + if (index !== undefined) { + return index; + } + if (items.length === 0) { + return -1; + } + return items.indexOf(item); +} +function itemToString(item) { + return item ? String(item) : ''; +} +function getPropTypesValidator(caller, propTypes) { + // istanbul ignore next + return function (options) { + if (options === void 0) { + options = {}; + } + Object.keys(propTypes).forEach(function (key) { + PropTypes__default["default"].checkPropTypes(propTypes, options, key, caller.name); + }); + }; +} +function isAcceptedCharacterKey(key) { + return /^\S{1}$/.test(key); +} +function capitalizeString(string) { + return "" + string.slice(0, 1).toUpperCase() + string.slice(1); +} +function useLatestRef(val) { + var ref = react.useRef(val); + // technically this is not "concurrent mode safe" because we're manipulating + // the value during render (so it's not idempotent). However, the places this + // hook is used is to support memoizing callbacks which will be called + // *during* render, so we need the latest values *during* render. + // If not for this, then we'd probably want to use useLayoutEffect instead. + ref.current = val; + return ref; +} + +/** + * Computes the controlled state using a the previous state, props, + * two reducers, one from downshift and an optional one from the user. + * Also calls the onChange handlers for state values that have changed. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useEnhancedReducer(reducer, initialState, props, isStateEqual) { + var prevStateRef = react.useRef(); + var actionRef = react.useRef(); + var enhancedReducer = react.useCallback(function (state, action) { + actionRef.current = action; + state = getState(state, action.props); + var changes = reducer(state, action); + var newState = action.props.stateReducer(state, _extends__default["default"]({}, action, { + changes: changes + })); + return newState; + }, [reducer]); + var _useReducer = react.useReducer(enhancedReducer, initialState), + state = _useReducer[0], + dispatch = _useReducer[1]; + var propsRef = useLatestRef(props); + var dispatchWithProps = react.useCallback(function (action) { + return dispatch(_extends__default["default"]({ + props: propsRef.current + }, action)); + }, [propsRef]); + var action = actionRef.current; + react.useEffect(function () { + var shouldCallOnChangeProps = action && prevStateRef.current && !isStateEqual(prevStateRef.current, state); + if (shouldCallOnChangeProps) { + callOnChangeProps(action, getState(prevStateRef.current, action.props), state); + } + prevStateRef.current = state; + }, [state, action, isStateEqual]); + return [state, dispatchWithProps]; +} + +/** + * Wraps the useEnhancedReducer and applies the controlled prop values before + * returning the new state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useControlledReducer$1(reducer, initialState, props, isStateEqual) { + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props, isStateEqual), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + return [getState(state, props), dispatch]; +} +var defaultProps$3 = { + itemToString: itemToString, + stateReducer: stateReducer, + getA11ySelectionMessage: getA11ySelectionMessage, + scrollIntoView: scrollIntoView, + circularNavigation: false, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window +}; +function getDefaultValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + var defaultPropKey = "default" + capitalizeString(propKey); + if (defaultPropKey in props) { + return props[defaultPropKey]; + } + return defaultStateValues[propKey]; +} +function getInitialValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + if (propKey in props) { + return props[propKey]; + } + var initialPropKey = "initial" + capitalizeString(propKey); + if (initialPropKey in props) { + return props[initialPropKey]; + } + return getDefaultValue$1(props, propKey, defaultStateValues); +} +function getInitialState$2(props) { + var selectedItem = getInitialValue$1(props, 'selectedItem'); + var isOpen = getInitialValue$1(props, 'isOpen'); + var highlightedIndex = getInitialValue$1(props, 'highlightedIndex'); + var inputValue = getInitialValue$1(props, 'inputValue'); + return { + highlightedIndex: highlightedIndex < 0 && selectedItem ? props.items.indexOf(selectedItem) : highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} +function getHighlightedIndexOnOpen(props, state, offset, getItemNodeFromIndex) { + var items = props.items, + initialHighlightedIndex = props.initialHighlightedIndex, + defaultHighlightedIndex = props.defaultHighlightedIndex; + var selectedItem = state.selectedItem, + highlightedIndex = state.highlightedIndex; + if (items.length === 0) { + return -1; + } + + // initialHighlightedIndex will give value to highlightedIndex on initial state only. + if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex) { + return initialHighlightedIndex; + } + if (defaultHighlightedIndex !== undefined) { + return defaultHighlightedIndex; + } + if (selectedItem) { + if (offset === 0) { + return items.indexOf(selectedItem); + } + return getNextWrappingIndex(offset, items.indexOf(selectedItem), items.length, getItemNodeFromIndex, false); + } + if (offset === 0) { + return -1; + } + return offset < 0 ? items.length - 1 : 0; +} + +/** + * Reuse the movement tracking of mouse and touch events. + * + * @param {boolean} isOpen Whether the dropdown is open or not. + * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.) + * @param {Object} environment Environment where component/hook exists. + * @param {Function} handleBlur Handler on blur from mouse or touch. + * @returns {Object} Ref containing whether mouseDown or touchMove event is happening + */ +function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) { + var mouseAndTouchTrackersRef = react.useRef({ + isMouseDown: false, + isTouchMove: false + }); + react.useEffect(function () { + // The same strategy for checking if a click occurred inside or outside downsift + // as in downshift.js. + var onMouseDown = function () { + mouseAndTouchTrackersRef.current.isMouseDown = true; + }; + var onMouseUp = function (event) { + mouseAndTouchTrackersRef.current.isMouseDown = false; + if (isOpen && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document)) { + handleBlur(); + } + }; + var onTouchStart = function () { + mouseAndTouchTrackersRef.current.isTouchMove = false; + }; + var onTouchMove = function () { + mouseAndTouchTrackersRef.current.isTouchMove = true; + }; + var onTouchEnd = function (event) { + if (isOpen && !mouseAndTouchTrackersRef.current.isTouchMove && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document, false)) { + handleBlur(); + } + }; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + return function () { + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, environment]); + return mouseAndTouchTrackersRef; +} + +/** + * Custom hook that checks if getter props are called correctly. + * + * @param {...any} propKeys Getter prop names to be handled. + * @returns {Function} Setter function called inside getter props to set call information. + */ +function useGetterPropsCalledChecker() { + for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) { + propKeys[_key] = arguments[_key]; + } + var getterPropsCalledRef = react.useRef(propKeys.reduce(function (acc, propKey) { + acc[propKey] = {}; + return acc; + }, {})); + if (process.env.NODE_ENV !== 'production') { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + getterPropsCalledRef.current[propKey] = null; + }); + } + react.useEffect(function () { + if (process.env.NODE_ENV !== 'production') { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + if (!getterPropsCalledRef.current[propKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You forgot to call the " + propKey + " getter function on your component / element."); + return; + } + var _getterPropsCalledRef = getterPropsCalledRef.current[propKey], + suppressRefError = _getterPropsCalledRef.suppressRefError, + refKey = _getterPropsCalledRef.refKey, + elementRef = _getterPropsCalledRef.elementRef; + if ((!elementRef || !elementRef.current) && !suppressRefError) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from " + propKey + " was not applied correctly on your element."); + } + }); + } + }); + var setGetterPropCallInfo = react.useCallback(function (propKey, suppressRefError, refKey, elementRef) { + if (process.env.NODE_ENV !== 'production') { + getterPropsCalledRef.current[propKey] = { + suppressRefError: suppressRefError, + refKey: refKey, + elementRef: elementRef + }; + } + }, []); + return setGetterPropCallInfo; +} + +/** + * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item. + * Used by useSelect and useCombobox. + * + * @param {Object} prevState + * @param {Object} newState + * @returns {boolean} Wheather the states are deeply equal. + */ +function isDropdownsStateEqual(prevState, newState) { + return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem; +} + +function getItemIndexByCharacterKey(keysSoFar, highlightedIndex, items, itemToStringParam, getItemNodeFromIndex) { + var lowerCasedItemStrings = items.map(function (item) { + return itemToStringParam(item).toLowerCase(); + }); + var lowerCasedKeysSoFar = keysSoFar.toLowerCase(); + var isValid = function (itemString, index) { + var element = getItemNodeFromIndex(index); + return itemString.startsWith(lowerCasedKeysSoFar) && !(element && element.hasAttribute('disabled')); + }; + for (var index = highlightedIndex + 1; index < lowerCasedItemStrings.length; index++) { + var itemString = lowerCasedItemStrings[index]; + if (isValid(itemString, index)) { + return index; + } + } + for (var _index = 0; _index < highlightedIndex; _index++) { + var _itemString = lowerCasedItemStrings[_index]; + if (isValid(_itemString, _index)) { + return _index; + } + } + return highlightedIndex; +} +var propTypes$1 = { + items: PropTypes__default["default"].array.isRequired, + itemToString: PropTypes__default["default"].func, + getA11yStatusMessage: PropTypes__default["default"].func, + getA11ySelectionMessage: PropTypes__default["default"].func, + circularNavigation: PropTypes__default["default"].bool, + highlightedIndex: PropTypes__default["default"].number, + defaultHighlightedIndex: PropTypes__default["default"].number, + initialHighlightedIndex: PropTypes__default["default"].number, + isOpen: PropTypes__default["default"].bool, + defaultIsOpen: PropTypes__default["default"].bool, + initialIsOpen: PropTypes__default["default"].bool, + selectedItem: PropTypes__default["default"].any, + initialSelectedItem: PropTypes__default["default"].any, + defaultSelectedItem: PropTypes__default["default"].any, + id: PropTypes__default["default"].string, + labelId: PropTypes__default["default"].string, + menuId: PropTypes__default["default"].string, + getItemId: PropTypes__default["default"].func, + toggleButtonId: PropTypes__default["default"].string, + stateReducer: PropTypes__default["default"].func, + onSelectedItemChange: PropTypes__default["default"].func, + onHighlightedIndexChange: PropTypes__default["default"].func, + onStateChange: PropTypes__default["default"].func, + onIsOpenChange: PropTypes__default["default"].func, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }) +}; + +/** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ +function getA11yStatusMessage(_ref) { + var isOpen = _ref.isOpen, + resultCount = _ref.resultCount, + previousResultCount = _ref.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select."; + } + return ''; +} +var defaultProps$2 = _extends__default["default"]({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage +}); + +var MenuKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__menu_keydown_arrow_down__' : 0; +var MenuKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__menu_keydown_arrow_up__' : 1; +var MenuKeyDownEscape = process.env.NODE_ENV !== "production" ? '__menu_keydown_escape__' : 2; +var MenuKeyDownHome = process.env.NODE_ENV !== "production" ? '__menu_keydown_home__' : 3; +var MenuKeyDownEnd = process.env.NODE_ENV !== "production" ? '__menu_keydown_end__' : 4; +var MenuKeyDownEnter = process.env.NODE_ENV !== "production" ? '__menu_keydown_enter__' : 5; +var MenuKeyDownSpaceButton = process.env.NODE_ENV !== "production" ? '__menu_keydown_space_button__' : 6; +var MenuKeyDownCharacter = process.env.NODE_ENV !== "production" ? '__menu_keydown_character__' : 7; +var MenuBlur = process.env.NODE_ENV !== "production" ? '__menu_blur__' : 8; +var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 9; +var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 10; +var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 11; +var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 12; +var ToggleButtonKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_arrow_down__' : 13; +var ToggleButtonKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_arrow_up__' : 14; +var ToggleButtonKeyDownCharacter = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_character__' : 15; +var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 16; +var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 17; +var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 18; +var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 19; +var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 20; +var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 21; +var FunctionReset$2 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 22; + +var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + MenuKeyDownArrowDown: MenuKeyDownArrowDown, + MenuKeyDownArrowUp: MenuKeyDownArrowUp, + MenuKeyDownEscape: MenuKeyDownEscape, + MenuKeyDownHome: MenuKeyDownHome, + MenuKeyDownEnd: MenuKeyDownEnd, + MenuKeyDownEnter: MenuKeyDownEnter, + MenuKeyDownSpaceButton: MenuKeyDownSpaceButton, + MenuKeyDownCharacter: MenuKeyDownCharacter, + MenuBlur: MenuBlur, + MenuMouseLeave: MenuMouseLeave$1, + ItemMouseMove: ItemMouseMove$1, + ItemClick: ItemClick$1, + ToggleButtonClick: ToggleButtonClick$1, + ToggleButtonKeyDownArrowDown: ToggleButtonKeyDownArrowDown, + ToggleButtonKeyDownArrowUp: ToggleButtonKeyDownArrowUp, + ToggleButtonKeyDownCharacter: ToggleButtonKeyDownCharacter, + FunctionToggleMenu: FunctionToggleMenu$1, + FunctionOpenMenu: FunctionOpenMenu$1, + FunctionCloseMenu: FunctionCloseMenu$1, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1, + FunctionSelectItem: FunctionSelectItem$1, + FunctionSetInputValue: FunctionSetInputValue$1, + FunctionReset: FunctionReset$2 +}); + +/* eslint-disable complexity */ +function downshiftSelectReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove$1: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick$1: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index] + }; + break; + case ToggleButtonKeyDownCharacter: + { + var lowercasedKey = action.key; + var inputValue = "" + state.inputValue + lowercasedKey; + var itemIndex = getItemIndexByCharacterKey(inputValue, state.selectedItem ? props.items.indexOf(state.selectedItem) : -1, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends__default["default"]({ + inputValue: inputValue + }, itemIndex >= 0 && { + selectedItem: props.items[itemIndex] + }); + } + break; + case ToggleButtonKeyDownArrowDown: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case ToggleButtonKeyDownArrowUp: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case MenuKeyDownEnter: + case MenuKeyDownSpaceButton: + changes = _extends__default["default"]({ + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex') + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex] + }); + break; + case MenuKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEscape: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuBlur: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuKeyDownCharacter: + { + var _lowercasedKey = action.key; + var _inputValue = "" + state.inputValue + _lowercasedKey; + var highlightedIndex = getItemIndexByCharacterKey(_inputValue, state.highlightedIndex, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends__default["default"]({ + inputValue: _inputValue + }, highlightedIndex >= 0 && { + highlightedIndex: highlightedIndex + }); + } + break; + case MenuKeyDownArrowDown: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuKeyDownArrowUp: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuMouseLeave$1: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick$1: + case FunctionToggleMenu$1: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu$1: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu$1: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex$1: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem$1: + changes = { + selectedItem: action.selectedItem + }; + break; + case FunctionSetInputValue$1: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$2: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends__default["default"]({}, state, changes); +} +/* eslint-enable complexity */ + +var _excluded$3 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"], + _excluded2$2 = ["onClick", "onKeyDown", "refKey", "ref"], + _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "refKey", "ref"]; +var validatePropTypes$1 = process.env.NODE_ENV === 'production' ? /* istanbul ignore next */null : getPropTypesValidator(useSelect, propTypes$1); +useSelect.stateChangeTypes = stateChangeTypes$2; +function useSelect(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + validatePropTypes$1(userProps); + } + // Props defaults and destructuring. + var props = _extends__default["default"]({}, defaultProps$2, userProps); + var items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + itemToString = props.itemToString, + getA11ySelectionMessage = props.getA11ySelectionMessage, + getA11yStatusMessage = props.getA11yStatusMessage; + // Initial state depending on controlled props. + var initialState = getInitialState$2(props); + var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, initialState, props, isDropdownsStateEqual), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element efs. + var toggleButtonRef = react.useRef(null); + var menuRef = react.useRef(null); + var itemRefs = react.useRef(); + itemRefs.current = {}; + // used not to scroll when highlight by mouse. + var shouldScrollRef = react.useRef(true); + // used not to trigger menu blur action in some scenarios. + var shouldBlurRef = react.useRef(true); + // used to keep the inputValue clearTimeout object between renders. + var clearTimeoutRef = react.useRef(null); + // prevent id re-generation between renders. + var elementIdsRef = react.useRef(getElementIds$1(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = react.useRef(); + var isInitialMountRef = react.useRef(true); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + + // Some utils. + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Sets cleanup for the keysSoFar after 500ms. + react.useEffect(function () { + // init the clean function here as we need access to dispatch. + if (isInitialMountRef.current) { + clearTimeoutRef.current = debounce(function (outerDispatch) { + outerDispatch({ + type: FunctionSetInputValue$1, + inputValue: '' + }); + }, 500); + } + if (!inputValue) { + return; + } + clearTimeoutRef.current(dispatch); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inputValue]); + /* Controls the focus on the menu or the toggle button. */ + react.useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus menu on open. + if (isOpen) { + // istanbul ignore else + if (menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus toggleButton on close, but not if it was closed with (Shift+)Tab. + if (environment.document.activeElement === menuRef.current) { + // istanbul ignore else + if (toggleButtonRef.current) { + shouldBlurRef.current = false; + toggleButtonRef.current.focus(); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + // Scroll on highlighted item if change comes from keyboard. + react.useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: MenuBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var toggleButtonKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + } + }; + }, [dispatch]); + var menuKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: MenuKeyDownEscape + }); + }, + Enter: function Enter(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnter + }); + }, + ' ': function _(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownSpaceButton + }); + } + }; + }, [dispatch]); + + // Action functions. + var toggleMenu = react.useCallback(function () { + dispatch({ + type: FunctionToggleMenu$1 + }); + }, [dispatch]); + var closeMenu = react.useCallback(function () { + dispatch({ + type: FunctionCloseMenu$1 + }); + }, [dispatch]); + var openMenu = react.useCallback(function () { + dispatch({ + type: FunctionOpenMenu$1 + }); + }, [dispatch]); + var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex$1, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = react.useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem$1, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset$2 + }); + }, [dispatch]); + var setInputValue = react.useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue$1, + inputValue: newInputValue + }); + }, [dispatch]); + // Getter functions. + var getLabelProps = react.useCallback(function (labelProps) { + return _extends__default["default"]({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.toggleButtonId + }, labelProps); + }, []); + var getMenuProps = react.useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + onKeyDown = _ref.onKeyDown, + onBlur = _ref.onBlur, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$3); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + var latestState = latest.current.state; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.tabIndex = -1, _extends2), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + onMouseLeave: callAllEventHandlers(onMouseLeave, function menuHandleMouseLeave() { + dispatch({ + type: MenuMouseLeave$1 + }); + }), + onKeyDown: callAllEventHandlers(onKeyDown, function menuHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && menuKeyDownHandlers[key]) { + menuKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: MenuKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }), + onBlur: callAllEventHandlers(onBlur, function menuHandleBlur() { + // if the blur was a result of selection, we don't trigger this action. + if (shouldBlurRef.current === false) { + shouldBlurRef.current = true; + return; + } + var shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown; + /* istanbul ignore else */ + if (shouldBlur) { + dispatch({ + type: MenuBlur + }); + } + }) + }, rest); + }, [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getToggleButtonProps = react.useCallback(function (_temp3, _temp4) { + var _extends3; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$2); + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$suppressRefErro = _ref4.suppressRefError, + suppressRefError = _ref4$suppressRefErro === void 0 ? false : _ref4$suppressRefErro; + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick$1 + }); + }; + var toggleButtonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && toggleButtonKeyDownHandlers[key]) { + toggleButtonKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: ToggleButtonKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }; + var toggleProps = _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends3.id = elementIdsRef.current.toggleButtonId, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-labelledby'] = elementIdsRef.current.labelId + " " + elementIdsRef.current.toggleButtonId, _extends3), rest); + if (!rest.disabled) { + toggleProps.onClick = callAllEventHandlers(onClick, toggleButtonHandleClick); + toggleProps.onKeyDown = callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown); + } + setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef); + return toggleProps; + }, [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo]); + var getItemProps = react.useCallback(function (_temp5) { + var _extends4; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + item = _ref5.item, + index = _ref5.index, + onMouseMove = _ref5.onMouseMove, + onClick = _ref5.onClick, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3$1); + var _latest$current = latest.current, + latestState = _latest$current.state, + latestProps = _latest$current.props; + var itemHandleMouseMove = function () { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove$1, + index: index + }); + }; + var itemHandleClick = function () { + dispatch({ + type: ItemClick$1, + index: index + }); + }; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var itemProps = _extends__default["default"]((_extends4 = { + role: 'option', + 'aria-selected': "" + (itemIndex === latestState.highlightedIndex), + id: elementIdsRef.current.getItemId(itemIndex) + }, _extends4[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends4), rest); + if (!rest.disabled) { + itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove); + itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick); + } + return itemProps; + }, [dispatch, latest]); + return { + // prop getters. + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getItemProps: getItemProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + selectItem: selectItem, + reset: reset, + setInputValue: setInputValue, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} + +var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0; +var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1; +var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2; +var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3; +var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4; +var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5; +var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6; +var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7; +var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8; +var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9; +var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 10; +var ToggleButtonClick = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11; +var FunctionToggleMenu = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12; +var FunctionOpenMenu = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13; +var FunctionCloseMenu = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14; +var FunctionSetHighlightedIndex = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15; +var FunctionSelectItem = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16; +var FunctionSetInputValue = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17; +var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18; +var ControlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__controlled_prop_updated_selected_item__' : 19; + +var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + InputKeyDownArrowDown: InputKeyDownArrowDown, + InputKeyDownArrowUp: InputKeyDownArrowUp, + InputKeyDownEscape: InputKeyDownEscape, + InputKeyDownHome: InputKeyDownHome, + InputKeyDownEnd: InputKeyDownEnd, + InputKeyDownEnter: InputKeyDownEnter, + InputChange: InputChange, + InputBlur: InputBlur, + MenuMouseLeave: MenuMouseLeave, + ItemMouseMove: ItemMouseMove, + ItemClick: ItemClick, + ToggleButtonClick: ToggleButtonClick, + FunctionToggleMenu: FunctionToggleMenu, + FunctionOpenMenu: FunctionOpenMenu, + FunctionCloseMenu: FunctionCloseMenu, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex, + FunctionSelectItem: FunctionSelectItem, + FunctionSetInputValue: FunctionSetInputValue, + FunctionReset: FunctionReset$1, + ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem +}); + +var _excluded$2 = ["id", "inputId"]; +function getElementIds(_ref) { + var id = _ref.id, + inputId = _ref.inputId, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$2); + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return _extends__default["default"]({ + inputId: inputId || uniqueId + "-input" + }, getElementIds$1(_extends__default["default"]({ + id: id + }, rest))); +} +function getInitialState$1(props) { + var initialState = getInitialState$2(props); + var selectedItem = initialState.selectedItem; + var inputValue = initialState.inputValue; + if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) { + inputValue = props.itemToString(selectedItem); + } + return _extends__default["default"]({}, initialState, { + inputValue: inputValue + }); +} +var propTypes = { + items: PropTypes__default["default"].array.isRequired, + itemToString: PropTypes__default["default"].func, + getA11yStatusMessage: PropTypes__default["default"].func, + getA11ySelectionMessage: PropTypes__default["default"].func, + circularNavigation: PropTypes__default["default"].bool, + highlightedIndex: PropTypes__default["default"].number, + defaultHighlightedIndex: PropTypes__default["default"].number, + initialHighlightedIndex: PropTypes__default["default"].number, + isOpen: PropTypes__default["default"].bool, + defaultIsOpen: PropTypes__default["default"].bool, + initialIsOpen: PropTypes__default["default"].bool, + selectedItem: PropTypes__default["default"].any, + initialSelectedItem: PropTypes__default["default"].any, + defaultSelectedItem: PropTypes__default["default"].any, + inputValue: PropTypes__default["default"].string, + defaultInputValue: PropTypes__default["default"].string, + initialInputValue: PropTypes__default["default"].string, + id: PropTypes__default["default"].string, + labelId: PropTypes__default["default"].string, + menuId: PropTypes__default["default"].string, + getItemId: PropTypes__default["default"].func, + inputId: PropTypes__default["default"].string, + toggleButtonId: PropTypes__default["default"].string, + stateReducer: PropTypes__default["default"].func, + onSelectedItemChange: PropTypes__default["default"].func, + onHighlightedIndexChange: PropTypes__default["default"].func, + onStateChange: PropTypes__default["default"].func, + onIsOpenChange: PropTypes__default["default"].func, + onInputValueChange: PropTypes__default["default"].func, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }) +}; + +/** + * The useCombobox version of useControlledReducer, which also + * checks if the controlled prop selectedItem changed between + * renders. If so, it will also update inputValue with its + * string equivalent. It uses the common useEnhancedReducer to + * compute the rest of the state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useControlledReducer(reducer, initialState, props) { + var previousSelectedItemRef = react.useRef(); + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + + // ToDo: if needed, make same approach as selectedItemChanged from Downshift. + if (isControlledProp(props, 'selectedItem')) { + if (previousSelectedItemRef.current !== props.selectedItem) { + dispatch({ + type: ControlledPropUpdatedSelectedItem, + inputValue: props.itemToString(props.selectedItem) + }); + } + previousSelectedItemRef.current = state.selectedItem === previousSelectedItemRef.current ? props.selectedItem : state.selectedItem; + } + return [getState(state, props), dispatch]; +} +var defaultProps$1 = _extends__default["default"]({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage$1, + circularNavigation: true +}); + +/* eslint-disable complexity */ +function downshiftUseComboboxReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index], + inputValue: props.itemToString(props.items[action.index]) + }; + break; + case InputKeyDownArrowDown: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownArrowUp: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownEnter: + changes = _extends__default["default"]({}, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: props.itemToString(props.items[state.highlightedIndex]) + }); + break; + case InputKeyDownEscape: + changes = { + isOpen: false, + selectedItem: null, + highlightedIndex: -1, + inputValue: '' + }; + break; + case InputKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputBlur: + changes = _extends__default["default"]({ + isOpen: false + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + inputValue: props.itemToString(props.items[state.highlightedIndex]), + highlightedIndex: -1 + }); + break; + case InputChange: + changes = { + isOpen: true, + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: action.inputValue + }; + break; + case MenuMouseLeave: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick: + case FunctionToggleMenu: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem: + changes = { + selectedItem: action.selectedItem, + inputValue: props.itemToString(action.selectedItem) + }; + break; + case ControlledPropUpdatedSelectedItem: + case FunctionSetInputValue: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$1: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends__default["default"]({}, state, changes); +} +/* eslint-enable complexity */ + +var _excluded$1 = ["onMouseLeave", "refKey", "ref"], + _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onClick", "onPress"], + _excluded3 = ["onClick", "onPress", "refKey", "ref"], + _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "refKey", "ref"], + _excluded5 = ["refKey", "ref"]; +var validatePropTypes = process.env.NODE_ENV === 'production' ? /* istanbul ignore next */null : getPropTypesValidator(useCombobox, propTypes); +useCombobox.stateChangeTypes = stateChangeTypes$1; +function useCombobox(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + validatePropTypes(userProps); + } + // Props defaults and destructuring. + var props = _extends__default["default"]({}, defaultProps$1, userProps); + var initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + getA11yStatusMessage = props.getA11yStatusMessage, + getA11ySelectionMessage = props.getA11ySelectionMessage, + itemToString = props.itemToString; + // Initial state depending on controlled props. + var initialState = getInitialState$1(props); + var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, initialState, props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element refs. + var menuRef = react.useRef(null); + var itemRefs = react.useRef(); + var inputRef = react.useRef(null); + var toggleButtonRef = react.useRef(null); + var comboboxRef = react.useRef(null); + itemRefs.current = {}; + // used not to scroll on highlight by mouse. + var shouldScrollRef = react.useRef(true); + var isInitialMountRef = react.useRef(true); + // prevent id re-generation between renders. + var elementIdsRef = react.useRef(getElementIds(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = react.useRef(); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + // used to store information about getter props being called on render. + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Scroll on highlighted item if change comes from keyboard. + react.useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + // Controls the focus on the menu or the toggle button. + react.useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if (initialIsOpen || defaultIsOpen || isOpen) { + if (inputRef.current) { + inputRef.current.focus(); + } + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [comboboxRef, menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: InputBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getComboboxProps', 'getMenuProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + /* Event handler functions */ + var inputKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowDown, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowUp, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: InputKeyDownEscape + }); + }, + Enter: function Enter(event) { + // if IME composing, wait for next Enter keydown event. + if (event.which === 229) { + return; + } + var latestState = latest.current.state; + if (latestState.isOpen && latestState.highlightedIndex > -1) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnter, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + } + }; + }, [dispatch, latest]); + + // Getter props. + var getLabelProps = react.useCallback(function (labelProps) { + return _extends__default["default"]({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.inputId + }, labelProps); + }, []); + var getMenuProps = react.useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$1); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () { + dispatch({ + type: MenuMouseLeave + }); + }), _extends2), rest); + }, [dispatch, setGetterPropCallInfo]); + var getItemProps = react.useCallback(function (_temp3) { + var _extends3, _ref4; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + item = _ref3.item, + index = _ref3.index, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onMouseMove = _ref3.onMouseMove, + onClick = _ref3.onClick; + _ref3.onPress; + var rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$1); + var _latest$current = latest.current, + latestProps = _latest$current.props, + latestState = _latest$current.state; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var onSelectKey = 'onClick'; + var customClickHandler = onClick; + return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends3.role = 'option', _extends3['aria-selected'] = "" + (itemIndex === latestState.highlightedIndex), _extends3.id = elementIdsRef.current.getItemId(itemIndex), _extends3), !rest.disabled && (_ref4 = { + onMouseMove: callAllEventHandlers(onMouseMove, function itemHandleMouseMove() { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove, + index: index + }); + }) + }, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, function itemHandleClick() { + dispatch({ + type: ItemClick, + index: index + }); + }), _ref4), rest); + }, [dispatch, latest]); + var getToggleButtonProps = react.useCallback(function (_temp4) { + var _extends4; + var _ref5 = _temp4 === void 0 ? {} : _temp4, + onClick = _ref5.onClick; + _ref5.onPress; + var _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3); + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick + }); + if (!latest.current.state.isOpen && inputRef.current) { + inputRef.current.focus(); + } + }; + return _extends__default["default"]((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends4.id = elementIdsRef.current.toggleButtonId, _extends4.tabIndex = -1, _extends4), !rest.disabled && _extends__default["default"]({}, { + onClick: callAllEventHandlers(onClick, toggleButtonHandleClick) + }), rest); + }, [dispatch, latest]); + var getInputProps = react.useCallback(function (_temp5, _temp6) { + var _extends5; + var _ref6 = _temp5 === void 0 ? {} : _temp5, + onKeyDown = _ref6.onKeyDown, + onChange = _ref6.onChange, + onInput = _ref6.onInput, + onBlur = _ref6.onBlur; + _ref6.onChangeText; + var _ref6$refKey = _ref6.refKey, + refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey, + ref = _ref6.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref6, _excluded4); + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressRefErro = _ref7.suppressRefError, + suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro; + setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef); + var latestState = latest.current.state; + var inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && inputKeyDownHandlers[key]) { + inputKeyDownHandlers[key](event); + } + }; + var inputHandleChange = function (event) { + dispatch({ + type: InputChange, + inputValue: event.target.value + }); + }; + var inputHandleBlur = function () { + /* istanbul ignore else */ + if (!mouseAndTouchTrackersRef.current.isMouseDown) { + dispatch({ + type: InputBlur + }); + } + }; + + /* istanbul ignore next (preact) */ + var onChangeKey = 'onChange'; + var eventHandlers = {}; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + return _extends__default["default"]((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) { + inputRef.current = inputNode; + }), _extends5.id = elementIdsRef.current.inputId, _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIdsRef.current.menuId, _extends5), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + 'aria-labelledby': elementIdsRef.current.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: latestState.inputValue + }, eventHandlers, rest); + }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getComboboxProps = react.useCallback(function (_temp7, _temp8) { + var _extends6; + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$refKey = _ref8.refKey, + refKey = _ref8$refKey === void 0 ? 'ref' : _ref8$refKey, + ref = _ref8.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref8, _excluded5); + var _ref9 = _temp8 === void 0 ? {} : _temp8, + _ref9$suppressRefErro = _ref9.suppressRefError, + suppressRefError = _ref9$suppressRefErro === void 0 ? false : _ref9$suppressRefErro; + setGetterPropCallInfo('getComboboxProps', suppressRefError, refKey, comboboxRef); + return _extends__default["default"]((_extends6 = {}, _extends6[refKey] = handleRefs(ref, function (comboboxNode) { + comboboxRef.current = comboboxNode; + }), _extends6.role = 'combobox', _extends6['aria-haspopup'] = 'listbox', _extends6['aria-owns'] = elementIdsRef.current.menuId, _extends6['aria-expanded'] = latest.current.state.isOpen, _extends6), rest); + }, [latest, setGetterPropCallInfo]); + + // returns + var toggleMenu = react.useCallback(function () { + dispatch({ + type: FunctionToggleMenu + }); + }, [dispatch]); + var closeMenu = react.useCallback(function () { + dispatch({ + type: FunctionCloseMenu + }); + }, [dispatch]); + var openMenu = react.useCallback(function () { + dispatch({ + type: FunctionOpenMenu + }); + }, [dispatch]); + var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = react.useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var setInputValue = react.useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue, + inputValue: newInputValue + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset$1 + }); + }, [dispatch]); + return { + // prop getters. + getItemProps: getItemProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getComboboxProps: getComboboxProps, + getToggleButtonProps: getToggleButtonProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + setInputValue: setInputValue, + selectItem: selectItem, + reset: reset, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} + +var defaultStateValues = { + activeIndex: -1, + selectedItems: [] +}; + +/** + * Returns the initial value for a state key in the following order: + * 1. controlled prop, 2. initial prop, 3. default prop, 4. default + * value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ +function getInitialValue(props, propKey) { + return getInitialValue$1(props, propKey, defaultStateValues); +} + +/** + * Returns the default value for a state key in the following order: + * 1. controlled prop, 2. default prop, 3. default value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ +function getDefaultValue(props, propKey) { + return getDefaultValue$1(props, propKey, defaultStateValues); +} + +/** + * Gets the initial state based on the provided props. It uses initial, default + * and controlled props related to state in order to compute the initial value. + * + * @param {Object} props Props passed to the hook. + * @returns {Object} The initial state. + */ +function getInitialState(props) { + var activeIndex = getInitialValue(props, 'activeIndex'); + var selectedItems = getInitialValue(props, 'selectedItems'); + return { + activeIndex: activeIndex, + selectedItems: selectedItems + }; +} + +/** + * Returns true if dropdown keydown operation is permitted. Should not be + * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on + * input element with text content that is either highlighted or selection + * cursor is not at the starting position. + * + * @param {KeyboardEvent} event The event from keydown. + * @returns {boolean} Whether the operation is allowed. + */ +function isKeyDownOperationPermitted(event) { + if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) { + return false; + } + var element = event.target; + if (element instanceof HTMLInputElement && + // if element is a text input + element.value !== '' && ( + // and we have text in it + // and cursor is either not at the start or is currently highlighting text. + element.selectionStart !== 0 || element.selectionEnd !== 0)) { + return false; + } + return true; +} + +/** + * Returns a message to be added to aria-live region when item is removed. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ +function getA11yRemovalMessage(selectionParameters) { + var removedSelectedItem = selectionParameters.removedSelectedItem, + itemToStringLocal = selectionParameters.itemToString; + return itemToStringLocal(removedSelectedItem) + " has been removed."; +} +({ + selectedItems: PropTypes__default["default"].array, + initialSelectedItems: PropTypes__default["default"].array, + defaultSelectedItems: PropTypes__default["default"].array, + itemToString: PropTypes__default["default"].func, + getA11yRemovalMessage: PropTypes__default["default"].func, + stateReducer: PropTypes__default["default"].func, + activeIndex: PropTypes__default["default"].number, + initialActiveIndex: PropTypes__default["default"].number, + defaultActiveIndex: PropTypes__default["default"].number, + onActiveIndexChange: PropTypes__default["default"].func, + onSelectedItemsChange: PropTypes__default["default"].func, + keyNavigationNext: PropTypes__default["default"].string, + keyNavigationPrevious: PropTypes__default["default"].string, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }) +}); +var defaultProps = { + itemToString: defaultProps$3.itemToString, + stateReducer: defaultProps$3.stateReducer, + environment: defaultProps$3.environment, + getA11yRemovalMessage: getA11yRemovalMessage, + keyNavigationNext: 'ArrowRight', + keyNavigationPrevious: 'ArrowLeft' +}; + +var SelectedItemClick = process.env.NODE_ENV !== "production" ? '__selected_item_click__' : 0; +var SelectedItemKeyDownDelete = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_delete__' : 1; +var SelectedItemKeyDownBackspace = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_backspace__' : 2; +var SelectedItemKeyDownNavigationNext = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_navigation_next__' : 3; +var SelectedItemKeyDownNavigationPrevious = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_navigation_previous__' : 4; +var DropdownKeyDownNavigationPrevious = process.env.NODE_ENV !== "production" ? '__dropdown_keydown_navigation_previous__' : 5; +var DropdownKeyDownBackspace = process.env.NODE_ENV !== "production" ? '__dropdown_keydown_backspace__' : 6; +var DropdownClick = process.env.NODE_ENV !== "production" ? '__dropdown_click__' : 7; +var FunctionAddSelectedItem = process.env.NODE_ENV !== "production" ? '__function_add_selected_item__' : 8; +var FunctionRemoveSelectedItem = process.env.NODE_ENV !== "production" ? '__function_remove_selected_item__' : 9; +var FunctionSetSelectedItems = process.env.NODE_ENV !== "production" ? '__function_set_selected_items__' : 10; +var FunctionSetActiveIndex = process.env.NODE_ENV !== "production" ? '__function_set_active_index__' : 11; +var FunctionReset = process.env.NODE_ENV !== "production" ? '__function_reset__' : 12; + +var stateChangeTypes = /*#__PURE__*/Object.freeze({ + __proto__: null, + SelectedItemClick: SelectedItemClick, + SelectedItemKeyDownDelete: SelectedItemKeyDownDelete, + SelectedItemKeyDownBackspace: SelectedItemKeyDownBackspace, + SelectedItemKeyDownNavigationNext: SelectedItemKeyDownNavigationNext, + SelectedItemKeyDownNavigationPrevious: SelectedItemKeyDownNavigationPrevious, + DropdownKeyDownNavigationPrevious: DropdownKeyDownNavigationPrevious, + DropdownKeyDownBackspace: DropdownKeyDownBackspace, + DropdownClick: DropdownClick, + FunctionAddSelectedItem: FunctionAddSelectedItem, + FunctionRemoveSelectedItem: FunctionRemoveSelectedItem, + FunctionSetSelectedItems: FunctionSetSelectedItems, + FunctionSetActiveIndex: FunctionSetActiveIndex, + FunctionReset: FunctionReset +}); + +/* eslint-disable complexity */ +function downshiftMultipleSelectionReducer(state, action) { + var type = action.type, + index = action.index, + props = action.props, + selectedItem = action.selectedItem; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + var changes; + switch (type) { + case SelectedItemClick: + changes = { + activeIndex: index + }; + break; + case SelectedItemKeyDownNavigationPrevious: + changes = { + activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1 + }; + break; + case SelectedItemKeyDownNavigationNext: + changes = { + activeIndex: activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1 + }; + break; + case SelectedItemKeyDownBackspace: + case SelectedItemKeyDownDelete: + { + var newActiveIndex = activeIndex; + if (selectedItems.length === 1) { + newActiveIndex = -1; + } else if (activeIndex === selectedItems.length - 1) { + newActiveIndex = selectedItems.length - 2; + } + changes = _extends__default["default"]({ + selectedItems: [].concat(selectedItems.slice(0, activeIndex), selectedItems.slice(activeIndex + 1)) + }, { + activeIndex: newActiveIndex + }); + break; + } + case DropdownKeyDownNavigationPrevious: + changes = { + activeIndex: selectedItems.length - 1 + }; + break; + case DropdownKeyDownBackspace: + changes = { + selectedItems: selectedItems.slice(0, selectedItems.length - 1) + }; + break; + case FunctionAddSelectedItem: + changes = { + selectedItems: [].concat(selectedItems, [selectedItem]) + }; + break; + case DropdownClick: + changes = { + activeIndex: -1 + }; + break; + case FunctionRemoveSelectedItem: + { + var _newActiveIndex = activeIndex; + var selectedItemIndex = selectedItems.indexOf(selectedItem); + if (selectedItems.length === 1) { + _newActiveIndex = -1; + } else if (selectedItemIndex === selectedItems.length - 1) { + _newActiveIndex = selectedItems.length - 2; + } + changes = _extends__default["default"]({ + selectedItems: [].concat(selectedItems.slice(0, selectedItemIndex), selectedItems.slice(selectedItemIndex + 1)) + }, { + activeIndex: _newActiveIndex + }); + break; + } + case FunctionSetSelectedItems: + { + var newSelectedItems = action.selectedItems; + changes = { + selectedItems: newSelectedItems + }; + break; + } + case FunctionSetActiveIndex: + { + var _newActiveIndex2 = action.activeIndex; + changes = { + activeIndex: _newActiveIndex2 + }; + break; + } + case FunctionReset: + changes = { + activeIndex: getDefaultValue(props, 'activeIndex'), + selectedItems: getDefaultValue(props, 'selectedItems') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends__default["default"]({}, state, changes); +} + +var _excluded = ["refKey", "ref", "onClick", "onKeyDown", "selectedItem", "index"], + _excluded2 = ["refKey", "ref", "onKeyDown", "onClick", "preventKeyAction"]; +useMultipleSelection.stateChangeTypes = stateChangeTypes; +function useMultipleSelection(userProps) { + if (userProps === void 0) { + userProps = {}; + } + // Props defaults and destructuring. + var props = _extends__default["default"]({}, defaultProps, userProps); + var getA11yRemovalMessage = props.getA11yRemovalMessage, + itemToString = props.itemToString, + environment = props.environment, + keyNavigationNext = props.keyNavigationNext, + keyNavigationPrevious = props.keyNavigationPrevious; + + // Reducer init. + var _useControlledReducer = useControlledReducer$1(downshiftMultipleSelectionReducer, getInitialState(props), props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + + // Refs. + var isInitialMountRef = react.useRef(true); + var dropdownRef = react.useRef(null); + var previousSelectedItemsRef = react.useRef(selectedItems); + var selectedItemRefs = react.useRef(); + selectedItemRefs.current = []; + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + var latest = useLatestRef({ + state: state, + props: props + }); + + // Effects. + /* Sets a11y status message on changes in selectedItem. */ + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (selectedItems.length < previousSelectedItemsRef.current.length) { + var removedSelectedItem = previousSelectedItemsRef.current.find(function (item) { + return selectedItems.indexOf(item) < 0; + }); + setStatus(getA11yRemovalMessage({ + itemToString: itemToString, + resultCount: selectedItems.length, + removedSelectedItem: removedSelectedItem, + activeIndex: activeIndex, + activeSelectedItem: selectedItems[activeIndex] + }), environment.document); + } + previousSelectedItemsRef.current = selectedItems; + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItems.length]); + // Sets focus on active item. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (activeIndex === -1 && dropdownRef.current) { + dropdownRef.current.focus(); + } else if (selectedItemRefs.current[activeIndex]) { + selectedItemRefs.current[activeIndex].focus(); + } + }, [activeIndex]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var selectedItemKeyDownHandlers = react.useMemo(function () { + var _ref; + return _ref = {}, _ref[keyNavigationPrevious] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationPrevious + }); + }, _ref[keyNavigationNext] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationNext + }); + }, _ref.Delete = function Delete() { + dispatch({ + type: SelectedItemKeyDownDelete + }); + }, _ref.Backspace = function Backspace() { + dispatch({ + type: SelectedItemKeyDownBackspace + }); + }, _ref; + }, [dispatch, keyNavigationNext, keyNavigationPrevious]); + var dropdownKeyDownHandlers = react.useMemo(function () { + var _ref2; + return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownNavigationPrevious + }); + } + }, _ref2.Backspace = function Backspace(event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownBackspace + }); + } + }, _ref2; + }, [dispatch, keyNavigationPrevious]); + + // Getter props. + var getSelectedItemProps = react.useCallback(function (_temp) { + var _extends2; + var _ref3 = _temp === void 0 ? {} : _temp, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + selectedItem = _ref3.selectedItem, + index = _ref3.index, + rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded); + var latestState = latest.current.state; + var itemIndex = getItemIndex(index, selectedItem, latestState.selectedItems); + if (itemIndex < 0) { + throw new Error('Pass either selectedItem or index in getSelectedItemProps!'); + } + return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (selectedItemNode) { + if (selectedItemNode) { + selectedItemRefs.current.push(selectedItemNode); + } + }), _extends2.tabIndex = index === latestState.activeIndex ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, function selectedItemHandleClick() { + dispatch({ + type: SelectedItemClick, + index: index + }); + }), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, function selectedItemHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && selectedItemKeyDownHandlers[key]) { + selectedItemKeyDownHandlers[key](event); + } + }), _extends2), rest); + }, [dispatch, latest, selectedItemKeyDownHandlers]); + var getDropdownProps = react.useCallback(function (_temp2, _temp3) { + var _extends3; + var _ref4 = _temp2 === void 0 ? {} : _temp2, + _ref4$refKey = _ref4.refKey, + refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey, + ref = _ref4.ref, + onKeyDown = _ref4.onKeyDown, + onClick = _ref4.onClick, + _ref4$preventKeyActio = _ref4.preventKeyAction, + preventKeyAction = _ref4$preventKeyActio === void 0 ? false : _ref4$preventKeyActio, + rest = _objectWithoutPropertiesLoose__default["default"](_ref4, _excluded2); + var _ref5 = _temp3 === void 0 ? {} : _temp3, + _ref5$suppressRefErro = _ref5.suppressRefError, + suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro; + setGetterPropCallInfo('getDropdownProps', suppressRefError, refKey, dropdownRef); + return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (dropdownNode) { + if (dropdownNode) { + dropdownRef.current = dropdownNode; + } + }), _extends3), !preventKeyAction && { + onKeyDown: callAllEventHandlers(onKeyDown, function dropdownHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && dropdownKeyDownHandlers[key]) { + dropdownKeyDownHandlers[key](event); + } + }), + onClick: callAllEventHandlers(onClick, function dropdownHandleClick() { + dispatch({ + type: DropdownClick + }); + }) + }, rest); + }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]); + + // returns + var addSelectedItem = react.useCallback(function (selectedItem) { + dispatch({ + type: FunctionAddSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var removeSelectedItem = react.useCallback(function (selectedItem) { + dispatch({ + type: FunctionRemoveSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var setSelectedItems = react.useCallback(function (newSelectedItems) { + dispatch({ + type: FunctionSetSelectedItems, + selectedItems: newSelectedItems + }); + }, [dispatch]); + var setActiveIndex = react.useCallback(function (newActiveIndex) { + dispatch({ + type: FunctionSetActiveIndex, + activeIndex: newActiveIndex + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset + }); + }, [dispatch]); + return { + getSelectedItemProps: getSelectedItemProps, + getDropdownProps: getDropdownProps, + addSelectedItem: addSelectedItem, + removeSelectedItem: removeSelectedItem, + setSelectedItems: setSelectedItems, + setActiveIndex: setActiveIndex, + reset: reset, + selectedItems: selectedItems, + activeIndex: activeIndex + }; +} + +exports["default"] = Downshift$1; +exports.resetIdCounter = resetIdCounter; +exports.useCombobox = useCombobox; +exports.useMultipleSelection = useMultipleSelection; +exports.useSelect = useSelect; diff --git a/dist/downshift.esm.js b/dist/downshift.esm.js new file mode 100644 index 000000000..82e4f3d25 --- /dev/null +++ b/dist/downshift.esm.js @@ -0,0 +1,3809 @@ +import _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose'; +import _extends from '@babel/runtime/helpers/esm/extends'; +import _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized'; +import _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose'; +import PropTypes from 'prop-types'; +import { cloneElement, Component, useRef, useEffect, useCallback, useReducer, useMemo } from 'react'; +import { isForwardRef } from 'react-is'; +import computeScrollIntoView from 'compute-scroll-into-view'; + +var idCounter = 0; + +/** + * Accepts a parameter and returns it if it's a function + * or a noop function if it's not. This allows us to + * accept a callback, but not worry about it if it's not + * passed. + * @param {Function} cb the callback + * @return {Function} a function + */ +function cbToCb(cb) { + return typeof cb === 'function' ? cb : noop; +} +function noop() {} + +/** + * Scroll node into view if necessary + * @param {HTMLElement} node the element that should scroll into view + * @param {HTMLElement} menuNode the menu element of the component + */ +function scrollIntoView(node, menuNode) { + if (!node) { + return; + } + var actions = computeScrollIntoView(node, { + boundary: menuNode, + block: 'nearest', + scrollMode: 'if-needed' + }); + actions.forEach(function (_ref) { + var el = _ref.el, + top = _ref.top, + left = _ref.left; + el.scrollTop = top; + el.scrollLeft = left; + }); +} + +/** + * @param {HTMLElement} parent the parent node + * @param {HTMLElement} child the child node + * @return {Boolean} whether the parent is the child or the child is in the parent + */ +function isOrContainsNode(parent, child) { + return parent === child || parent.contains && parent.contains(child); +} + +/** + * Simple debounce implementation. Will call the given + * function once after the time given has passed since + * it was last called. + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + * @return {Function} the debounced function + */ +function debounce(fn, time) { + var timeoutId; + function cancel() { + if (timeoutId) { + clearTimeout(timeoutId); + } + } + function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + cancel(); + timeoutId = setTimeout(function () { + timeoutId = null; + fn.apply(void 0, args); + }, time); + } + wrapper.cancel = cancel; + return wrapper; +} + +/** + * This is intended to be used to compose event handlers. + * They are executed in order until one of them sets + * `event.preventDownshiftDefault = true`. + * @param {...Function} fns the event handler functions + * @return {Function} the event handler to add to an element + */ +function callAllEventHandlers() { + for (var _len2 = arguments.length, fns = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + fns[_key2] = arguments[_key2]; + } + return function (event) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return fns.some(function (fn) { + if (fn) { + fn.apply(void 0, [event].concat(args)); + } + return event.preventDownshiftDefault || event.hasOwnProperty('nativeEvent') && event.nativeEvent.preventDownshiftDefault; + }); + }; +} +function handleRefs() { + for (var _len4 = arguments.length, refs = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + refs[_key4] = arguments[_key4]; + } + return function (node) { + refs.forEach(function (ref) { + if (typeof ref === 'function') { + ref(node); + } else if (ref) { + ref.current = node; + } + }); + }; +} + +/** + * This generates a unique ID for an instance of Downshift + * @return {String} the unique ID + */ +function generateId() { + return String(idCounter++); +} + +/** + * Resets idCounter to 0. Used for SSR. + */ +function resetIdCounter() { + idCounter = 0; +} + +/** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ +function getA11yStatusMessage$1(_ref2) { + var isOpen = _ref2.isOpen, + resultCount = _ref2.resultCount, + previousResultCount = _ref2.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter key to select."; + } + return ''; +} + +/** + * Takes an argument and if it's an array, returns the first item in the array + * otherwise returns the argument + * @param {*} arg the maybe-array + * @param {*} defaultValue the value if arg is falsey not defined + * @return {*} the arg or it's first item + */ +function unwrapArray(arg, defaultValue) { + arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */arg[0] : arg; + if (!arg && defaultValue) { + return defaultValue; + } else { + return arg; + } +} + +/** + * @param {Object} element (P)react element + * @return {Boolean} whether it's a DOM element + */ +function isDOMElement(element) { + // then we assume this is react + return typeof element.type === 'string'; +} + +/** + * @param {Object} element (P)react element + * @return {Object} the props + */ +function getElementProps(element) { + return element.props; +} + +/** + * Throws a helpful error message for required properties. Useful + * to be used as a default in destructuring or object params. + * @param {String} fnName the function name + * @param {String} propName the prop name + */ +function requiredProp(fnName, propName) { + // eslint-disable-next-line no-console + console.error("The property \"" + propName + "\" is required in \"" + fnName + "\""); +} +var stateKeys = ['highlightedIndex', 'inputValue', 'isOpen', 'selectedItem', 'type']; +/** + * @param {Object} state the state object + * @return {Object} state that is relevant to downshift + */ +function pickState(state) { + if (state === void 0) { + state = {}; + } + var result = {}; + stateKeys.forEach(function (k) { + if (state.hasOwnProperty(k)) { + result[k] = state[k]; + } + }); + return result; +} + +/** + * This will perform a shallow merge of the given state object + * with the state coming from props + * (for the controlled component scenario) + * This is used in state updater functions so they're referencing + * the right state regardless of where it comes from. + * + * @param {Object} state The state of the component/hook. + * @param {Object} props The props that may contain controlled values. + * @returns {Object} The merged controlled state. + */ +function getState(state, props) { + return Object.keys(state).reduce(function (prevState, key) { + prevState[key] = isControlledProp(props, key) ? props[key] : state[key]; + return prevState; + }, {}); +} + +/** + * This determines whether a prop is a "controlled prop" meaning it is + * state which is controlled by the outside of this component rather + * than within this component. + * + * @param {Object} props The props that may contain controlled values. + * @param {String} key the key to check + * @return {Boolean} whether it is a controlled controlled prop + */ +function isControlledProp(props, key) { + return props[key] !== undefined; +} + +/** + * Normalizes the 'key' property of a KeyboardEvent in IE/Edge + * @param {Object} event a keyboardEvent object + * @return {String} keyboard key + */ +function normalizeArrowKey(event) { + var key = event.key, + keyCode = event.keyCode; + /* istanbul ignore next (ie) */ + if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) { + return "Arrow" + key; + } + return key; +} + +/** + * Simple check if the value passed is object literal + * @param {*} obj any things + * @return {Boolean} whether it's object literal + */ +function isPlainObject(obj) { + return Object.prototype.toString.call(obj) === '[object Object]'; +} + +/** + * Returns the new index in the list, in a circular way. If next value is out of bonds from the total, + * it will wrap to either 0 or itemCount - 1. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @returns {number} The new index after the move. + */ +function getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + if (circular === void 0) { + circular = true; + } + if (itemCount === 0) { + return -1; + } + var itemsLastIndex = itemCount - 1; + if (typeof baseIndex !== 'number' || baseIndex < 0 || baseIndex >= itemCount) { + baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1; + } + var newIndex = baseIndex + moveAmount; + if (newIndex < 0) { + newIndex = circular ? itemsLastIndex : 0; + } else if (newIndex > itemsLastIndex) { + newIndex = circular ? 0 : itemsLastIndex; + } + var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular); + return nonDisabledNewIndex === -1 ? baseIndex : nonDisabledNewIndex; +} + +/** + * Returns the next index in the list of an item that is not disabled. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @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. + */ +function getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + var currentElementNode = getItemNodeFromIndex(baseIndex); + if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) { + return baseIndex; + } + if (moveAmount > 0) { + for (var index = baseIndex + 1; index < itemCount; index++) { + if (!getItemNodeFromIndex(index).hasAttribute('disabled')) { + return index; + } + } + } else { + for (var _index = baseIndex - 1; _index >= 0; _index--) { + if (!getItemNodeFromIndex(_index).hasAttribute('disabled')) { + return _index; + } + } + } + if (circular) { + return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false); + } + return -1; +} + +/** + * Checks if event target is within the downshift elements. + * + * @param {EventTarget} target Target to check. + * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc). + * @param {Document} document The document. + * @param {boolean} checkActiveElement Whether to also check activeElement. + * + * @returns {boolean} Whether or not the target is within downshift elements. + */ +function targetWithinDownshift(target, downshiftElements, document, checkActiveElement) { + if (checkActiveElement === void 0) { + checkActiveElement = true; + } + return downshiftElements.some(function (contextNode) { + return contextNode && (isOrContainsNode(contextNode, target) || checkActiveElement && isOrContainsNode(contextNode, document.activeElement)); + }); +} +function validateControlledUnchanged(state, prevProps, nextProps) { + if (process.env.NODE_ENV === 'production') { + return; + } + var warningDescription = "This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props"; + Object.keys(state).forEach(function (propKey) { + if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the controlled prop \"" + propKey + "\" to be uncontrolled. " + warningDescription); + } else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the uncontrolled prop \"" + propKey + "\" to be controlled. " + warningDescription); + } + }); +} + +var cleanupStatus = debounce(function () { + getStatusDiv().textContent = ''; +}, 500); + +/** + * @param {String} status the status message + * @param {Object} documentProp document passed by the user. + */ +function setStatus(status, documentProp) { + var div = getStatusDiv(documentProp); + if (!status) { + return; + } + div.textContent = status; + cleanupStatus(); +} + +/** + * Get the status node or create it if it does not already exist. + * @param {Object} documentProp document passed by the user. + * @return {HTMLElement} the status node. + */ +function getStatusDiv(documentProp) { + if (documentProp === void 0) { + documentProp = document; + } + var statusDiv = documentProp.getElementById('a11y-status-message'); + if (statusDiv) { + return statusDiv; + } + statusDiv = documentProp.createElement('div'); + statusDiv.setAttribute('id', 'a11y-status-message'); + statusDiv.setAttribute('role', 'status'); + statusDiv.setAttribute('aria-live', 'polite'); + statusDiv.setAttribute('aria-relevant', 'additions text'); + Object.assign(statusDiv.style, { + border: '0', + clip: 'rect(0 0 0 0)', + height: '1px', + margin: '-1px', + overflow: 'hidden', + padding: '0', + position: 'absolute', + width: '1px' + }); + documentProp.body.appendChild(statusDiv); + return statusDiv; +} + +var unknown = process.env.NODE_ENV !== "production" ? '__autocomplete_unknown__' : 0; +var mouseUp = process.env.NODE_ENV !== "production" ? '__autocomplete_mouseup__' : 1; +var itemMouseEnter = process.env.NODE_ENV !== "production" ? '__autocomplete_item_mouseenter__' : 2; +var keyDownArrowUp = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_arrow_up__' : 3; +var keyDownArrowDown = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_arrow_down__' : 4; +var keyDownEscape = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_escape__' : 5; +var keyDownEnter = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_enter__' : 6; +var keyDownHome = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_home__' : 7; +var keyDownEnd = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_end__' : 8; +var clickItem = process.env.NODE_ENV !== "production" ? '__autocomplete_click_item__' : 9; +var blurInput = process.env.NODE_ENV !== "production" ? '__autocomplete_blur_input__' : 10; +var changeInput = process.env.NODE_ENV !== "production" ? '__autocomplete_change_input__' : 11; +var keyDownSpaceButton = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_space_button__' : 12; +var clickButton = process.env.NODE_ENV !== "production" ? '__autocomplete_click_button__' : 13; +var blurButton = process.env.NODE_ENV !== "production" ? '__autocomplete_blur_button__' : 14; +var controlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__autocomplete_controlled_prop_updated_selected_item__' : 15; +var touchEnd = process.env.NODE_ENV !== "production" ? '__autocomplete_touchend__' : 16; + +var stateChangeTypes$3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + unknown: unknown, + mouseUp: mouseUp, + itemMouseEnter: itemMouseEnter, + keyDownArrowUp: keyDownArrowUp, + keyDownArrowDown: keyDownArrowDown, + keyDownEscape: keyDownEscape, + keyDownEnter: keyDownEnter, + keyDownHome: keyDownHome, + keyDownEnd: keyDownEnd, + clickItem: clickItem, + blurInput: blurInput, + changeInput: changeInput, + keyDownSpaceButton: keyDownSpaceButton, + clickButton: clickButton, + blurButton: blurButton, + controlledPropUpdatedSelectedItem: controlledPropUpdatedSelectedItem, + touchEnd: touchEnd +}); + +var _excluded$4 = ["refKey", "ref"], + _excluded2$3 = ["onClick", "onPress", "onKeyDown", "onKeyUp", "onBlur"], + _excluded3$2 = ["onKeyDown", "onBlur", "onChange", "onInput", "onChangeText"], + _excluded4$1 = ["refKey", "ref"], + _excluded5$1 = ["onMouseMove", "onMouseDown", "onClick", "onPress", "index", "item"]; +var Downshift = /*#__PURE__*/function () { + var Downshift = /*#__PURE__*/function (_Component) { + _inheritsLoose(Downshift, _Component); + function Downshift(_props) { + var _this = _Component.call(this, _props) || this; + // fancy destructuring + defaults + aliases + // this basically says each value of state should either be set to + // the initial value or the default value if the initial value is not provided + _this.id = _this.props.id || "downshift-" + generateId(); + _this.menuId = _this.props.menuId || _this.id + "-menu"; + _this.labelId = _this.props.labelId || _this.id + "-label"; + _this.inputId = _this.props.inputId || _this.id + "-input"; + _this.getItemId = _this.props.getItemId || function (index) { + return _this.id + "-item-" + index; + }; + _this.input = null; + _this.items = []; + // itemCount can be changed asynchronously + // from within downshift (so it can't come from a prop) + // this is why we store it as an instance and use + // getItemCount rather than just use items.length + // (to support windowing + async) + _this.itemCount = null; + _this.previousResultCount = 0; + _this.timeoutIds = []; + /** + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + */ + _this.internalSetTimeout = function (fn, time) { + var id = setTimeout(function () { + _this.timeoutIds = _this.timeoutIds.filter(function (i) { + return i !== id; + }); + fn(); + }, time); + _this.timeoutIds.push(id); + }; + _this.setItemCount = function (count) { + _this.itemCount = count; + }; + _this.unsetItemCount = function () { + _this.itemCount = null; + }; + _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) { + if (highlightedIndex === void 0) { + highlightedIndex = _this.props.defaultHighlightedIndex; + } + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends({ + highlightedIndex: highlightedIndex + }, otherStateToSet)); + }; + _this.clearSelection = function (cb) { + _this.internalSetState({ + selectedItem: null, + inputValue: '', + highlightedIndex: _this.props.defaultHighlightedIndex, + isOpen: _this.props.defaultIsOpen + }, cb); + }; + _this.selectItem = function (item, otherStateToSet, cb) { + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + selectedItem: item, + inputValue: _this.props.itemToString(item) + }, otherStateToSet), cb); + }; + _this.selectItemAtIndex = function (itemIndex, otherStateToSet, cb) { + var item = _this.items[itemIndex]; + if (item == null) { + return; + } + _this.selectItem(item, otherStateToSet, cb); + }; + _this.selectHighlightedItem = function (otherStateToSet, cb) { + return _this.selectItemAtIndex(_this.getState().highlightedIndex, otherStateToSet, cb); + }; + // any piece of our state can live in two places: + // 1. Uncontrolled: it's internal (this.state) + // We will call this.setState to update that state + // 2. Controlled: it's external (this.props) + // We will call this.props.onStateChange to update that state + // + // In addition, we'll call this.props.onChange if the + // selectedItem is changed. + _this.internalSetState = function (stateToSet, cb) { + var isItemSelected, onChangeArg; + var onStateChangeArg = {}; + var isStateToSetFunction = typeof stateToSet === 'function'; + + // we want to call `onInputValueChange` before the `setState` call + // so someone controlling the `inputValue` state gets notified of + // the input change as soon as possible. This avoids issues with + // preserving the cursor position. + // See https://github.com/downshift-js/downshift/issues/217 for more info. + if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(stateToSet.inputValue, _extends({}, _this.getStateAndHelpers(), stateToSet)); + } + return _this.setState(function (state) { + state = _this.getState(state); + var newStateToSet = isStateToSetFunction ? stateToSet(state) : stateToSet; + + // Your own function that could modify the state that will be set. + newStateToSet = _this.props.stateReducer(state, newStateToSet); + + // checks if an item is selected, regardless of if it's different from + // what was selected before + // used to determine if onSelect and onChange callbacks should be called + isItemSelected = newStateToSet.hasOwnProperty('selectedItem'); + // this keeps track of the object we want to call with setState + var nextState = {}; + // we need to call on change if the outside world is controlling any of our state + // and we're trying to update that state. OR if the selection has changed and we're + // trying to update the selection + if (isItemSelected && newStateToSet.selectedItem !== state.selectedItem) { + onChangeArg = newStateToSet.selectedItem; + } + newStateToSet.type = newStateToSet.type || unknown; + Object.keys(newStateToSet).forEach(function (key) { + // onStateChangeArg should only have the state that is + // actually changing + if (state[key] !== newStateToSet[key]) { + onStateChangeArg[key] = newStateToSet[key]; + } + // the type is useful for the onStateChangeArg + // but we don't actually want to set it in internal state. + // this is an undocumented feature for now... Not all internalSetState + // calls support it and I'm not certain we want them to yet. + // But it enables users controlling the isOpen state to know when + // the isOpen state changes due to mouseup events which is quite handy. + if (key === 'type') { + return; + } + newStateToSet[key]; + // if it's coming from props, then we don't care to set it internally + if (!isControlledProp(_this.props, key)) { + nextState[key] = newStateToSet[key]; + } + }); + + // if stateToSet is a function, then we weren't able to call onInputValueChange + // earlier, so we'll call it now that we know what the inputValue state will be. + if (isStateToSetFunction && newStateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(newStateToSet.inputValue, _extends({}, _this.getStateAndHelpers(), newStateToSet)); + } + return nextState; + }, function () { + // call the provided callback if it's a function + cbToCb(cb)(); + + // only call the onStateChange and onChange callbacks if + // we have relevant information to pass them. + var hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1; + if (hasMoreStateThanType) { + _this.props.onStateChange(onStateChangeArg, _this.getStateAndHelpers()); + } + if (isItemSelected) { + _this.props.onSelect(stateToSet.selectedItem, _this.getStateAndHelpers()); + } + if (onChangeArg !== undefined) { + _this.props.onChange(onChangeArg, _this.getStateAndHelpers()); + } + // this is currently undocumented and therefore subject to change + // We'll try to not break it, but just be warned. + _this.props.onUserAction(onStateChangeArg, _this.getStateAndHelpers()); + }); + }; + //////////////////////////// ROOT + _this.rootRef = function (node) { + return _this._rootNode = node; + }; + _this.getRootProps = function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$4); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + // this is used in the render to know whether the user has called getRootProps. + // It uses that to know whether to apply the props automatically + _this.getRootProps.called = true; + _this.getRootProps.refKey = refKey; + _this.getRootProps.suppressRefError = suppressRefError; + var _this$getState = _this.getState(), + isOpen = _this$getState.isOpen; + return _extends((_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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT + _this.keyDownHandlers = { + ArrowDown: function ArrowDown(event) { + var _this2 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? 5 : 1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowDown + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowDown + }, function () { + var itemCount = _this2.getItemCount(); + if (itemCount > 0) { + var _this2$getState = _this2.getState(), + highlightedIndex = _this2$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) { + return _this2.getItemNodeFromIndex(index); + }); + _this2.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowDown + }); + } + }); + } + }, + ArrowUp: function ArrowUp(event) { + var _this3 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? -5 : -1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowUp + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowUp + }, function () { + var itemCount = _this3.getItemCount(); + if (itemCount > 0) { + var _this3$getState = _this3.getState(), + highlightedIndex = _this3$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) { + return _this3.getItemNodeFromIndex(index); + }); + _this3.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowUp + }); + } + }); + } + }, + Enter: function Enter(event) { + if (event.which === 229) { + return; + } + var _this$getState2 = this.getState(), + isOpen = _this$getState2.isOpen, + highlightedIndex = _this$getState2.highlightedIndex; + if (isOpen && highlightedIndex != null) { + event.preventDefault(); + var item = this.items[highlightedIndex]; + var itemNode = this.getItemNodeFromIndex(highlightedIndex); + if (item == null || itemNode && itemNode.hasAttribute('disabled')) { + return; + } + this.selectHighlightedItem({ + type: keyDownEnter + }); + } + }, + Escape: function Escape(event) { + event.preventDefault(); + this.reset({ + type: keyDownEscape, + selectedItem: null, + inputValue: '' + }); + } + }; + //////////////////////////// BUTTON + _this.buttonKeyDownHandlers = _extends({}, _this.keyDownHandlers, { + ' ': function _(event) { + event.preventDefault(); + this.toggleMenu({ + type: keyDownSpaceButton + }); + } + }); + _this.inputKeyDownHandlers = _extends({}, _this.keyDownHandlers, { + Home: function Home(event) { + var _this4 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState3 = this.getState(), + isOpen = _this$getState3.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting downwards from 0 if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) { + return _this4.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownHome + }); + }, + End: function End(event) { + var _this5 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState4 = this.getState(), + isOpen = _this$getState4.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting upwards from last index if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) { + return _this5.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownEnd + }); + } + }); + _this.getToggleButtonProps = function (_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick; + _ref3.onPress; + var onKeyDown = _ref3.onKeyDown, + onKeyUp = _ref3.onKeyUp, + onBlur = _ref3.onBlur, + rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$3); + var _this$getState5 = _this.getState(), + isOpen = _this$getState5.isOpen; + var enabledEventHandlers = { + onClick: callAllEventHandlers(onClick, _this.buttonHandleClick), + onKeyDown: callAllEventHandlers(onKeyDown, _this.buttonHandleKeyDown), + onKeyUp: callAllEventHandlers(onKeyUp, _this.buttonHandleKeyUp), + onBlur: callAllEventHandlers(onBlur, _this.buttonHandleBlur) + }; + var eventHandlers = rest.disabled ? {} : enabledEventHandlers; + return _extends({ + type: 'button', + role: 'button', + 'aria-label': isOpen ? 'close menu' : 'open menu', + 'aria-haspopup': true, + 'data-toggle': true + }, eventHandlers, rest); + }; + _this.buttonHandleKeyUp = function (event) { + // Prevent click event from emitting in Firefox + event.preventDefault(); + }; + _this.buttonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (_this.buttonKeyDownHandlers[key]) { + _this.buttonKeyDownHandlers[key].call(_assertThisInitialized(_this), event); + } + }; + _this.buttonHandleClick = function (event) { + event.preventDefault(); + // handle odd case for Safari and Firefox which + // don't give the button the focus properly. + /* istanbul ignore if (can't reasonably test this) */ + if (_this.props.environment.document.activeElement === _this.props.environment.document.body) { + event.target.focus(); + } + // to simplify testing components that use downshift, we'll not wrap this in a setTimeout + // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated + // when building for production and should therefore have no impact on production code. + if (process.env.NODE_ENV === 'test') { + _this.toggleMenu({ + type: clickButton + }); + } else { + // Ensure that toggle of menu occurs after the potential blur event in iOS + _this.internalSetTimeout(function () { + return _this.toggleMenu({ + type: clickButton + }); + }); + } + }; + _this.buttonHandleBlur = function (event) { + var blurTarget = event.target; // Save blur target for comparison with activeElement later + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element + _this.internalSetTimeout(function () { + if (!_this.isMouseDown && (_this.props.environment.document.activeElement == null || _this.props.environment.document.activeElement.id !== _this.inputId) && _this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS) + ) { + _this.reset({ + type: blurButton + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON + /////////////////////////////// LABEL + _this.getLabelProps = function (props) { + return _extends({ + htmlFor: _this.inputId, + id: _this.labelId + }, props); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL + /////////////////////////////// INPUT + _this.getInputProps = function (_temp4) { + var _ref4 = _temp4 === void 0 ? {} : _temp4, + onKeyDown = _ref4.onKeyDown, + onBlur = _ref4.onBlur, + onChange = _ref4.onChange, + onInput = _ref4.onInput; + _ref4.onChangeText; + var rest = _objectWithoutPropertiesLoose(_ref4, _excluded3$2); + var onChangeKey; + var eventHandlers = {}; + + /* istanbul ignore next (preact) */ + + onChangeKey = 'onChange'; + var _this$getState6 = _this.getState(), + inputValue = _this$getState6.inputValue, + isOpen = _this$getState6.isOpen, + highlightedIndex = _this$getState6.highlightedIndex; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, _this.inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, _this.inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, _this.inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + return _extends({ + 'aria-autocomplete': 'list', + 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null, + 'aria-controls': isOpen ? _this.menuId : null, + 'aria-labelledby': _this.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: inputValue, + id: _this.inputId + }, eventHandlers, rest); + }; + _this.inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && _this.inputKeyDownHandlers[key]) { + _this.inputKeyDownHandlers[key].call(_assertThisInitialized(_this), event); + } + }; + _this.inputHandleChange = function (event) { + _this.internalSetState({ + type: changeInput, + isOpen: true, + inputValue: event.target.value, + highlightedIndex: _this.props.defaultHighlightedIndex + }); + }; + _this.inputHandleBlur = function () { + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element + _this.internalSetTimeout(function () { + var downshiftButtonIsActive = _this.props.environment.document && !!_this.props.environment.document.activeElement && !!_this.props.environment.document.activeElement.dataset && _this.props.environment.document.activeElement.dataset.toggle && _this._rootNode && _this._rootNode.contains(_this.props.environment.document.activeElement); + if (!_this.isMouseDown && !downshiftButtonIsActive) { + _this.reset({ + type: blurInput + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT + /////////////////////////////// MENU + _this.menuRef = function (node) { + _this._menuNode = node; + }; + _this.getMenuProps = function (_temp5, _temp6) { + var _extends3; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + props = _objectWithoutPropertiesLoose(_ref5, _excluded4$1); + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$suppressRefErro = _ref6.suppressRefError, + suppressRefError = _ref6$suppressRefErro === void 0 ? false : _ref6$suppressRefErro; + _this.getMenuProps.called = true; + _this.getMenuProps.refKey = refKey; + _this.getMenuProps.suppressRefError = suppressRefError; + return _extends((_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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU + /////////////////////////////// ITEM + _this.getItemProps = function (_temp7) { + var _enabledEventHandlers; + var _ref7 = _temp7 === void 0 ? {} : _temp7, + onMouseMove = _ref7.onMouseMove, + onMouseDown = _ref7.onMouseDown, + onClick = _ref7.onClick; + _ref7.onPress; + var index = _ref7.index, + _ref7$item = _ref7.item, + item = _ref7$item === void 0 ? process.env.NODE_ENV === 'production' ? /* istanbul ignore next */undefined : requiredProp('getItemProps', 'item') : _ref7$item, + rest = _objectWithoutPropertiesLoose(_ref7, _excluded5$1); + if (index === undefined) { + _this.items.push(item); + index = _this.items.indexOf(item); + } else { + _this.items[index] = item; + } + var onSelectKey = 'onClick'; + var customClickHandler = onClick; + var enabledEventHandlers = (_enabledEventHandlers = { + // onMouseMove is used over onMouseEnter here. onMouseMove + // is only triggered on actual mouse movement while onMouseEnter + // can fire on DOM changes, interrupting keyboard navigation + onMouseMove: callAllEventHandlers(onMouseMove, function () { + if (index === _this.getState().highlightedIndex) { + return; + } + _this.setHighlightedIndex(index, { + type: itemMouseEnter + }); + + // We never want to manually scroll when changing state based + // on `onMouseMove` because we will be moving the element out + // from under the user which is currently scrolling/moving the + // cursor + _this.avoidScrolling = true; + _this.internalSetTimeout(function () { + return _this.avoidScrolling = false; + }, 250); + }), + onMouseDown: callAllEventHandlers(onMouseDown, function (event) { + // This prevents the activeElement from being changed + // to the item so it can remain with the current activeElement + // which is a more common use case. + event.preventDefault(); + }) + }, _enabledEventHandlers[onSelectKey] = callAllEventHandlers(customClickHandler, function () { + _this.selectItemAtIndex(index, { + type: clickItem + }); + }), _enabledEventHandlers); + + // Passing down the onMouseDown handler to prevent redirect + // of the activeElement if clicking on disabled items + var eventHandlers = rest.disabled ? { + onMouseDown: enabledEventHandlers.onMouseDown + } : enabledEventHandlers; + return _extends({ + id: _this.getItemId(index), + role: 'option', + 'aria-selected': _this.getState().highlightedIndex === index + }, eventHandlers, rest); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM + _this.clearItems = function () { + _this.items = []; + }; + _this.reset = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref8) { + var selectedItem = _ref8.selectedItem; + return _extends({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + inputValue: _this.props.itemToString(selectedItem) + }, otherStateToSet); + }, cb); + }; + _this.toggleMenu = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref9) { + var isOpen = _ref9.isOpen; + return _extends({ + isOpen: !isOpen + }, isOpen && { + highlightedIndex: _this.props.defaultHighlightedIndex + }, otherStateToSet); + }, function () { + var _this$getState7 = _this.getState(), + isOpen = _this$getState7.isOpen, + highlightedIndex = _this$getState7.highlightedIndex; + if (isOpen) { + if (_this.getItemCount() > 0 && typeof highlightedIndex === 'number') { + _this.setHighlightedIndex(highlightedIndex, otherStateToSet); + } + } + cbToCb(cb)(); + }); + }; + _this.openMenu = function (cb) { + _this.internalSetState({ + isOpen: true + }, cb); + }; + _this.closeMenu = function (cb) { + _this.internalSetState({ + isOpen: false + }, cb); + }; + _this.updateStatus = debounce(function () { + var state = _this.getState(); + var item = _this.items[state.highlightedIndex]; + var resultCount = _this.getItemCount(); + var status = _this.props.getA11yStatusMessage(_extends({ + itemToString: _this.props.itemToString, + previousResultCount: _this.previousResultCount, + resultCount: resultCount, + highlightedItem: item + }, state)); + _this.previousResultCount = resultCount; + setStatus(status, _this.props.environment.document); + }, 200); + var _this$props = _this.props, + defaultHighlightedIndex = _this$props.defaultHighlightedIndex, + _this$props$initialHi = _this$props.initialHighlightedIndex, + _highlightedIndex = _this$props$initialHi === void 0 ? defaultHighlightedIndex : _this$props$initialHi, + defaultIsOpen = _this$props.defaultIsOpen, + _this$props$initialIs = _this$props.initialIsOpen, + _isOpen = _this$props$initialIs === void 0 ? defaultIsOpen : _this$props$initialIs, + _this$props$initialIn = _this$props.initialInputValue, + _inputValue = _this$props$initialIn === void 0 ? '' : _this$props$initialIn, + _this$props$initialSe = _this$props.initialSelectedItem, + _selectedItem = _this$props$initialSe === void 0 ? null : _this$props$initialSe; + var _state = _this.getState({ + highlightedIndex: _highlightedIndex, + isOpen: _isOpen, + inputValue: _inputValue, + selectedItem: _selectedItem + }); + if (_state.selectedItem != null && _this.props.initialInputValue === undefined) { + _state.inputValue = _this.props.itemToString(_state.selectedItem); + } + _this.state = _state; + return _this; + } + var _proto = Downshift.prototype; + /** + * Clear all running timeouts + */ + _proto.internalClearTimeouts = function internalClearTimeouts() { + this.timeoutIds.forEach(function (id) { + clearTimeout(id); + }); + this.timeoutIds = []; + } + + /** + * Gets the state based on internal state or props + * If a state value is passed via props, then that + * is the value given, otherwise it's retrieved from + * stateToMerge + * + * @param {Object} stateToMerge defaults to this.state + * @return {Object} the state + */; + _proto.getState = function getState$1(stateToMerge) { + if (stateToMerge === void 0) { + stateToMerge = this.state; + } + return getState(stateToMerge, this.props); + }; + _proto.getItemCount = function getItemCount() { + // things read better this way. They're in priority order: + // 1. `this.itemCount` + // 2. `this.props.itemCount` + // 3. `this.items.length` + var itemCount = this.items.length; + if (this.itemCount != null) { + itemCount = this.itemCount; + } else if (this.props.itemCount !== undefined) { + itemCount = this.props.itemCount; + } + return itemCount; + }; + _proto.getItemNodeFromIndex = function getItemNodeFromIndex(index) { + return this.props.environment.document.getElementById(this.getItemId(index)); + }; + _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() { + /* istanbul ignore else (react-native) */ + + var node = this.getItemNodeFromIndex(this.getState().highlightedIndex); + this.props.scrollIntoView(node, this._menuNode); + }; + _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) { + var _this6 = this; + var itemCount = this.getItemCount(); + var _this$getState8 = this.getState(), + highlightedIndex = _this$getState8.highlightedIndex; + if (itemCount > 0) { + var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) { + return _this6.getItemNodeFromIndex(index); + }); + this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet); + } + }; + _proto.getStateAndHelpers = function getStateAndHelpers() { + var _this$getState9 = this.getState(), + highlightedIndex = _this$getState9.highlightedIndex, + inputValue = _this$getState9.inputValue, + selectedItem = _this$getState9.selectedItem, + isOpen = _this$getState9.isOpen; + var itemToString = this.props.itemToString; + var id = this.id; + var getRootProps = this.getRootProps, + getToggleButtonProps = this.getToggleButtonProps, + getLabelProps = this.getLabelProps, + getMenuProps = this.getMenuProps, + getInputProps = this.getInputProps, + getItemProps = this.getItemProps, + openMenu = this.openMenu, + closeMenu = this.closeMenu, + toggleMenu = this.toggleMenu, + selectItem = this.selectItem, + selectItemAtIndex = this.selectItemAtIndex, + selectHighlightedItem = this.selectHighlightedItem, + setHighlightedIndex = this.setHighlightedIndex, + clearSelection = this.clearSelection, + clearItems = this.clearItems, + reset = this.reset, + setItemCount = this.setItemCount, + unsetItemCount = this.unsetItemCount, + setState = this.internalSetState; + return { + // prop getters + getRootProps: getRootProps, + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getItemProps: getItemProps, + // actions + reset: reset, + openMenu: openMenu, + closeMenu: closeMenu, + toggleMenu: toggleMenu, + selectItem: selectItem, + selectItemAtIndex: selectItemAtIndex, + selectHighlightedItem: selectHighlightedItem, + setHighlightedIndex: setHighlightedIndex, + clearSelection: clearSelection, + clearItems: clearItems, + setItemCount: setItemCount, + unsetItemCount: unsetItemCount, + setState: setState, + // props + itemToString: itemToString, + // derived + id: id, + // state + highlightedIndex: highlightedIndex, + inputValue: inputValue, + isOpen: isOpen, + selectedItem: selectedItem + }; + }; + _proto.componentDidMount = function componentDidMount() { + var _this7 = this; + /* istanbul ignore if (react-native) */ + if (process.env.NODE_ENV !== 'production' && !false && this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + + /* istanbul ignore if (react-native) */ + + // this.isMouseDown helps us track whether the mouse is currently held down. + // This is useful when the user clicks on an item in the list, but holds the mouse + // down long enough for the list to disappear (because the blur event fires on the input) + // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should + // trigger hiding the menu. + var onMouseDown = function () { + _this7.isMouseDown = true; + }; + var onMouseUp = function (event) { + _this7.isMouseDown = false; + // if the target element or the activeElement is within a downshift node + // then we don't want to reset downshift + var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment.document); + if (!contextWithinDownshift && _this7.getState().isOpen) { + _this7.reset({ + type: mouseUp + }, function () { + return _this7.props.onOuterClick(_this7.getStateAndHelpers()); + }); + } + }; + // Touching an element in iOS gives focus and hover states, but touching out of + // the element will remove hover, and persist the focus state, resulting in the + // blur event not being triggered. + // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen. + // If the user taps outside of Downshift, the component should be reset, + // but not if the user is swiping + var onTouchStart = function () { + _this7.isTouchMove = false; + }; + var onTouchMove = function () { + _this7.isTouchMove = true; + }; + var onTouchEnd = function (event) { + var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment.document, false); + if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) { + _this7.reset({ + type: touchEnd + }, function () { + return _this7.props.onOuterClick(_this7.getStateAndHelpers()); + }); + } + }; + var environment = this.props.environment; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + this.cleanup = function () { + _this7.internalClearTimeouts(); + _this7.updateStatus.cancel(); + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + }; + _proto.shouldScroll = function shouldScroll(prevState, prevProps) { + var _ref10 = this.props.highlightedIndex === undefined ? this.getState() : this.props, + currentHighlightedIndex = _ref10.highlightedIndex; + var _ref11 = prevProps.highlightedIndex === undefined ? prevState : prevProps, + prevHighlightedIndex = _ref11.highlightedIndex; + var scrollWhenOpen = currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen; + return scrollWhenOpen || currentHighlightedIndex !== prevHighlightedIndex; + }; + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + if (process.env.NODE_ENV !== 'production') { + validateControlledUnchanged(this.state, prevProps, this.props); + /* istanbul ignore if (react-native) */ + if (this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + } + if (isControlledProp(this.props, 'selectedItem') && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) { + this.internalSetState({ + type: controlledPropUpdatedSelectedItem, + inputValue: this.props.itemToString(this.props.selectedItem) + }); + } + if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) { + this.scrollHighlightedItemIntoView(); + } + + /* istanbul ignore else (react-native) */ + + this.updateStatus(); + }; + _proto.componentWillUnmount = function componentWillUnmount() { + this.cleanup(); // avoids memory leak + }; + _proto.render = function render() { + var children = unwrapArray(this.props.children, noop); + // because the items are rerendered every time we call the children + // we clear this out each render and it will be populated again as + // getItemProps is called. + this.clearItems(); + // we reset this so we know whether the user calls getRootProps during + // this render. If they do then we don't need to do anything, + // if they don't then we need to clone the element they return and + // apply the props for them. + this.getRootProps.called = false; + this.getRootProps.refKey = undefined; + this.getRootProps.suppressRefError = undefined; + // we do something similar for getMenuProps + this.getMenuProps.called = false; + this.getMenuProps.refKey = undefined; + this.getMenuProps.suppressRefError = undefined; + // we do something similar for getLabelProps + this.getLabelProps.called = false; + // and something similar for getInputProps + this.getInputProps.called = false; + var element = unwrapArray(children(this.getStateAndHelpers())); + if (!element) { + return null; + } + if (this.getRootProps.called || this.props.suppressRefError) { + if (process.env.NODE_ENV !== 'production' && !this.getRootProps.suppressRefError && !this.props.suppressRefError) { + validateGetRootPropsCalledCorrectly(element, this.getRootProps); + } + return element; + } else if (isDOMElement(element)) { + // they didn't apply the root props, but we can clone + // this and apply the props ourselves + return /*#__PURE__*/cloneElement(element, this.getRootProps(getElementProps(element))); + } + + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + // they didn't apply the root props, but they need to + // otherwise we can't query around the autocomplete + + throw new Error('downshift: If you return a non-DOM element, you must apply the getRootProps function'); + } + + /* istanbul ignore next */ + return undefined; + }; + return Downshift; + }(Component); + Downshift.defaultProps = { + defaultHighlightedIndex: null, + defaultIsOpen: false, + getA11yStatusMessage: getA11yStatusMessage$1, + itemToString: function itemToString(i) { + if (i == null) { + return ''; + } + if (process.env.NODE_ENV !== 'production' && isPlainObject(i) && !i.hasOwnProperty('toString')) { + // eslint-disable-next-line no-console + console.warn('downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.', 'The object that was passed:', i); + } + return String(i); + }, + onStateChange: noop, + onInputValueChange: noop, + onUserAction: noop, + onChange: noop, + onSelect: noop, + onOuterClick: noop, + selectedItemChanged: function selectedItemChanged(prevItem, item) { + return prevItem !== item; + }, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window, + stateReducer: function stateReducer(state, stateToSet) { + return stateToSet; + }, + suppressRefError: false, + scrollIntoView: scrollIntoView + }; + Downshift.stateChangeTypes = stateChangeTypes$3; + return Downshift; +}(); +process.env.NODE_ENV !== "production" ? Downshift.propTypes = { + children: PropTypes.func, + defaultHighlightedIndex: PropTypes.number, + defaultIsOpen: PropTypes.bool, + initialHighlightedIndex: PropTypes.number, + initialSelectedItem: PropTypes.any, + initialInputValue: PropTypes.string, + initialIsOpen: PropTypes.bool, + getA11yStatusMessage: PropTypes.func, + itemToString: PropTypes.func, + onChange: PropTypes.func, + onSelect: PropTypes.func, + onStateChange: PropTypes.func, + onInputValueChange: PropTypes.func, + onUserAction: PropTypes.func, + onOuterClick: PropTypes.func, + selectedItemChanged: PropTypes.func, + stateReducer: PropTypes.func, + itemCount: PropTypes.number, + id: PropTypes.string, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }), + suppressRefError: PropTypes.bool, + scrollIntoView: PropTypes.func, + // things we keep in state for uncontrolled components + // but can accept as props for controlled components + /* eslint-disable react/no-unused-prop-types */ + selectedItem: PropTypes.any, + isOpen: PropTypes.bool, + inputValue: PropTypes.string, + highlightedIndex: PropTypes.number, + labelId: PropTypes.string, + inputId: PropTypes.string, + menuId: PropTypes.string, + getItemId: PropTypes.func + /* eslint-enable react/no-unused-prop-types */ +} : void 0; +var Downshift$1 = Downshift; +function validateGetMenuPropsCalledCorrectly(node, _ref12) { + var refKey = _ref12.refKey; + if (!node) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from getMenuProps was not applied correctly on your menu element."); + } +} +function validateGetRootPropsCalledCorrectly(element, _ref13) { + var refKey = _ref13.refKey; + var refKeySpecified = refKey !== 'ref'; + var isComposite = !isDOMElement(element); + if (isComposite && !refKeySpecified && !isForwardRef(element)) { + // eslint-disable-next-line no-console + console.error('downshift: You returned a non-DOM element. You must specify a refKey in getRootProps'); + } else if (!isComposite && refKeySpecified) { + // eslint-disable-next-line no-console + console.error("downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \"" + refKey + "\""); + } + if (!isForwardRef(element) && !getElementProps(element)[refKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You must apply the ref prop \"" + refKey + "\" from getRootProps onto your root element."); + } +} + +var dropdownDefaultStateValues = { + highlightedIndex: -1, + isOpen: false, + selectedItem: null, + inputValue: '' +}; +function callOnChangeProps(action, state, newState) { + var props = action.props, + type = action.type; + var changes = {}; + Object.keys(state).forEach(function (key) { + invokeOnChangeHandler(key, props, state, newState); + if (newState[key] !== state[key]) { + changes[key] = newState[key]; + } + }); + if (props.onStateChange && Object.keys(changes).length) { + props.onStateChange(_extends({ + type: type + }, changes)); + } +} +function invokeOnChangeHandler(key, props, state, newState) { + var handler = "on" + capitalizeString(key) + "Change"; + if (props[handler] && newState[key] !== undefined && newState[key] !== state[key]) { + props[handler](newState); + } +} + +/** + * Default state reducer that returns the changes. + * + * @param {Object} s state. + * @param {Object} a action with changes. + * @returns {Object} changes. + */ +function stateReducer(s, a) { + return a.changes; +} + +/** + * Returns a message to be added to aria-live region when item is selected. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ +function getA11ySelectionMessage(selectionParameters) { + var selectedItem = selectionParameters.selectedItem, + itemToStringLocal = selectionParameters.itemToString; + return selectedItem ? itemToStringLocal(selectedItem) + " has been selected." : ''; +} + +/** + * Debounced call for updating the a11y message. + */ +var updateA11yStatus = debounce(function (getA11yMessage, document) { + setStatus(getA11yMessage(), document); +}, 200); +function getElementIds$1(_ref) { + var id = _ref.id, + labelId = _ref.labelId, + menuId = _ref.menuId, + getItemId = _ref.getItemId, + toggleButtonId = _ref.toggleButtonId; + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return { + labelId: labelId || uniqueId + "-label", + menuId: menuId || uniqueId + "-menu", + getItemId: getItemId || function (index) { + return uniqueId + "-item-" + index; + }, + toggleButtonId: toggleButtonId || uniqueId + "-toggle-button" + }; +} +function getItemIndex(index, item, items) { + if (index !== undefined) { + return index; + } + if (items.length === 0) { + return -1; + } + return items.indexOf(item); +} +function itemToString(item) { + return item ? String(item) : ''; +} +function getPropTypesValidator(caller, propTypes) { + // istanbul ignore next + return function (options) { + if (options === void 0) { + options = {}; + } + Object.keys(propTypes).forEach(function (key) { + PropTypes.checkPropTypes(propTypes, options, key, caller.name); + }); + }; +} +function isAcceptedCharacterKey(key) { + return /^\S{1}$/.test(key); +} +function capitalizeString(string) { + return "" + string.slice(0, 1).toUpperCase() + string.slice(1); +} +function useLatestRef(val) { + var ref = useRef(val); + // technically this is not "concurrent mode safe" because we're manipulating + // the value during render (so it's not idempotent). However, the places this + // hook is used is to support memoizing callbacks which will be called + // *during* render, so we need the latest values *during* render. + // If not for this, then we'd probably want to use useLayoutEffect instead. + ref.current = val; + return ref; +} + +/** + * Computes the controlled state using a the previous state, props, + * two reducers, one from downshift and an optional one from the user. + * Also calls the onChange handlers for state values that have changed. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useEnhancedReducer(reducer, initialState, props, isStateEqual) { + var prevStateRef = useRef(); + var actionRef = useRef(); + var enhancedReducer = useCallback(function (state, action) { + actionRef.current = action; + state = getState(state, action.props); + var changes = reducer(state, action); + var newState = action.props.stateReducer(state, _extends({}, action, { + changes: changes + })); + return newState; + }, [reducer]); + var _useReducer = useReducer(enhancedReducer, initialState), + state = _useReducer[0], + dispatch = _useReducer[1]; + var propsRef = useLatestRef(props); + var dispatchWithProps = useCallback(function (action) { + return dispatch(_extends({ + props: propsRef.current + }, action)); + }, [propsRef]); + var action = actionRef.current; + useEffect(function () { + var shouldCallOnChangeProps = action && prevStateRef.current && !isStateEqual(prevStateRef.current, state); + if (shouldCallOnChangeProps) { + callOnChangeProps(action, getState(prevStateRef.current, action.props), state); + } + prevStateRef.current = state; + }, [state, action, isStateEqual]); + return [state, dispatchWithProps]; +} + +/** + * Wraps the useEnhancedReducer and applies the controlled prop values before + * returning the new state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useControlledReducer$1(reducer, initialState, props, isStateEqual) { + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props, isStateEqual), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + return [getState(state, props), dispatch]; +} +var defaultProps$3 = { + itemToString: itemToString, + stateReducer: stateReducer, + getA11ySelectionMessage: getA11ySelectionMessage, + scrollIntoView: scrollIntoView, + circularNavigation: false, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window +}; +function getDefaultValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + var defaultPropKey = "default" + capitalizeString(propKey); + if (defaultPropKey in props) { + return props[defaultPropKey]; + } + return defaultStateValues[propKey]; +} +function getInitialValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + if (propKey in props) { + return props[propKey]; + } + var initialPropKey = "initial" + capitalizeString(propKey); + if (initialPropKey in props) { + return props[initialPropKey]; + } + return getDefaultValue$1(props, propKey, defaultStateValues); +} +function getInitialState$2(props) { + var selectedItem = getInitialValue$1(props, 'selectedItem'); + var isOpen = getInitialValue$1(props, 'isOpen'); + var highlightedIndex = getInitialValue$1(props, 'highlightedIndex'); + var inputValue = getInitialValue$1(props, 'inputValue'); + return { + highlightedIndex: highlightedIndex < 0 && selectedItem ? props.items.indexOf(selectedItem) : highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} +function getHighlightedIndexOnOpen(props, state, offset, getItemNodeFromIndex) { + var items = props.items, + initialHighlightedIndex = props.initialHighlightedIndex, + defaultHighlightedIndex = props.defaultHighlightedIndex; + var selectedItem = state.selectedItem, + highlightedIndex = state.highlightedIndex; + if (items.length === 0) { + return -1; + } + + // initialHighlightedIndex will give value to highlightedIndex on initial state only. + if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex) { + return initialHighlightedIndex; + } + if (defaultHighlightedIndex !== undefined) { + return defaultHighlightedIndex; + } + if (selectedItem) { + if (offset === 0) { + return items.indexOf(selectedItem); + } + return getNextWrappingIndex(offset, items.indexOf(selectedItem), items.length, getItemNodeFromIndex, false); + } + if (offset === 0) { + return -1; + } + return offset < 0 ? items.length - 1 : 0; +} + +/** + * Reuse the movement tracking of mouse and touch events. + * + * @param {boolean} isOpen Whether the dropdown is open or not. + * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.) + * @param {Object} environment Environment where component/hook exists. + * @param {Function} handleBlur Handler on blur from mouse or touch. + * @returns {Object} Ref containing whether mouseDown or touchMove event is happening + */ +function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) { + var mouseAndTouchTrackersRef = useRef({ + isMouseDown: false, + isTouchMove: false + }); + useEffect(function () { + // The same strategy for checking if a click occurred inside or outside downsift + // as in downshift.js. + var onMouseDown = function () { + mouseAndTouchTrackersRef.current.isMouseDown = true; + }; + var onMouseUp = function (event) { + mouseAndTouchTrackersRef.current.isMouseDown = false; + if (isOpen && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document)) { + handleBlur(); + } + }; + var onTouchStart = function () { + mouseAndTouchTrackersRef.current.isTouchMove = false; + }; + var onTouchMove = function () { + mouseAndTouchTrackersRef.current.isTouchMove = true; + }; + var onTouchEnd = function (event) { + if (isOpen && !mouseAndTouchTrackersRef.current.isTouchMove && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document, false)) { + handleBlur(); + } + }; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + return function () { + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, environment]); + return mouseAndTouchTrackersRef; +} + +/** + * Custom hook that checks if getter props are called correctly. + * + * @param {...any} propKeys Getter prop names to be handled. + * @returns {Function} Setter function called inside getter props to set call information. + */ +function useGetterPropsCalledChecker() { + for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) { + propKeys[_key] = arguments[_key]; + } + var getterPropsCalledRef = useRef(propKeys.reduce(function (acc, propKey) { + acc[propKey] = {}; + return acc; + }, {})); + if (process.env.NODE_ENV !== 'production') { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + getterPropsCalledRef.current[propKey] = null; + }); + } + useEffect(function () { + if (process.env.NODE_ENV !== 'production') { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + if (!getterPropsCalledRef.current[propKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You forgot to call the " + propKey + " getter function on your component / element."); + return; + } + var _getterPropsCalledRef = getterPropsCalledRef.current[propKey], + suppressRefError = _getterPropsCalledRef.suppressRefError, + refKey = _getterPropsCalledRef.refKey, + elementRef = _getterPropsCalledRef.elementRef; + if ((!elementRef || !elementRef.current) && !suppressRefError) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from " + propKey + " was not applied correctly on your element."); + } + }); + } + }); + var setGetterPropCallInfo = useCallback(function (propKey, suppressRefError, refKey, elementRef) { + if (process.env.NODE_ENV !== 'production') { + getterPropsCalledRef.current[propKey] = { + suppressRefError: suppressRefError, + refKey: refKey, + elementRef: elementRef + }; + } + }, []); + return setGetterPropCallInfo; +} + +/** + * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item. + * Used by useSelect and useCombobox. + * + * @param {Object} prevState + * @param {Object} newState + * @returns {boolean} Wheather the states are deeply equal. + */ +function isDropdownsStateEqual(prevState, newState) { + return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem; +} + +function getItemIndexByCharacterKey(keysSoFar, highlightedIndex, items, itemToStringParam, getItemNodeFromIndex) { + var lowerCasedItemStrings = items.map(function (item) { + return itemToStringParam(item).toLowerCase(); + }); + var lowerCasedKeysSoFar = keysSoFar.toLowerCase(); + var isValid = function (itemString, index) { + var element = getItemNodeFromIndex(index); + return itemString.startsWith(lowerCasedKeysSoFar) && !(element && element.hasAttribute('disabled')); + }; + for (var index = highlightedIndex + 1; index < lowerCasedItemStrings.length; index++) { + var itemString = lowerCasedItemStrings[index]; + if (isValid(itemString, index)) { + return index; + } + } + for (var _index = 0; _index < highlightedIndex; _index++) { + var _itemString = lowerCasedItemStrings[_index]; + if (isValid(_itemString, _index)) { + return _index; + } + } + return highlightedIndex; +} +var propTypes$1 = { + items: PropTypes.array.isRequired, + itemToString: PropTypes.func, + getA11yStatusMessage: PropTypes.func, + getA11ySelectionMessage: PropTypes.func, + circularNavigation: PropTypes.bool, + highlightedIndex: PropTypes.number, + defaultHighlightedIndex: PropTypes.number, + initialHighlightedIndex: PropTypes.number, + isOpen: PropTypes.bool, + defaultIsOpen: PropTypes.bool, + initialIsOpen: PropTypes.bool, + selectedItem: PropTypes.any, + initialSelectedItem: PropTypes.any, + defaultSelectedItem: PropTypes.any, + id: PropTypes.string, + labelId: PropTypes.string, + menuId: PropTypes.string, + getItemId: PropTypes.func, + toggleButtonId: PropTypes.string, + stateReducer: PropTypes.func, + onSelectedItemChange: PropTypes.func, + onHighlightedIndexChange: PropTypes.func, + onStateChange: PropTypes.func, + onIsOpenChange: PropTypes.func, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }) +}; + +/** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ +function getA11yStatusMessage(_ref) { + var isOpen = _ref.isOpen, + resultCount = _ref.resultCount, + previousResultCount = _ref.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select."; + } + return ''; +} +var defaultProps$2 = _extends({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage +}); + +var MenuKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__menu_keydown_arrow_down__' : 0; +var MenuKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__menu_keydown_arrow_up__' : 1; +var MenuKeyDownEscape = process.env.NODE_ENV !== "production" ? '__menu_keydown_escape__' : 2; +var MenuKeyDownHome = process.env.NODE_ENV !== "production" ? '__menu_keydown_home__' : 3; +var MenuKeyDownEnd = process.env.NODE_ENV !== "production" ? '__menu_keydown_end__' : 4; +var MenuKeyDownEnter = process.env.NODE_ENV !== "production" ? '__menu_keydown_enter__' : 5; +var MenuKeyDownSpaceButton = process.env.NODE_ENV !== "production" ? '__menu_keydown_space_button__' : 6; +var MenuKeyDownCharacter = process.env.NODE_ENV !== "production" ? '__menu_keydown_character__' : 7; +var MenuBlur = process.env.NODE_ENV !== "production" ? '__menu_blur__' : 8; +var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 9; +var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 10; +var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 11; +var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 12; +var ToggleButtonKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_arrow_down__' : 13; +var ToggleButtonKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_arrow_up__' : 14; +var ToggleButtonKeyDownCharacter = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_character__' : 15; +var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 16; +var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 17; +var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 18; +var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 19; +var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 20; +var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 21; +var FunctionReset$2 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 22; + +var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + MenuKeyDownArrowDown: MenuKeyDownArrowDown, + MenuKeyDownArrowUp: MenuKeyDownArrowUp, + MenuKeyDownEscape: MenuKeyDownEscape, + MenuKeyDownHome: MenuKeyDownHome, + MenuKeyDownEnd: MenuKeyDownEnd, + MenuKeyDownEnter: MenuKeyDownEnter, + MenuKeyDownSpaceButton: MenuKeyDownSpaceButton, + MenuKeyDownCharacter: MenuKeyDownCharacter, + MenuBlur: MenuBlur, + MenuMouseLeave: MenuMouseLeave$1, + ItemMouseMove: ItemMouseMove$1, + ItemClick: ItemClick$1, + ToggleButtonClick: ToggleButtonClick$1, + ToggleButtonKeyDownArrowDown: ToggleButtonKeyDownArrowDown, + ToggleButtonKeyDownArrowUp: ToggleButtonKeyDownArrowUp, + ToggleButtonKeyDownCharacter: ToggleButtonKeyDownCharacter, + FunctionToggleMenu: FunctionToggleMenu$1, + FunctionOpenMenu: FunctionOpenMenu$1, + FunctionCloseMenu: FunctionCloseMenu$1, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1, + FunctionSelectItem: FunctionSelectItem$1, + FunctionSetInputValue: FunctionSetInputValue$1, + FunctionReset: FunctionReset$2 +}); + +/* eslint-disable complexity */ +function downshiftSelectReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove$1: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick$1: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index] + }; + break; + case ToggleButtonKeyDownCharacter: + { + var lowercasedKey = action.key; + var inputValue = "" + state.inputValue + lowercasedKey; + var itemIndex = getItemIndexByCharacterKey(inputValue, state.selectedItem ? props.items.indexOf(state.selectedItem) : -1, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends({ + inputValue: inputValue + }, itemIndex >= 0 && { + selectedItem: props.items[itemIndex] + }); + } + break; + case ToggleButtonKeyDownArrowDown: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case ToggleButtonKeyDownArrowUp: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case MenuKeyDownEnter: + case MenuKeyDownSpaceButton: + changes = _extends({ + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex') + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex] + }); + break; + case MenuKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEscape: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuBlur: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuKeyDownCharacter: + { + var _lowercasedKey = action.key; + var _inputValue = "" + state.inputValue + _lowercasedKey; + var highlightedIndex = getItemIndexByCharacterKey(_inputValue, state.highlightedIndex, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends({ + inputValue: _inputValue + }, highlightedIndex >= 0 && { + highlightedIndex: highlightedIndex + }); + } + break; + case MenuKeyDownArrowDown: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuKeyDownArrowUp: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuMouseLeave$1: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick$1: + case FunctionToggleMenu$1: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu$1: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu$1: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex$1: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem$1: + changes = { + selectedItem: action.selectedItem + }; + break; + case FunctionSetInputValue$1: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$2: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends({}, state, changes); +} +/* eslint-enable complexity */ + +var _excluded$3 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"], + _excluded2$2 = ["onClick", "onKeyDown", "refKey", "ref"], + _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "refKey", "ref"]; +var validatePropTypes$1 = process.env.NODE_ENV === 'production' ? /* istanbul ignore next */null : getPropTypesValidator(useSelect, propTypes$1); +useSelect.stateChangeTypes = stateChangeTypes$2; +function useSelect(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + validatePropTypes$1(userProps); + } + // Props defaults and destructuring. + var props = _extends({}, defaultProps$2, userProps); + var items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + itemToString = props.itemToString, + getA11ySelectionMessage = props.getA11ySelectionMessage, + getA11yStatusMessage = props.getA11yStatusMessage; + // Initial state depending on controlled props. + var initialState = getInitialState$2(props); + var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, initialState, props, isDropdownsStateEqual), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element efs. + var toggleButtonRef = useRef(null); + var menuRef = useRef(null); + var itemRefs = useRef(); + itemRefs.current = {}; + // used not to scroll when highlight by mouse. + var shouldScrollRef = useRef(true); + // used not to trigger menu blur action in some scenarios. + var shouldBlurRef = useRef(true); + // used to keep the inputValue clearTimeout object between renders. + var clearTimeoutRef = useRef(null); + // prevent id re-generation between renders. + var elementIdsRef = useRef(getElementIds$1(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = useRef(); + var isInitialMountRef = useRef(true); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = useRef(props); + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + + // Some utils. + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Sets cleanup for the keysSoFar after 500ms. + useEffect(function () { + // init the clean function here as we need access to dispatch. + if (isInitialMountRef.current) { + clearTimeoutRef.current = debounce(function (outerDispatch) { + outerDispatch({ + type: FunctionSetInputValue$1, + inputValue: '' + }); + }, 500); + } + if (!inputValue) { + return; + } + clearTimeoutRef.current(dispatch); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inputValue]); + /* Controls the focus on the menu or the toggle button. */ + useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus menu on open. + if (isOpen) { + // istanbul ignore else + if (menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus toggleButton on close, but not if it was closed with (Shift+)Tab. + if (environment.document.activeElement === menuRef.current) { + // istanbul ignore else + if (toggleButtonRef.current) { + shouldBlurRef.current = false; + toggleButtonRef.current.focus(); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + // Scroll on highlighted item if change comes from keyboard. + useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: MenuBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps'); + // Make initial ref false. + useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var toggleButtonKeyDownHandlers = useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + } + }; + }, [dispatch]); + var menuKeyDownHandlers = useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: MenuKeyDownEscape + }); + }, + Enter: function Enter(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnter + }); + }, + ' ': function _(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownSpaceButton + }); + } + }; + }, [dispatch]); + + // Action functions. + var toggleMenu = useCallback(function () { + dispatch({ + type: FunctionToggleMenu$1 + }); + }, [dispatch]); + var closeMenu = useCallback(function () { + dispatch({ + type: FunctionCloseMenu$1 + }); + }, [dispatch]); + var openMenu = useCallback(function () { + dispatch({ + type: FunctionOpenMenu$1 + }); + }, [dispatch]); + var setHighlightedIndex = useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex$1, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem$1, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var reset = useCallback(function () { + dispatch({ + type: FunctionReset$2 + }); + }, [dispatch]); + var setInputValue = useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue$1, + inputValue: newInputValue + }); + }, [dispatch]); + // Getter functions. + var getLabelProps = useCallback(function (labelProps) { + return _extends({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.toggleButtonId + }, labelProps); + }, []); + var getMenuProps = useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + onKeyDown = _ref.onKeyDown, + onBlur = _ref.onBlur, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$3); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + var latestState = latest.current.state; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.tabIndex = -1, _extends2), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + onMouseLeave: callAllEventHandlers(onMouseLeave, function menuHandleMouseLeave() { + dispatch({ + type: MenuMouseLeave$1 + }); + }), + onKeyDown: callAllEventHandlers(onKeyDown, function menuHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && menuKeyDownHandlers[key]) { + menuKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: MenuKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }), + onBlur: callAllEventHandlers(onBlur, function menuHandleBlur() { + // if the blur was a result of selection, we don't trigger this action. + if (shouldBlurRef.current === false) { + shouldBlurRef.current = true; + return; + } + var shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown; + /* istanbul ignore else */ + if (shouldBlur) { + dispatch({ + type: MenuBlur + }); + } + }) + }, rest); + }, [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getToggleButtonProps = useCallback(function (_temp3, _temp4) { + var _extends3; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$2); + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$suppressRefErro = _ref4.suppressRefError, + suppressRefError = _ref4$suppressRefErro === void 0 ? false : _ref4$suppressRefErro; + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick$1 + }); + }; + var toggleButtonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && toggleButtonKeyDownHandlers[key]) { + toggleButtonKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: ToggleButtonKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }; + var toggleProps = _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends3.id = elementIdsRef.current.toggleButtonId, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-labelledby'] = elementIdsRef.current.labelId + " " + elementIdsRef.current.toggleButtonId, _extends3), rest); + if (!rest.disabled) { + toggleProps.onClick = callAllEventHandlers(onClick, toggleButtonHandleClick); + toggleProps.onKeyDown = callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown); + } + setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef); + return toggleProps; + }, [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo]); + var getItemProps = useCallback(function (_temp5) { + var _extends4; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + item = _ref5.item, + index = _ref5.index, + onMouseMove = _ref5.onMouseMove, + onClick = _ref5.onClick, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose(_ref5, _excluded3$1); + var _latest$current = latest.current, + latestState = _latest$current.state, + latestProps = _latest$current.props; + var itemHandleMouseMove = function () { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove$1, + index: index + }); + }; + var itemHandleClick = function () { + dispatch({ + type: ItemClick$1, + index: index + }); + }; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var itemProps = _extends((_extends4 = { + role: 'option', + 'aria-selected': "" + (itemIndex === latestState.highlightedIndex), + id: elementIdsRef.current.getItemId(itemIndex) + }, _extends4[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends4), rest); + if (!rest.disabled) { + itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove); + itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick); + } + return itemProps; + }, [dispatch, latest]); + return { + // prop getters. + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getItemProps: getItemProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + selectItem: selectItem, + reset: reset, + setInputValue: setInputValue, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} + +var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0; +var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1; +var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2; +var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3; +var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4; +var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5; +var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6; +var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7; +var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8; +var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9; +var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 10; +var ToggleButtonClick = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11; +var FunctionToggleMenu = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12; +var FunctionOpenMenu = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13; +var FunctionCloseMenu = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14; +var FunctionSetHighlightedIndex = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15; +var FunctionSelectItem = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16; +var FunctionSetInputValue = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17; +var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18; +var ControlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__controlled_prop_updated_selected_item__' : 19; + +var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + InputKeyDownArrowDown: InputKeyDownArrowDown, + InputKeyDownArrowUp: InputKeyDownArrowUp, + InputKeyDownEscape: InputKeyDownEscape, + InputKeyDownHome: InputKeyDownHome, + InputKeyDownEnd: InputKeyDownEnd, + InputKeyDownEnter: InputKeyDownEnter, + InputChange: InputChange, + InputBlur: InputBlur, + MenuMouseLeave: MenuMouseLeave, + ItemMouseMove: ItemMouseMove, + ItemClick: ItemClick, + ToggleButtonClick: ToggleButtonClick, + FunctionToggleMenu: FunctionToggleMenu, + FunctionOpenMenu: FunctionOpenMenu, + FunctionCloseMenu: FunctionCloseMenu, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex, + FunctionSelectItem: FunctionSelectItem, + FunctionSetInputValue: FunctionSetInputValue, + FunctionReset: FunctionReset$1, + ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem +}); + +var _excluded$2 = ["id", "inputId"]; +function getElementIds(_ref) { + var id = _ref.id, + inputId = _ref.inputId, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$2); + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return _extends({ + inputId: inputId || uniqueId + "-input" + }, getElementIds$1(_extends({ + id: id + }, rest))); +} +function getInitialState$1(props) { + var initialState = getInitialState$2(props); + var selectedItem = initialState.selectedItem; + var inputValue = initialState.inputValue; + if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) { + inputValue = props.itemToString(selectedItem); + } + return _extends({}, initialState, { + inputValue: inputValue + }); +} +var propTypes = { + items: PropTypes.array.isRequired, + itemToString: PropTypes.func, + getA11yStatusMessage: PropTypes.func, + getA11ySelectionMessage: PropTypes.func, + circularNavigation: PropTypes.bool, + highlightedIndex: PropTypes.number, + defaultHighlightedIndex: PropTypes.number, + initialHighlightedIndex: PropTypes.number, + isOpen: PropTypes.bool, + defaultIsOpen: PropTypes.bool, + initialIsOpen: PropTypes.bool, + selectedItem: PropTypes.any, + initialSelectedItem: PropTypes.any, + defaultSelectedItem: PropTypes.any, + inputValue: PropTypes.string, + defaultInputValue: PropTypes.string, + initialInputValue: PropTypes.string, + id: PropTypes.string, + labelId: PropTypes.string, + menuId: PropTypes.string, + getItemId: PropTypes.func, + inputId: PropTypes.string, + toggleButtonId: PropTypes.string, + stateReducer: PropTypes.func, + onSelectedItemChange: PropTypes.func, + onHighlightedIndexChange: PropTypes.func, + onStateChange: PropTypes.func, + onIsOpenChange: PropTypes.func, + onInputValueChange: PropTypes.func, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }) +}; + +/** + * The useCombobox version of useControlledReducer, which also + * checks if the controlled prop selectedItem changed between + * renders. If so, it will also update inputValue with its + * string equivalent. It uses the common useEnhancedReducer to + * compute the rest of the state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useControlledReducer(reducer, initialState, props) { + var previousSelectedItemRef = useRef(); + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + + // ToDo: if needed, make same approach as selectedItemChanged from Downshift. + if (isControlledProp(props, 'selectedItem')) { + if (previousSelectedItemRef.current !== props.selectedItem) { + dispatch({ + type: ControlledPropUpdatedSelectedItem, + inputValue: props.itemToString(props.selectedItem) + }); + } + previousSelectedItemRef.current = state.selectedItem === previousSelectedItemRef.current ? props.selectedItem : state.selectedItem; + } + return [getState(state, props), dispatch]; +} +var defaultProps$1 = _extends({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage$1, + circularNavigation: true +}); + +/* eslint-disable complexity */ +function downshiftUseComboboxReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index], + inputValue: props.itemToString(props.items[action.index]) + }; + break; + case InputKeyDownArrowDown: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownArrowUp: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownEnter: + changes = _extends({}, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: props.itemToString(props.items[state.highlightedIndex]) + }); + break; + case InputKeyDownEscape: + changes = { + isOpen: false, + selectedItem: null, + highlightedIndex: -1, + inputValue: '' + }; + break; + case InputKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputBlur: + changes = _extends({ + isOpen: false + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + inputValue: props.itemToString(props.items[state.highlightedIndex]), + highlightedIndex: -1 + }); + break; + case InputChange: + changes = { + isOpen: true, + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: action.inputValue + }; + break; + case MenuMouseLeave: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick: + case FunctionToggleMenu: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem: + changes = { + selectedItem: action.selectedItem, + inputValue: props.itemToString(action.selectedItem) + }; + break; + case ControlledPropUpdatedSelectedItem: + case FunctionSetInputValue: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$1: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends({}, state, changes); +} +/* eslint-enable complexity */ + +var _excluded$1 = ["onMouseLeave", "refKey", "ref"], + _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onClick", "onPress"], + _excluded3 = ["onClick", "onPress", "refKey", "ref"], + _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "refKey", "ref"], + _excluded5 = ["refKey", "ref"]; +var validatePropTypes = process.env.NODE_ENV === 'production' ? /* istanbul ignore next */null : getPropTypesValidator(useCombobox, propTypes); +useCombobox.stateChangeTypes = stateChangeTypes$1; +function useCombobox(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + validatePropTypes(userProps); + } + // Props defaults and destructuring. + var props = _extends({}, defaultProps$1, userProps); + var initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + getA11yStatusMessage = props.getA11yStatusMessage, + getA11ySelectionMessage = props.getA11ySelectionMessage, + itemToString = props.itemToString; + // Initial state depending on controlled props. + var initialState = getInitialState$1(props); + var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, initialState, props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element refs. + var menuRef = useRef(null); + var itemRefs = useRef(); + var inputRef = useRef(null); + var toggleButtonRef = useRef(null); + var comboboxRef = useRef(null); + itemRefs.current = {}; + // used not to scroll on highlight by mouse. + var shouldScrollRef = useRef(true); + var isInitialMountRef = useRef(true); + // prevent id re-generation between renders. + var elementIdsRef = useRef(getElementIds(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = useRef(); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = useRef(props); + // used to store information about getter props being called on render. + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Scroll on highlighted item if change comes from keyboard. + useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + // Controls the focus on the menu or the toggle button. + useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if (initialIsOpen || defaultIsOpen || isOpen) { + if (inputRef.current) { + inputRef.current.focus(); + } + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [comboboxRef, menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: InputBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getComboboxProps', 'getMenuProps'); + // Make initial ref false. + useEffect(function () { + isInitialMountRef.current = false; + }, []); + + /* Event handler functions */ + var inputKeyDownHandlers = useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowDown, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowUp, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: InputKeyDownEscape + }); + }, + Enter: function Enter(event) { + // if IME composing, wait for next Enter keydown event. + if (event.which === 229) { + return; + } + var latestState = latest.current.state; + if (latestState.isOpen && latestState.highlightedIndex > -1) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnter, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + } + }; + }, [dispatch, latest]); + + // Getter props. + var getLabelProps = useCallback(function (labelProps) { + return _extends({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.inputId + }, labelProps); + }, []); + var getMenuProps = useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$1); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () { + dispatch({ + type: MenuMouseLeave + }); + }), _extends2), rest); + }, [dispatch, setGetterPropCallInfo]); + var getItemProps = useCallback(function (_temp3) { + var _extends3, _ref4; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + item = _ref3.item, + index = _ref3.index, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onMouseMove = _ref3.onMouseMove, + onClick = _ref3.onClick; + _ref3.onPress; + var rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$1); + var _latest$current = latest.current, + latestProps = _latest$current.props, + latestState = _latest$current.state; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var onSelectKey = 'onClick'; + var customClickHandler = onClick; + return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends3.role = 'option', _extends3['aria-selected'] = "" + (itemIndex === latestState.highlightedIndex), _extends3.id = elementIdsRef.current.getItemId(itemIndex), _extends3), !rest.disabled && (_ref4 = { + onMouseMove: callAllEventHandlers(onMouseMove, function itemHandleMouseMove() { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove, + index: index + }); + }) + }, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, function itemHandleClick() { + dispatch({ + type: ItemClick, + index: index + }); + }), _ref4), rest); + }, [dispatch, latest]); + var getToggleButtonProps = useCallback(function (_temp4) { + var _extends4; + var _ref5 = _temp4 === void 0 ? {} : _temp4, + onClick = _ref5.onClick; + _ref5.onPress; + var _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose(_ref5, _excluded3); + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick + }); + if (!latest.current.state.isOpen && inputRef.current) { + inputRef.current.focus(); + } + }; + return _extends((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends4.id = elementIdsRef.current.toggleButtonId, _extends4.tabIndex = -1, _extends4), !rest.disabled && _extends({}, { + onClick: callAllEventHandlers(onClick, toggleButtonHandleClick) + }), rest); + }, [dispatch, latest]); + var getInputProps = useCallback(function (_temp5, _temp6) { + var _extends5; + var _ref6 = _temp5 === void 0 ? {} : _temp5, + onKeyDown = _ref6.onKeyDown, + onChange = _ref6.onChange, + onInput = _ref6.onInput, + onBlur = _ref6.onBlur; + _ref6.onChangeText; + var _ref6$refKey = _ref6.refKey, + refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey, + ref = _ref6.ref, + rest = _objectWithoutPropertiesLoose(_ref6, _excluded4); + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressRefErro = _ref7.suppressRefError, + suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro; + setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef); + var latestState = latest.current.state; + var inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && inputKeyDownHandlers[key]) { + inputKeyDownHandlers[key](event); + } + }; + var inputHandleChange = function (event) { + dispatch({ + type: InputChange, + inputValue: event.target.value + }); + }; + var inputHandleBlur = function () { + /* istanbul ignore else */ + if (!mouseAndTouchTrackersRef.current.isMouseDown) { + dispatch({ + type: InputBlur + }); + } + }; + + /* istanbul ignore next (preact) */ + var onChangeKey = 'onChange'; + var eventHandlers = {}; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + return _extends((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) { + inputRef.current = inputNode; + }), _extends5.id = elementIdsRef.current.inputId, _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIdsRef.current.menuId, _extends5), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + 'aria-labelledby': elementIdsRef.current.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: latestState.inputValue + }, eventHandlers, rest); + }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getComboboxProps = useCallback(function (_temp7, _temp8) { + var _extends6; + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$refKey = _ref8.refKey, + refKey = _ref8$refKey === void 0 ? 'ref' : _ref8$refKey, + ref = _ref8.ref, + rest = _objectWithoutPropertiesLoose(_ref8, _excluded5); + var _ref9 = _temp8 === void 0 ? {} : _temp8, + _ref9$suppressRefErro = _ref9.suppressRefError, + suppressRefError = _ref9$suppressRefErro === void 0 ? false : _ref9$suppressRefErro; + setGetterPropCallInfo('getComboboxProps', suppressRefError, refKey, comboboxRef); + return _extends((_extends6 = {}, _extends6[refKey] = handleRefs(ref, function (comboboxNode) { + comboboxRef.current = comboboxNode; + }), _extends6.role = 'combobox', _extends6['aria-haspopup'] = 'listbox', _extends6['aria-owns'] = elementIdsRef.current.menuId, _extends6['aria-expanded'] = latest.current.state.isOpen, _extends6), rest); + }, [latest, setGetterPropCallInfo]); + + // returns + var toggleMenu = useCallback(function () { + dispatch({ + type: FunctionToggleMenu + }); + }, [dispatch]); + var closeMenu = useCallback(function () { + dispatch({ + type: FunctionCloseMenu + }); + }, [dispatch]); + var openMenu = useCallback(function () { + dispatch({ + type: FunctionOpenMenu + }); + }, [dispatch]); + var setHighlightedIndex = useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var setInputValue = useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue, + inputValue: newInputValue + }); + }, [dispatch]); + var reset = useCallback(function () { + dispatch({ + type: FunctionReset$1 + }); + }, [dispatch]); + return { + // prop getters. + getItemProps: getItemProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getComboboxProps: getComboboxProps, + getToggleButtonProps: getToggleButtonProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + setInputValue: setInputValue, + selectItem: selectItem, + reset: reset, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} + +var defaultStateValues = { + activeIndex: -1, + selectedItems: [] +}; + +/** + * Returns the initial value for a state key in the following order: + * 1. controlled prop, 2. initial prop, 3. default prop, 4. default + * value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ +function getInitialValue(props, propKey) { + return getInitialValue$1(props, propKey, defaultStateValues); +} + +/** + * Returns the default value for a state key in the following order: + * 1. controlled prop, 2. default prop, 3. default value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ +function getDefaultValue(props, propKey) { + return getDefaultValue$1(props, propKey, defaultStateValues); +} + +/** + * Gets the initial state based on the provided props. It uses initial, default + * and controlled props related to state in order to compute the initial value. + * + * @param {Object} props Props passed to the hook. + * @returns {Object} The initial state. + */ +function getInitialState(props) { + var activeIndex = getInitialValue(props, 'activeIndex'); + var selectedItems = getInitialValue(props, 'selectedItems'); + return { + activeIndex: activeIndex, + selectedItems: selectedItems + }; +} + +/** + * Returns true if dropdown keydown operation is permitted. Should not be + * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on + * input element with text content that is either highlighted or selection + * cursor is not at the starting position. + * + * @param {KeyboardEvent} event The event from keydown. + * @returns {boolean} Whether the operation is allowed. + */ +function isKeyDownOperationPermitted(event) { + if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) { + return false; + } + var element = event.target; + if (element instanceof HTMLInputElement && + // if element is a text input + element.value !== '' && ( + // and we have text in it + // and cursor is either not at the start or is currently highlighting text. + element.selectionStart !== 0 || element.selectionEnd !== 0)) { + return false; + } + return true; +} + +/** + * Returns a message to be added to aria-live region when item is removed. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ +function getA11yRemovalMessage(selectionParameters) { + var removedSelectedItem = selectionParameters.removedSelectedItem, + itemToStringLocal = selectionParameters.itemToString; + return itemToStringLocal(removedSelectedItem) + " has been removed."; +} +({ + selectedItems: PropTypes.array, + initialSelectedItems: PropTypes.array, + defaultSelectedItems: PropTypes.array, + itemToString: PropTypes.func, + getA11yRemovalMessage: PropTypes.func, + stateReducer: PropTypes.func, + activeIndex: PropTypes.number, + initialActiveIndex: PropTypes.number, + defaultActiveIndex: PropTypes.number, + onActiveIndexChange: PropTypes.func, + onSelectedItemsChange: PropTypes.func, + keyNavigationNext: PropTypes.string, + keyNavigationPrevious: PropTypes.string, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }) +}); +var defaultProps = { + itemToString: defaultProps$3.itemToString, + stateReducer: defaultProps$3.stateReducer, + environment: defaultProps$3.environment, + getA11yRemovalMessage: getA11yRemovalMessage, + keyNavigationNext: 'ArrowRight', + keyNavigationPrevious: 'ArrowLeft' +}; + +var SelectedItemClick = process.env.NODE_ENV !== "production" ? '__selected_item_click__' : 0; +var SelectedItemKeyDownDelete = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_delete__' : 1; +var SelectedItemKeyDownBackspace = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_backspace__' : 2; +var SelectedItemKeyDownNavigationNext = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_navigation_next__' : 3; +var SelectedItemKeyDownNavigationPrevious = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_navigation_previous__' : 4; +var DropdownKeyDownNavigationPrevious = process.env.NODE_ENV !== "production" ? '__dropdown_keydown_navigation_previous__' : 5; +var DropdownKeyDownBackspace = process.env.NODE_ENV !== "production" ? '__dropdown_keydown_backspace__' : 6; +var DropdownClick = process.env.NODE_ENV !== "production" ? '__dropdown_click__' : 7; +var FunctionAddSelectedItem = process.env.NODE_ENV !== "production" ? '__function_add_selected_item__' : 8; +var FunctionRemoveSelectedItem = process.env.NODE_ENV !== "production" ? '__function_remove_selected_item__' : 9; +var FunctionSetSelectedItems = process.env.NODE_ENV !== "production" ? '__function_set_selected_items__' : 10; +var FunctionSetActiveIndex = process.env.NODE_ENV !== "production" ? '__function_set_active_index__' : 11; +var FunctionReset = process.env.NODE_ENV !== "production" ? '__function_reset__' : 12; + +var stateChangeTypes = /*#__PURE__*/Object.freeze({ + __proto__: null, + SelectedItemClick: SelectedItemClick, + SelectedItemKeyDownDelete: SelectedItemKeyDownDelete, + SelectedItemKeyDownBackspace: SelectedItemKeyDownBackspace, + SelectedItemKeyDownNavigationNext: SelectedItemKeyDownNavigationNext, + SelectedItemKeyDownNavigationPrevious: SelectedItemKeyDownNavigationPrevious, + DropdownKeyDownNavigationPrevious: DropdownKeyDownNavigationPrevious, + DropdownKeyDownBackspace: DropdownKeyDownBackspace, + DropdownClick: DropdownClick, + FunctionAddSelectedItem: FunctionAddSelectedItem, + FunctionRemoveSelectedItem: FunctionRemoveSelectedItem, + FunctionSetSelectedItems: FunctionSetSelectedItems, + FunctionSetActiveIndex: FunctionSetActiveIndex, + FunctionReset: FunctionReset +}); + +/* eslint-disable complexity */ +function downshiftMultipleSelectionReducer(state, action) { + var type = action.type, + index = action.index, + props = action.props, + selectedItem = action.selectedItem; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + var changes; + switch (type) { + case SelectedItemClick: + changes = { + activeIndex: index + }; + break; + case SelectedItemKeyDownNavigationPrevious: + changes = { + activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1 + }; + break; + case SelectedItemKeyDownNavigationNext: + changes = { + activeIndex: activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1 + }; + break; + case SelectedItemKeyDownBackspace: + case SelectedItemKeyDownDelete: + { + var newActiveIndex = activeIndex; + if (selectedItems.length === 1) { + newActiveIndex = -1; + } else if (activeIndex === selectedItems.length - 1) { + newActiveIndex = selectedItems.length - 2; + } + changes = _extends({ + selectedItems: [].concat(selectedItems.slice(0, activeIndex), selectedItems.slice(activeIndex + 1)) + }, { + activeIndex: newActiveIndex + }); + break; + } + case DropdownKeyDownNavigationPrevious: + changes = { + activeIndex: selectedItems.length - 1 + }; + break; + case DropdownKeyDownBackspace: + changes = { + selectedItems: selectedItems.slice(0, selectedItems.length - 1) + }; + break; + case FunctionAddSelectedItem: + changes = { + selectedItems: [].concat(selectedItems, [selectedItem]) + }; + break; + case DropdownClick: + changes = { + activeIndex: -1 + }; + break; + case FunctionRemoveSelectedItem: + { + var _newActiveIndex = activeIndex; + var selectedItemIndex = selectedItems.indexOf(selectedItem); + if (selectedItems.length === 1) { + _newActiveIndex = -1; + } else if (selectedItemIndex === selectedItems.length - 1) { + _newActiveIndex = selectedItems.length - 2; + } + changes = _extends({ + selectedItems: [].concat(selectedItems.slice(0, selectedItemIndex), selectedItems.slice(selectedItemIndex + 1)) + }, { + activeIndex: _newActiveIndex + }); + break; + } + case FunctionSetSelectedItems: + { + var newSelectedItems = action.selectedItems; + changes = { + selectedItems: newSelectedItems + }; + break; + } + case FunctionSetActiveIndex: + { + var _newActiveIndex2 = action.activeIndex; + changes = { + activeIndex: _newActiveIndex2 + }; + break; + } + case FunctionReset: + changes = { + activeIndex: getDefaultValue(props, 'activeIndex'), + selectedItems: getDefaultValue(props, 'selectedItems') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends({}, state, changes); +} + +var _excluded = ["refKey", "ref", "onClick", "onKeyDown", "selectedItem", "index"], + _excluded2 = ["refKey", "ref", "onKeyDown", "onClick", "preventKeyAction"]; +useMultipleSelection.stateChangeTypes = stateChangeTypes; +function useMultipleSelection(userProps) { + if (userProps === void 0) { + userProps = {}; + } + // Props defaults and destructuring. + var props = _extends({}, defaultProps, userProps); + var getA11yRemovalMessage = props.getA11yRemovalMessage, + itemToString = props.itemToString, + environment = props.environment, + keyNavigationNext = props.keyNavigationNext, + keyNavigationPrevious = props.keyNavigationPrevious; + + // Reducer init. + var _useControlledReducer = useControlledReducer$1(downshiftMultipleSelectionReducer, getInitialState(props), props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + + // Refs. + var isInitialMountRef = useRef(true); + var dropdownRef = useRef(null); + var previousSelectedItemsRef = useRef(selectedItems); + var selectedItemRefs = useRef(); + selectedItemRefs.current = []; + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = useRef(props); + var latest = useLatestRef({ + state: state, + props: props + }); + + // Effects. + /* Sets a11y status message on changes in selectedItem. */ + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (selectedItems.length < previousSelectedItemsRef.current.length) { + var removedSelectedItem = previousSelectedItemsRef.current.find(function (item) { + return selectedItems.indexOf(item) < 0; + }); + setStatus(getA11yRemovalMessage({ + itemToString: itemToString, + resultCount: selectedItems.length, + removedSelectedItem: removedSelectedItem, + activeIndex: activeIndex, + activeSelectedItem: selectedItems[activeIndex] + }), environment.document); + } + previousSelectedItemsRef.current = selectedItems; + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItems.length]); + // Sets focus on active item. + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (activeIndex === -1 && dropdownRef.current) { + dropdownRef.current.focus(); + } else if (selectedItemRefs.current[activeIndex]) { + selectedItemRefs.current[activeIndex].focus(); + } + }, [activeIndex]); + useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps'); + // Make initial ref false. + useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var selectedItemKeyDownHandlers = useMemo(function () { + var _ref; + return _ref = {}, _ref[keyNavigationPrevious] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationPrevious + }); + }, _ref[keyNavigationNext] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationNext + }); + }, _ref.Delete = function Delete() { + dispatch({ + type: SelectedItemKeyDownDelete + }); + }, _ref.Backspace = function Backspace() { + dispatch({ + type: SelectedItemKeyDownBackspace + }); + }, _ref; + }, [dispatch, keyNavigationNext, keyNavigationPrevious]); + var dropdownKeyDownHandlers = useMemo(function () { + var _ref2; + return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownNavigationPrevious + }); + } + }, _ref2.Backspace = function Backspace(event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownBackspace + }); + } + }, _ref2; + }, [dispatch, keyNavigationPrevious]); + + // Getter props. + var getSelectedItemProps = useCallback(function (_temp) { + var _extends2; + var _ref3 = _temp === void 0 ? {} : _temp, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + selectedItem = _ref3.selectedItem, + index = _ref3.index, + rest = _objectWithoutPropertiesLoose(_ref3, _excluded); + var latestState = latest.current.state; + var itemIndex = getItemIndex(index, selectedItem, latestState.selectedItems); + if (itemIndex < 0) { + throw new Error('Pass either selectedItem or index in getSelectedItemProps!'); + } + return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (selectedItemNode) { + if (selectedItemNode) { + selectedItemRefs.current.push(selectedItemNode); + } + }), _extends2.tabIndex = index === latestState.activeIndex ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, function selectedItemHandleClick() { + dispatch({ + type: SelectedItemClick, + index: index + }); + }), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, function selectedItemHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && selectedItemKeyDownHandlers[key]) { + selectedItemKeyDownHandlers[key](event); + } + }), _extends2), rest); + }, [dispatch, latest, selectedItemKeyDownHandlers]); + var getDropdownProps = useCallback(function (_temp2, _temp3) { + var _extends3; + var _ref4 = _temp2 === void 0 ? {} : _temp2, + _ref4$refKey = _ref4.refKey, + refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey, + ref = _ref4.ref, + onKeyDown = _ref4.onKeyDown, + onClick = _ref4.onClick, + _ref4$preventKeyActio = _ref4.preventKeyAction, + preventKeyAction = _ref4$preventKeyActio === void 0 ? false : _ref4$preventKeyActio, + rest = _objectWithoutPropertiesLoose(_ref4, _excluded2); + var _ref5 = _temp3 === void 0 ? {} : _temp3, + _ref5$suppressRefErro = _ref5.suppressRefError, + suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro; + setGetterPropCallInfo('getDropdownProps', suppressRefError, refKey, dropdownRef); + return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (dropdownNode) { + if (dropdownNode) { + dropdownRef.current = dropdownNode; + } + }), _extends3), !preventKeyAction && { + onKeyDown: callAllEventHandlers(onKeyDown, function dropdownHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && dropdownKeyDownHandlers[key]) { + dropdownKeyDownHandlers[key](event); + } + }), + onClick: callAllEventHandlers(onClick, function dropdownHandleClick() { + dispatch({ + type: DropdownClick + }); + }) + }, rest); + }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]); + + // returns + var addSelectedItem = useCallback(function (selectedItem) { + dispatch({ + type: FunctionAddSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var removeSelectedItem = useCallback(function (selectedItem) { + dispatch({ + type: FunctionRemoveSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var setSelectedItems = useCallback(function (newSelectedItems) { + dispatch({ + type: FunctionSetSelectedItems, + selectedItems: newSelectedItems + }); + }, [dispatch]); + var setActiveIndex = useCallback(function (newActiveIndex) { + dispatch({ + type: FunctionSetActiveIndex, + activeIndex: newActiveIndex + }); + }, [dispatch]); + var reset = useCallback(function () { + dispatch({ + type: FunctionReset + }); + }, [dispatch]); + return { + getSelectedItemProps: getSelectedItemProps, + getDropdownProps: getDropdownProps, + addSelectedItem: addSelectedItem, + removeSelectedItem: removeSelectedItem, + setSelectedItems: setSelectedItems, + setActiveIndex: setActiveIndex, + reset: reset, + selectedItems: selectedItems, + activeIndex: activeIndex + }; +} + +export { Downshift$1 as default, resetIdCounter, useCombobox, useMultipleSelection, useSelect }; diff --git a/dist/downshift.native.cjs.js b/dist/downshift.native.cjs.js new file mode 100644 index 000000000..970542e8c --- /dev/null +++ b/dist/downshift.native.cjs.js @@ -0,0 +1,3776 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var _objectWithoutPropertiesLoose = require('@babel/runtime/helpers/objectWithoutPropertiesLoose'); +var _extends = require('@babel/runtime/helpers/extends'); +var _assertThisInitialized = require('@babel/runtime/helpers/assertThisInitialized'); +var _inheritsLoose = require('@babel/runtime/helpers/inheritsLoose'); +var PropTypes = require('prop-types'); +var react = require('react'); +var reactIs = require('react-is'); +var computeScrollIntoView = require('compute-scroll-into-view'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var _objectWithoutPropertiesLoose__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutPropertiesLoose); +var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends); +var _assertThisInitialized__default = /*#__PURE__*/_interopDefaultLegacy(_assertThisInitialized); +var _inheritsLoose__default = /*#__PURE__*/_interopDefaultLegacy(_inheritsLoose); +var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes); +var computeScrollIntoView__default = /*#__PURE__*/_interopDefaultLegacy(computeScrollIntoView); + +var idCounter = 0; + +/** + * Accepts a parameter and returns it if it's a function + * or a noop function if it's not. This allows us to + * accept a callback, but not worry about it if it's not + * passed. + * @param {Function} cb the callback + * @return {Function} a function + */ +function cbToCb(cb) { + return typeof cb === 'function' ? cb : noop; +} +function noop() {} + +/** + * Scroll node into view if necessary + * @param {HTMLElement} node the element that should scroll into view + * @param {HTMLElement} menuNode the menu element of the component + */ +function scrollIntoView(node, menuNode) { + if (!node) { + return; + } + var actions = computeScrollIntoView__default["default"](node, { + boundary: menuNode, + block: 'nearest', + scrollMode: 'if-needed' + }); + actions.forEach(function (_ref) { + var el = _ref.el, + top = _ref.top, + left = _ref.left; + el.scrollTop = top; + el.scrollLeft = left; + }); +} + +/** + * @param {HTMLElement} parent the parent node + * @param {HTMLElement} child the child node + * @return {Boolean} whether the parent is the child or the child is in the parent + */ +function isOrContainsNode(parent, child) { + return parent === child || parent.contains && parent.contains(child); +} + +/** + * Simple debounce implementation. Will call the given + * function once after the time given has passed since + * it was last called. + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + * @return {Function} the debounced function + */ +function debounce(fn, time) { + var timeoutId; + function cancel() { + if (timeoutId) { + clearTimeout(timeoutId); + } + } + function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + cancel(); + timeoutId = setTimeout(function () { + timeoutId = null; + fn.apply(void 0, args); + }, time); + } + wrapper.cancel = cancel; + return wrapper; +} + +/** + * This is intended to be used to compose event handlers. + * They are executed in order until one of them sets + * `event.preventDownshiftDefault = true`. + * @param {...Function} fns the event handler functions + * @return {Function} the event handler to add to an element + */ +function callAllEventHandlers() { + for (var _len2 = arguments.length, fns = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + fns[_key2] = arguments[_key2]; + } + return function (event) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return fns.some(function (fn) { + if (fn) { + fn.apply(void 0, [event].concat(args)); + } + return event.preventDownshiftDefault || event.hasOwnProperty('nativeEvent') && event.nativeEvent.preventDownshiftDefault; + }); + }; +} +function handleRefs() { + for (var _len4 = arguments.length, refs = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + refs[_key4] = arguments[_key4]; + } + return function (node) { + refs.forEach(function (ref) { + if (typeof ref === 'function') { + ref(node); + } else if (ref) { + ref.current = node; + } + }); + }; +} + +/** + * This generates a unique ID for an instance of Downshift + * @return {String} the unique ID + */ +function generateId() { + return String(idCounter++); +} + +/** + * Resets idCounter to 0. Used for SSR. + */ +function resetIdCounter() { + idCounter = 0; +} + +/** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ +function getA11yStatusMessage$1(_ref2) { + var isOpen = _ref2.isOpen, + resultCount = _ref2.resultCount, + previousResultCount = _ref2.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter key to select."; + } + return ''; +} + +/** + * Takes an argument and if it's an array, returns the first item in the array + * otherwise returns the argument + * @param {*} arg the maybe-array + * @param {*} defaultValue the value if arg is falsey not defined + * @return {*} the arg or it's first item + */ +function unwrapArray(arg, defaultValue) { + arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */arg[0] : arg; + if (!arg && defaultValue) { + return defaultValue; + } else { + return arg; + } +} + +/** + * @param {Object} element (P)react element + * @return {Boolean} whether it's a DOM element + */ +function isDOMElement(element) { + // then we assume this is react + return typeof element.type === 'string'; +} + +/** + * @param {Object} element (P)react element + * @return {Object} the props + */ +function getElementProps(element) { + return element.props; +} + +/** + * Throws a helpful error message for required properties. Useful + * to be used as a default in destructuring or object params. + * @param {String} fnName the function name + * @param {String} propName the prop name + */ +function requiredProp(fnName, propName) { + // eslint-disable-next-line no-console + console.error("The property \"" + propName + "\" is required in \"" + fnName + "\""); +} +var stateKeys = ['highlightedIndex', 'inputValue', 'isOpen', 'selectedItem', 'type']; +/** + * @param {Object} state the state object + * @return {Object} state that is relevant to downshift + */ +function pickState(state) { + if (state === void 0) { + state = {}; + } + var result = {}; + stateKeys.forEach(function (k) { + if (state.hasOwnProperty(k)) { + result[k] = state[k]; + } + }); + return result; +} + +/** + * This will perform a shallow merge of the given state object + * with the state coming from props + * (for the controlled component scenario) + * This is used in state updater functions so they're referencing + * the right state regardless of where it comes from. + * + * @param {Object} state The state of the component/hook. + * @param {Object} props The props that may contain controlled values. + * @returns {Object} The merged controlled state. + */ +function getState(state, props) { + return Object.keys(state).reduce(function (prevState, key) { + prevState[key] = isControlledProp(props, key) ? props[key] : state[key]; + return prevState; + }, {}); +} + +/** + * This determines whether a prop is a "controlled prop" meaning it is + * state which is controlled by the outside of this component rather + * than within this component. + * + * @param {Object} props The props that may contain controlled values. + * @param {String} key the key to check + * @return {Boolean} whether it is a controlled controlled prop + */ +function isControlledProp(props, key) { + return props[key] !== undefined; +} + +/** + * Normalizes the 'key' property of a KeyboardEvent in IE/Edge + * @param {Object} event a keyboardEvent object + * @return {String} keyboard key + */ +function normalizeArrowKey(event) { + var key = event.key, + keyCode = event.keyCode; + /* istanbul ignore next (ie) */ + if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) { + return "Arrow" + key; + } + return key; +} + +/** + * Simple check if the value passed is object literal + * @param {*} obj any things + * @return {Boolean} whether it's object literal + */ +function isPlainObject(obj) { + return Object.prototype.toString.call(obj) === '[object Object]'; +} + +/** + * Returns the new index in the list, in a circular way. If next value is out of bonds from the total, + * it will wrap to either 0 or itemCount - 1. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @returns {number} The new index after the move. + */ +function getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + if (circular === void 0) { + circular = true; + } + if (itemCount === 0) { + return -1; + } + var itemsLastIndex = itemCount - 1; + if (typeof baseIndex !== 'number' || baseIndex < 0 || baseIndex >= itemCount) { + baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1; + } + var newIndex = baseIndex + moveAmount; + if (newIndex < 0) { + newIndex = circular ? itemsLastIndex : 0; + } else if (newIndex > itemsLastIndex) { + newIndex = circular ? 0 : itemsLastIndex; + } + var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular); + return nonDisabledNewIndex === -1 ? baseIndex : nonDisabledNewIndex; +} + +/** + * Returns the next index in the list of an item that is not disabled. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @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. + */ +function getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + var currentElementNode = getItemNodeFromIndex(baseIndex); + if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) { + return baseIndex; + } + if (moveAmount > 0) { + for (var index = baseIndex + 1; index < itemCount; index++) { + if (!getItemNodeFromIndex(index).hasAttribute('disabled')) { + return index; + } + } + } else { + for (var _index = baseIndex - 1; _index >= 0; _index--) { + if (!getItemNodeFromIndex(_index).hasAttribute('disabled')) { + return _index; + } + } + } + if (circular) { + return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false); + } + return -1; +} + +/** + * Checks if event target is within the downshift elements. + * + * @param {EventTarget} target Target to check. + * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc). + * @param {Document} document The document. + * @param {boolean} checkActiveElement Whether to also check activeElement. + * + * @returns {boolean} Whether or not the target is within downshift elements. + */ +function targetWithinDownshift(target, downshiftElements, document, checkActiveElement) { + if (checkActiveElement === void 0) { + checkActiveElement = true; + } + return downshiftElements.some(function (contextNode) { + return contextNode && (isOrContainsNode(contextNode, target) || checkActiveElement && isOrContainsNode(contextNode, document.activeElement)); + }); +} +function validateControlledUnchanged(state, prevProps, nextProps) { + if (process.env.NODE_ENV === 'production') { + return; + } + var warningDescription = "This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props"; + Object.keys(state).forEach(function (propKey) { + if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the controlled prop \"" + propKey + "\" to be uncontrolled. " + warningDescription); + } else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the uncontrolled prop \"" + propKey + "\" to be controlled. " + warningDescription); + } + }); +} + +var cleanupStatus = debounce(function () { + getStatusDiv().textContent = ''; +}, 500); + +/** + * @param {String} status the status message + * @param {Object} documentProp document passed by the user. + */ +function setStatus(status, documentProp) { + var div = getStatusDiv(documentProp); + if (!status) { + return; + } + div.textContent = status; + cleanupStatus(); +} + +/** + * Get the status node or create it if it does not already exist. + * @param {Object} documentProp document passed by the user. + * @return {HTMLElement} the status node. + */ +function getStatusDiv(documentProp) { + if (documentProp === void 0) { + documentProp = document; + } + var statusDiv = documentProp.getElementById('a11y-status-message'); + if (statusDiv) { + return statusDiv; + } + statusDiv = documentProp.createElement('div'); + statusDiv.setAttribute('id', 'a11y-status-message'); + statusDiv.setAttribute('role', 'status'); + statusDiv.setAttribute('aria-live', 'polite'); + statusDiv.setAttribute('aria-relevant', 'additions text'); + Object.assign(statusDiv.style, { + border: '0', + clip: 'rect(0 0 0 0)', + height: '1px', + margin: '-1px', + overflow: 'hidden', + padding: '0', + position: 'absolute', + width: '1px' + }); + documentProp.body.appendChild(statusDiv); + return statusDiv; +} + +var unknown = process.env.NODE_ENV !== "production" ? '__autocomplete_unknown__' : 0; +var mouseUp = process.env.NODE_ENV !== "production" ? '__autocomplete_mouseup__' : 1; +var itemMouseEnter = process.env.NODE_ENV !== "production" ? '__autocomplete_item_mouseenter__' : 2; +var keyDownArrowUp = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_arrow_up__' : 3; +var keyDownArrowDown = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_arrow_down__' : 4; +var keyDownEscape = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_escape__' : 5; +var keyDownEnter = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_enter__' : 6; +var keyDownHome = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_home__' : 7; +var keyDownEnd = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_end__' : 8; +var clickItem = process.env.NODE_ENV !== "production" ? '__autocomplete_click_item__' : 9; +var blurInput = process.env.NODE_ENV !== "production" ? '__autocomplete_blur_input__' : 10; +var changeInput = process.env.NODE_ENV !== "production" ? '__autocomplete_change_input__' : 11; +var keyDownSpaceButton = process.env.NODE_ENV !== "production" ? '__autocomplete_keydown_space_button__' : 12; +var clickButton = process.env.NODE_ENV !== "production" ? '__autocomplete_click_button__' : 13; +var blurButton = process.env.NODE_ENV !== "production" ? '__autocomplete_blur_button__' : 14; +var controlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__autocomplete_controlled_prop_updated_selected_item__' : 15; +var touchEnd = process.env.NODE_ENV !== "production" ? '__autocomplete_touchend__' : 16; + +var stateChangeTypes$3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + unknown: unknown, + mouseUp: mouseUp, + itemMouseEnter: itemMouseEnter, + keyDownArrowUp: keyDownArrowUp, + keyDownArrowDown: keyDownArrowDown, + keyDownEscape: keyDownEscape, + keyDownEnter: keyDownEnter, + keyDownHome: keyDownHome, + keyDownEnd: keyDownEnd, + clickItem: clickItem, + blurInput: blurInput, + changeInput: changeInput, + keyDownSpaceButton: keyDownSpaceButton, + clickButton: clickButton, + blurButton: blurButton, + controlledPropUpdatedSelectedItem: controlledPropUpdatedSelectedItem, + touchEnd: touchEnd +}); + +var _excluded$4 = ["refKey", "ref"], + _excluded2$3 = ["onClick", "onPress", "onKeyDown", "onKeyUp", "onBlur"], + _excluded3$2 = ["onKeyDown", "onBlur", "onChange", "onInput", "onChangeText"], + _excluded4$1 = ["refKey", "ref"], + _excluded5$1 = ["onMouseMove", "onMouseDown", "onClick", "onPress", "index", "item"]; +var Downshift = /*#__PURE__*/function () { + var Downshift = /*#__PURE__*/function (_Component) { + _inheritsLoose__default["default"](Downshift, _Component); + function Downshift(_props) { + var _this = _Component.call(this, _props) || this; + // fancy destructuring + defaults + aliases + // this basically says each value of state should either be set to + // the initial value or the default value if the initial value is not provided + _this.id = _this.props.id || "downshift-" + generateId(); + _this.menuId = _this.props.menuId || _this.id + "-menu"; + _this.labelId = _this.props.labelId || _this.id + "-label"; + _this.inputId = _this.props.inputId || _this.id + "-input"; + _this.getItemId = _this.props.getItemId || function (index) { + return _this.id + "-item-" + index; + }; + _this.input = null; + _this.items = []; + // itemCount can be changed asynchronously + // from within downshift (so it can't come from a prop) + // this is why we store it as an instance and use + // getItemCount rather than just use items.length + // (to support windowing + async) + _this.itemCount = null; + _this.previousResultCount = 0; + _this.timeoutIds = []; + /** + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + */ + _this.internalSetTimeout = function (fn, time) { + var id = setTimeout(function () { + _this.timeoutIds = _this.timeoutIds.filter(function (i) { + return i !== id; + }); + fn(); + }, time); + _this.timeoutIds.push(id); + }; + _this.setItemCount = function (count) { + _this.itemCount = count; + }; + _this.unsetItemCount = function () { + _this.itemCount = null; + }; + _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) { + if (highlightedIndex === void 0) { + highlightedIndex = _this.props.defaultHighlightedIndex; + } + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends__default["default"]({ + highlightedIndex: highlightedIndex + }, otherStateToSet)); + }; + _this.clearSelection = function (cb) { + _this.internalSetState({ + selectedItem: null, + inputValue: '', + highlightedIndex: _this.props.defaultHighlightedIndex, + isOpen: _this.props.defaultIsOpen + }, cb); + }; + _this.selectItem = function (item, otherStateToSet, cb) { + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends__default["default"]({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + selectedItem: item, + inputValue: _this.props.itemToString(item) + }, otherStateToSet), cb); + }; + _this.selectItemAtIndex = function (itemIndex, otherStateToSet, cb) { + var item = _this.items[itemIndex]; + if (item == null) { + return; + } + _this.selectItem(item, otherStateToSet, cb); + }; + _this.selectHighlightedItem = function (otherStateToSet, cb) { + return _this.selectItemAtIndex(_this.getState().highlightedIndex, otherStateToSet, cb); + }; + // any piece of our state can live in two places: + // 1. Uncontrolled: it's internal (this.state) + // We will call this.setState to update that state + // 2. Controlled: it's external (this.props) + // We will call this.props.onStateChange to update that state + // + // In addition, we'll call this.props.onChange if the + // selectedItem is changed. + _this.internalSetState = function (stateToSet, cb) { + var isItemSelected, onChangeArg; + var onStateChangeArg = {}; + var isStateToSetFunction = typeof stateToSet === 'function'; + + // we want to call `onInputValueChange` before the `setState` call + // so someone controlling the `inputValue` state gets notified of + // the input change as soon as possible. This avoids issues with + // preserving the cursor position. + // See https://github.com/downshift-js/downshift/issues/217 for more info. + if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(stateToSet.inputValue, _extends__default["default"]({}, _this.getStateAndHelpers(), stateToSet)); + } + return _this.setState(function (state) { + state = _this.getState(state); + var newStateToSet = isStateToSetFunction ? stateToSet(state) : stateToSet; + + // Your own function that could modify the state that will be set. + newStateToSet = _this.props.stateReducer(state, newStateToSet); + + // checks if an item is selected, regardless of if it's different from + // what was selected before + // used to determine if onSelect and onChange callbacks should be called + isItemSelected = newStateToSet.hasOwnProperty('selectedItem'); + // this keeps track of the object we want to call with setState + var nextState = {}; + // we need to call on change if the outside world is controlling any of our state + // and we're trying to update that state. OR if the selection has changed and we're + // trying to update the selection + if (isItemSelected && newStateToSet.selectedItem !== state.selectedItem) { + onChangeArg = newStateToSet.selectedItem; + } + newStateToSet.type = newStateToSet.type || unknown; + Object.keys(newStateToSet).forEach(function (key) { + // onStateChangeArg should only have the state that is + // actually changing + if (state[key] !== newStateToSet[key]) { + onStateChangeArg[key] = newStateToSet[key]; + } + // the type is useful for the onStateChangeArg + // but we don't actually want to set it in internal state. + // this is an undocumented feature for now... Not all internalSetState + // calls support it and I'm not certain we want them to yet. + // But it enables users controlling the isOpen state to know when + // the isOpen state changes due to mouseup events which is quite handy. + if (key === 'type') { + return; + } + newStateToSet[key]; + // if it's coming from props, then we don't care to set it internally + if (!isControlledProp(_this.props, key)) { + nextState[key] = newStateToSet[key]; + } + }); + + // if stateToSet is a function, then we weren't able to call onInputValueChange + // earlier, so we'll call it now that we know what the inputValue state will be. + if (isStateToSetFunction && newStateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(newStateToSet.inputValue, _extends__default["default"]({}, _this.getStateAndHelpers(), newStateToSet)); + } + return nextState; + }, function () { + // call the provided callback if it's a function + cbToCb(cb)(); + + // only call the onStateChange and onChange callbacks if + // we have relevant information to pass them. + var hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1; + if (hasMoreStateThanType) { + _this.props.onStateChange(onStateChangeArg, _this.getStateAndHelpers()); + } + if (isItemSelected) { + _this.props.onSelect(stateToSet.selectedItem, _this.getStateAndHelpers()); + } + if (onChangeArg !== undefined) { + _this.props.onChange(onChangeArg, _this.getStateAndHelpers()); + } + // this is currently undocumented and therefore subject to change + // We'll try to not break it, but just be warned. + _this.props.onUserAction(onStateChangeArg, _this.getStateAndHelpers()); + }); + }; + //////////////////////////// ROOT + _this.rootRef = function (node) { + return _this._rootNode = node; + }; + _this.getRootProps = function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$4); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + // this is used in the render to know whether the user has called getRootProps. + // It uses that to know whether to apply the props automatically + _this.getRootProps.called = true; + _this.getRootProps.refKey = refKey; + _this.getRootProps.suppressRefError = suppressRefError; + var _this$getState = _this.getState(), + isOpen = _this$getState.isOpen; + 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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT + _this.keyDownHandlers = { + ArrowDown: function ArrowDown(event) { + var _this2 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? 5 : 1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowDown + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowDown + }, function () { + var itemCount = _this2.getItemCount(); + if (itemCount > 0) { + var _this2$getState = _this2.getState(), + highlightedIndex = _this2$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) { + return _this2.getItemNodeFromIndex(index); + }); + _this2.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowDown + }); + } + }); + } + }, + ArrowUp: function ArrowUp(event) { + var _this3 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? -5 : -1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowUp + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowUp + }, function () { + var itemCount = _this3.getItemCount(); + if (itemCount > 0) { + var _this3$getState = _this3.getState(), + highlightedIndex = _this3$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) { + return _this3.getItemNodeFromIndex(index); + }); + _this3.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowUp + }); + } + }); + } + }, + Enter: function Enter(event) { + if (event.which === 229) { + return; + } + var _this$getState2 = this.getState(), + isOpen = _this$getState2.isOpen, + highlightedIndex = _this$getState2.highlightedIndex; + if (isOpen && highlightedIndex != null) { + event.preventDefault(); + var item = this.items[highlightedIndex]; + var itemNode = this.getItemNodeFromIndex(highlightedIndex); + if (item == null || itemNode && itemNode.hasAttribute('disabled')) { + return; + } + this.selectHighlightedItem({ + type: keyDownEnter + }); + } + }, + Escape: function Escape(event) { + event.preventDefault(); + this.reset({ + type: keyDownEscape, + selectedItem: null, + inputValue: '' + }); + } + }; + //////////////////////////// BUTTON + _this.buttonKeyDownHandlers = _extends__default["default"]({}, _this.keyDownHandlers, { + ' ': function _(event) { + event.preventDefault(); + this.toggleMenu({ + type: keyDownSpaceButton + }); + } + }); + _this.inputKeyDownHandlers = _extends__default["default"]({}, _this.keyDownHandlers, { + Home: function Home(event) { + var _this4 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState3 = this.getState(), + isOpen = _this$getState3.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting downwards from 0 if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) { + return _this4.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownHome + }); + }, + End: function End(event) { + var _this5 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState4 = this.getState(), + isOpen = _this$getState4.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting upwards from last index if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) { + return _this5.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownEnd + }); + } + }); + _this.getToggleButtonProps = function (_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3; + _ref3.onClick; + var onPress = _ref3.onPress; + _ref3.onKeyDown; + _ref3.onKeyUp; + _ref3.onBlur; + var rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$3); + var _this$getState5 = _this.getState(), + isOpen = _this$getState5.isOpen; + var enabledEventHandlers = /* istanbul ignore next (react-native) */ + { + onPress: callAllEventHandlers(onPress, _this.buttonHandleClick) + }; + var eventHandlers = rest.disabled ? {} : enabledEventHandlers; + return _extends__default["default"]({ + type: 'button', + role: 'button', + 'aria-label': isOpen ? 'close menu' : 'open menu', + 'aria-haspopup': true, + 'data-toggle': true + }, eventHandlers, rest); + }; + _this.buttonHandleKeyUp = function (event) { + // Prevent click event from emitting in Firefox + event.preventDefault(); + }; + _this.buttonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (_this.buttonKeyDownHandlers[key]) { + _this.buttonKeyDownHandlers[key].call(_assertThisInitialized__default["default"](_this), event); + } + }; + _this.buttonHandleClick = function (event) { + event.preventDefault(); + // handle odd case for Safari and Firefox which + // don't give the button the focus properly. + /* istanbul ignore if (can't reasonably test this) */ + + // to simplify testing components that use downshift, we'll not wrap this in a setTimeout + // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated + // when building for production and should therefore have no impact on production code. + if (process.env.NODE_ENV === 'test') { + _this.toggleMenu({ + type: clickButton + }); + } else { + // Ensure that toggle of menu occurs after the potential blur event in iOS + _this.internalSetTimeout(function () { + return _this.toggleMenu({ + type: clickButton + }); + }); + } + }; + _this.buttonHandleBlur = function (event) { + var blurTarget = event.target; // Save blur target for comparison with activeElement later + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element + _this.internalSetTimeout(function () { + if (!_this.isMouseDown && (_this.props.environment.document.activeElement == null || _this.props.environment.document.activeElement.id !== _this.inputId) && _this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS) + ) { + _this.reset({ + type: blurButton + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON + /////////////////////////////// LABEL + _this.getLabelProps = function (props) { + return _extends__default["default"]({ + htmlFor: _this.inputId, + id: _this.labelId + }, props); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL + /////////////////////////////// INPUT + _this.getInputProps = function (_temp4) { + var _ref4 = _temp4 === void 0 ? {} : _temp4, + onKeyDown = _ref4.onKeyDown, + onBlur = _ref4.onBlur, + onChange = _ref4.onChange, + onInput = _ref4.onInput, + onChangeText = _ref4.onChangeText, + rest = _objectWithoutPropertiesLoose__default["default"](_ref4, _excluded3$2); + var onChangeKey; + var eventHandlers = {}; + + /* istanbul ignore next (preact) */ + + onChangeKey = 'onChange'; + var _this$getState6 = _this.getState(), + inputValue = _this$getState6.inputValue, + isOpen = _this$getState6.isOpen, + highlightedIndex = _this$getState6.highlightedIndex; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, _this.inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, _this.inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, _this.inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + eventHandlers = { + onChange: callAllEventHandlers(onChange, onInput, _this.inputHandleChange), + onChangeText: callAllEventHandlers(onChangeText, onInput, function (text) { + return _this.inputHandleChange({ + nativeEvent: { + text: text + } + }); + }), + onBlur: callAllEventHandlers(onBlur, _this.inputHandleBlur) + }; + return _extends__default["default"]({ + 'aria-autocomplete': 'list', + 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null, + 'aria-controls': isOpen ? _this.menuId : null, + 'aria-labelledby': _this.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: inputValue, + id: _this.inputId + }, eventHandlers, rest); + }; + _this.inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && _this.inputKeyDownHandlers[key]) { + _this.inputKeyDownHandlers[key].call(_assertThisInitialized__default["default"](_this), event); + } + }; + _this.inputHandleChange = function (event) { + _this.internalSetState({ + type: changeInput, + isOpen: true, + inputValue: /* istanbul ignore next (react-native) */event.nativeEvent.text, + highlightedIndex: _this.props.defaultHighlightedIndex + }); + }; + _this.inputHandleBlur = function () { + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element + _this.internalSetTimeout(function () { + var downshiftButtonIsActive = _this.props.environment.document && !!_this.props.environment.document.activeElement && !!_this.props.environment.document.activeElement.dataset && _this.props.environment.document.activeElement.dataset.toggle && _this._rootNode && _this._rootNode.contains(_this.props.environment.document.activeElement); + if (!_this.isMouseDown && !downshiftButtonIsActive) { + _this.reset({ + type: blurInput + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT + /////////////////////////////// MENU + _this.menuRef = function (node) { + _this._menuNode = node; + }; + _this.getMenuProps = function (_temp5, _temp6) { + var _extends3; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + props = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded4$1); + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$suppressRefErro = _ref6.suppressRefError, + suppressRefError = _ref6$suppressRefErro === void 0 ? false : _ref6$suppressRefErro; + _this.getMenuProps.called = true; + _this.getMenuProps.refKey = refKey; + _this.getMenuProps.suppressRefError = suppressRefError; + 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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU + /////////////////////////////// ITEM + _this.getItemProps = function (_temp7) { + var _enabledEventHandlers; + var _ref7 = _temp7 === void 0 ? {} : _temp7, + onMouseMove = _ref7.onMouseMove, + onMouseDown = _ref7.onMouseDown; + _ref7.onClick; + var onPress = _ref7.onPress, + index = _ref7.index, + _ref7$item = _ref7.item, + item = _ref7$item === void 0 ? process.env.NODE_ENV === 'production' ? /* istanbul ignore next */undefined : requiredProp('getItemProps', 'item') : _ref7$item, + rest = _objectWithoutPropertiesLoose__default["default"](_ref7, _excluded5$1); + if (index === undefined) { + _this.items.push(item); + index = _this.items.indexOf(item); + } else { + _this.items[index] = item; + } + var onSelectKey = /* istanbul ignore next (react-native) */'onPress'; + var customClickHandler = /* istanbul ignore next (react-native) */onPress; + var enabledEventHandlers = (_enabledEventHandlers = { + // onMouseMove is used over onMouseEnter here. onMouseMove + // is only triggered on actual mouse movement while onMouseEnter + // can fire on DOM changes, interrupting keyboard navigation + onMouseMove: callAllEventHandlers(onMouseMove, function () { + if (index === _this.getState().highlightedIndex) { + return; + } + _this.setHighlightedIndex(index, { + type: itemMouseEnter + }); + + // We never want to manually scroll when changing state based + // on `onMouseMove` because we will be moving the element out + // from under the user which is currently scrolling/moving the + // cursor + _this.avoidScrolling = true; + _this.internalSetTimeout(function () { + return _this.avoidScrolling = false; + }, 250); + }), + onMouseDown: callAllEventHandlers(onMouseDown, function (event) { + // This prevents the activeElement from being changed + // to the item so it can remain with the current activeElement + // which is a more common use case. + event.preventDefault(); + }) + }, _enabledEventHandlers[onSelectKey] = callAllEventHandlers(customClickHandler, function () { + _this.selectItemAtIndex(index, { + type: clickItem + }); + }), _enabledEventHandlers); + + // Passing down the onMouseDown handler to prevent redirect + // of the activeElement if clicking on disabled items + var eventHandlers = rest.disabled ? { + onMouseDown: enabledEventHandlers.onMouseDown + } : enabledEventHandlers; + return _extends__default["default"]({ + id: _this.getItemId(index), + role: 'option', + 'aria-selected': _this.getState().highlightedIndex === index + }, eventHandlers, rest); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM + _this.clearItems = function () { + _this.items = []; + }; + _this.reset = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref8) { + var selectedItem = _ref8.selectedItem; + return _extends__default["default"]({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + inputValue: _this.props.itemToString(selectedItem) + }, otherStateToSet); + }, cb); + }; + _this.toggleMenu = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref9) { + var isOpen = _ref9.isOpen; + return _extends__default["default"]({ + isOpen: !isOpen + }, isOpen && { + highlightedIndex: _this.props.defaultHighlightedIndex + }, otherStateToSet); + }, function () { + var _this$getState7 = _this.getState(), + isOpen = _this$getState7.isOpen, + highlightedIndex = _this$getState7.highlightedIndex; + if (isOpen) { + if (_this.getItemCount() > 0 && typeof highlightedIndex === 'number') { + _this.setHighlightedIndex(highlightedIndex, otherStateToSet); + } + } + cbToCb(cb)(); + }); + }; + _this.openMenu = function (cb) { + _this.internalSetState({ + isOpen: true + }, cb); + }; + _this.closeMenu = function (cb) { + _this.internalSetState({ + isOpen: false + }, cb); + }; + _this.updateStatus = debounce(function () { + var state = _this.getState(); + var item = _this.items[state.highlightedIndex]; + var resultCount = _this.getItemCount(); + var status = _this.props.getA11yStatusMessage(_extends__default["default"]({ + itemToString: _this.props.itemToString, + previousResultCount: _this.previousResultCount, + resultCount: resultCount, + highlightedItem: item + }, state)); + _this.previousResultCount = resultCount; + setStatus(status, _this.props.environment.document); + }, 200); + var _this$props = _this.props, + defaultHighlightedIndex = _this$props.defaultHighlightedIndex, + _this$props$initialHi = _this$props.initialHighlightedIndex, + _highlightedIndex = _this$props$initialHi === void 0 ? defaultHighlightedIndex : _this$props$initialHi, + defaultIsOpen = _this$props.defaultIsOpen, + _this$props$initialIs = _this$props.initialIsOpen, + _isOpen = _this$props$initialIs === void 0 ? defaultIsOpen : _this$props$initialIs, + _this$props$initialIn = _this$props.initialInputValue, + _inputValue = _this$props$initialIn === void 0 ? '' : _this$props$initialIn, + _this$props$initialSe = _this$props.initialSelectedItem, + _selectedItem = _this$props$initialSe === void 0 ? null : _this$props$initialSe; + var _state = _this.getState({ + highlightedIndex: _highlightedIndex, + isOpen: _isOpen, + inputValue: _inputValue, + selectedItem: _selectedItem + }); + if (_state.selectedItem != null && _this.props.initialInputValue === undefined) { + _state.inputValue = _this.props.itemToString(_state.selectedItem); + } + _this.state = _state; + return _this; + } + var _proto = Downshift.prototype; + /** + * Clear all running timeouts + */ + _proto.internalClearTimeouts = function internalClearTimeouts() { + this.timeoutIds.forEach(function (id) { + clearTimeout(id); + }); + this.timeoutIds = []; + } + + /** + * Gets the state based on internal state or props + * If a state value is passed via props, then that + * is the value given, otherwise it's retrieved from + * stateToMerge + * + * @param {Object} stateToMerge defaults to this.state + * @return {Object} the state + */; + _proto.getState = function getState$1(stateToMerge) { + if (stateToMerge === void 0) { + stateToMerge = this.state; + } + return getState(stateToMerge, this.props); + }; + _proto.getItemCount = function getItemCount() { + // things read better this way. They're in priority order: + // 1. `this.itemCount` + // 2. `this.props.itemCount` + // 3. `this.items.length` + var itemCount = this.items.length; + if (this.itemCount != null) { + itemCount = this.itemCount; + } else if (this.props.itemCount !== undefined) { + itemCount = this.props.itemCount; + } + return itemCount; + }; + _proto.getItemNodeFromIndex = function getItemNodeFromIndex(index) { + return this.props.environment.document.getElementById(this.getItemId(index)); + }; + _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() {}; + _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) { + var _this6 = this; + var itemCount = this.getItemCount(); + var _this$getState8 = this.getState(), + highlightedIndex = _this$getState8.highlightedIndex; + if (itemCount > 0) { + var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) { + return _this6.getItemNodeFromIndex(index); + }); + this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet); + } + }; + _proto.getStateAndHelpers = function getStateAndHelpers() { + var _this$getState9 = this.getState(), + highlightedIndex = _this$getState9.highlightedIndex, + inputValue = _this$getState9.inputValue, + selectedItem = _this$getState9.selectedItem, + isOpen = _this$getState9.isOpen; + var itemToString = this.props.itemToString; + var id = this.id; + var getRootProps = this.getRootProps, + getToggleButtonProps = this.getToggleButtonProps, + getLabelProps = this.getLabelProps, + getMenuProps = this.getMenuProps, + getInputProps = this.getInputProps, + getItemProps = this.getItemProps, + openMenu = this.openMenu, + closeMenu = this.closeMenu, + toggleMenu = this.toggleMenu, + selectItem = this.selectItem, + selectItemAtIndex = this.selectItemAtIndex, + selectHighlightedItem = this.selectHighlightedItem, + setHighlightedIndex = this.setHighlightedIndex, + clearSelection = this.clearSelection, + clearItems = this.clearItems, + reset = this.reset, + setItemCount = this.setItemCount, + unsetItemCount = this.unsetItemCount, + setState = this.internalSetState; + return { + // prop getters + getRootProps: getRootProps, + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getItemProps: getItemProps, + // actions + reset: reset, + openMenu: openMenu, + closeMenu: closeMenu, + toggleMenu: toggleMenu, + selectItem: selectItem, + selectItemAtIndex: selectItemAtIndex, + selectHighlightedItem: selectHighlightedItem, + setHighlightedIndex: setHighlightedIndex, + clearSelection: clearSelection, + clearItems: clearItems, + setItemCount: setItemCount, + unsetItemCount: unsetItemCount, + setState: setState, + // props + itemToString: itemToString, + // derived + id: id, + // state + highlightedIndex: highlightedIndex, + inputValue: inputValue, + isOpen: isOpen, + selectedItem: selectedItem + }; + }; + _proto.componentDidMount = function componentDidMount() { + var _this7 = this; + /* istanbul ignore if (react-native) */ + if (process.env.NODE_ENV !== 'production' && !true && this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + + /* istanbul ignore if (react-native) */ + + this.cleanup = function () { + _this7.internalClearTimeouts(); + }; + }; + _proto.shouldScroll = function shouldScroll(prevState, prevProps) { + var _ref10 = this.props.highlightedIndex === undefined ? this.getState() : this.props, + currentHighlightedIndex = _ref10.highlightedIndex; + var _ref11 = prevProps.highlightedIndex === undefined ? prevState : prevProps, + prevHighlightedIndex = _ref11.highlightedIndex; + var scrollWhenOpen = currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen; + return scrollWhenOpen || currentHighlightedIndex !== prevHighlightedIndex; + }; + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + if (process.env.NODE_ENV !== 'production') { + validateControlledUnchanged(this.state, prevProps, this.props); + /* istanbul ignore if (react-native) */ + } + if (isControlledProp(this.props, 'selectedItem') && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) { + this.internalSetState({ + type: controlledPropUpdatedSelectedItem, + inputValue: this.props.itemToString(this.props.selectedItem) + }); + } + if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) { + this.scrollHighlightedItemIntoView(); + } + + /* istanbul ignore else (react-native) */ + }; + _proto.componentWillUnmount = function componentWillUnmount() { + this.cleanup(); // avoids memory leak + }; + _proto.render = function render() { + var children = unwrapArray(this.props.children, noop); + // because the items are rerendered every time we call the children + // we clear this out each render and it will be populated again as + // getItemProps is called. + this.clearItems(); + // we reset this so we know whether the user calls getRootProps during + // this render. If they do then we don't need to do anything, + // if they don't then we need to clone the element they return and + // apply the props for them. + this.getRootProps.called = false; + this.getRootProps.refKey = undefined; + this.getRootProps.suppressRefError = undefined; + // we do something similar for getMenuProps + this.getMenuProps.called = false; + this.getMenuProps.refKey = undefined; + this.getMenuProps.suppressRefError = undefined; + // we do something similar for getLabelProps + this.getLabelProps.called = false; + // and something similar for getInputProps + this.getInputProps.called = false; + var element = unwrapArray(children(this.getStateAndHelpers())); + if (!element) { + return null; + } + if (this.getRootProps.called || this.props.suppressRefError) { + if (process.env.NODE_ENV !== 'production' && !this.getRootProps.suppressRefError && !this.props.suppressRefError) { + validateGetRootPropsCalledCorrectly(element, this.getRootProps); + } + return element; + } else if (isDOMElement(element)) { + // they didn't apply the root props, but we can clone + // this and apply the props ourselves + return /*#__PURE__*/react.cloneElement(element, this.getRootProps(getElementProps(element))); + } + + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + // they didn't apply the root props, but they need to + // otherwise we can't query around the autocomplete + + throw new Error('downshift: If you return a non-DOM element, you must apply the getRootProps function'); + } + + /* istanbul ignore next */ + return undefined; + }; + return Downshift; + }(react.Component); + Downshift.defaultProps = { + defaultHighlightedIndex: null, + defaultIsOpen: false, + getA11yStatusMessage: getA11yStatusMessage$1, + itemToString: function itemToString(i) { + if (i == null) { + return ''; + } + if (process.env.NODE_ENV !== 'production' && isPlainObject(i) && !i.hasOwnProperty('toString')) { + // eslint-disable-next-line no-console + console.warn('downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.', 'The object that was passed:', i); + } + return String(i); + }, + onStateChange: noop, + onInputValueChange: noop, + onUserAction: noop, + onChange: noop, + onSelect: noop, + onOuterClick: noop, + selectedItemChanged: function selectedItemChanged(prevItem, item) { + return prevItem !== item; + }, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window, + stateReducer: function stateReducer(state, stateToSet) { + return stateToSet; + }, + suppressRefError: false, + scrollIntoView: scrollIntoView + }; + Downshift.stateChangeTypes = stateChangeTypes$3; + return Downshift; +}(); +process.env.NODE_ENV !== "production" ? Downshift.propTypes = { + children: PropTypes__default["default"].func, + defaultHighlightedIndex: PropTypes__default["default"].number, + defaultIsOpen: PropTypes__default["default"].bool, + initialHighlightedIndex: PropTypes__default["default"].number, + initialSelectedItem: PropTypes__default["default"].any, + initialInputValue: PropTypes__default["default"].string, + initialIsOpen: PropTypes__default["default"].bool, + getA11yStatusMessage: PropTypes__default["default"].func, + itemToString: PropTypes__default["default"].func, + onChange: PropTypes__default["default"].func, + onSelect: PropTypes__default["default"].func, + onStateChange: PropTypes__default["default"].func, + onInputValueChange: PropTypes__default["default"].func, + onUserAction: PropTypes__default["default"].func, + onOuterClick: PropTypes__default["default"].func, + selectedItemChanged: PropTypes__default["default"].func, + stateReducer: PropTypes__default["default"].func, + itemCount: PropTypes__default["default"].number, + id: PropTypes__default["default"].string, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }), + suppressRefError: PropTypes__default["default"].bool, + scrollIntoView: PropTypes__default["default"].func, + // things we keep in state for uncontrolled components + // but can accept as props for controlled components + /* eslint-disable react/no-unused-prop-types */ + selectedItem: PropTypes__default["default"].any, + isOpen: PropTypes__default["default"].bool, + inputValue: PropTypes__default["default"].string, + highlightedIndex: PropTypes__default["default"].number, + labelId: PropTypes__default["default"].string, + inputId: PropTypes__default["default"].string, + menuId: PropTypes__default["default"].string, + getItemId: PropTypes__default["default"].func + /* eslint-enable react/no-unused-prop-types */ +} : void 0; +var Downshift$1 = Downshift; +function validateGetMenuPropsCalledCorrectly(node, _ref12) { + var refKey = _ref12.refKey; + if (!node) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from getMenuProps was not applied correctly on your menu element."); + } +} +function validateGetRootPropsCalledCorrectly(element, _ref13) { + var refKey = _ref13.refKey; + var refKeySpecified = refKey !== 'ref'; + var isComposite = !isDOMElement(element); + if (isComposite && !refKeySpecified && !reactIs.isForwardRef(element)) { + // eslint-disable-next-line no-console + console.error('downshift: You returned a non-DOM element. You must specify a refKey in getRootProps'); + } else if (!isComposite && refKeySpecified) { + // eslint-disable-next-line no-console + console.error("downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \"" + refKey + "\""); + } + if (!reactIs.isForwardRef(element) && !getElementProps(element)[refKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You must apply the ref prop \"" + refKey + "\" from getRootProps onto your root element."); + } +} + +var dropdownDefaultStateValues = { + highlightedIndex: -1, + isOpen: false, + selectedItem: null, + inputValue: '' +}; +function callOnChangeProps(action, state, newState) { + var props = action.props, + type = action.type; + var changes = {}; + Object.keys(state).forEach(function (key) { + invokeOnChangeHandler(key, props, state, newState); + if (newState[key] !== state[key]) { + changes[key] = newState[key]; + } + }); + if (props.onStateChange && Object.keys(changes).length) { + props.onStateChange(_extends__default["default"]({ + type: type + }, changes)); + } +} +function invokeOnChangeHandler(key, props, state, newState) { + var handler = "on" + capitalizeString(key) + "Change"; + if (props[handler] && newState[key] !== undefined && newState[key] !== state[key]) { + props[handler](newState); + } +} + +/** + * Default state reducer that returns the changes. + * + * @param {Object} s state. + * @param {Object} a action with changes. + * @returns {Object} changes. + */ +function stateReducer(s, a) { + return a.changes; +} + +/** + * Returns a message to be added to aria-live region when item is selected. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ +function getA11ySelectionMessage(selectionParameters) { + var selectedItem = selectionParameters.selectedItem, + itemToStringLocal = selectionParameters.itemToString; + return selectedItem ? itemToStringLocal(selectedItem) + " has been selected." : ''; +} + +/** + * Debounced call for updating the a11y message. + */ +var updateA11yStatus = debounce(function (getA11yMessage, document) { + setStatus(getA11yMessage(), document); +}, 200); +function getElementIds$1(_ref) { + var id = _ref.id, + labelId = _ref.labelId, + menuId = _ref.menuId, + getItemId = _ref.getItemId, + toggleButtonId = _ref.toggleButtonId; + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return { + labelId: labelId || uniqueId + "-label", + menuId: menuId || uniqueId + "-menu", + getItemId: getItemId || function (index) { + return uniqueId + "-item-" + index; + }, + toggleButtonId: toggleButtonId || uniqueId + "-toggle-button" + }; +} +function getItemIndex(index, item, items) { + if (index !== undefined) { + return index; + } + if (items.length === 0) { + return -1; + } + return items.indexOf(item); +} +function itemToString(item) { + return item ? String(item) : ''; +} +function getPropTypesValidator(caller, propTypes) { + // istanbul ignore next + return function (options) { + if (options === void 0) { + options = {}; + } + Object.keys(propTypes).forEach(function (key) { + PropTypes__default["default"].checkPropTypes(propTypes, options, key, caller.name); + }); + }; +} +function isAcceptedCharacterKey(key) { + return /^\S{1}$/.test(key); +} +function capitalizeString(string) { + return "" + string.slice(0, 1).toUpperCase() + string.slice(1); +} +function useLatestRef(val) { + var ref = react.useRef(val); + // technically this is not "concurrent mode safe" because we're manipulating + // the value during render (so it's not idempotent). However, the places this + // hook is used is to support memoizing callbacks which will be called + // *during* render, so we need the latest values *during* render. + // If not for this, then we'd probably want to use useLayoutEffect instead. + ref.current = val; + return ref; +} + +/** + * Computes the controlled state using a the previous state, props, + * two reducers, one from downshift and an optional one from the user. + * Also calls the onChange handlers for state values that have changed. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useEnhancedReducer(reducer, initialState, props, isStateEqual) { + var prevStateRef = react.useRef(); + var actionRef = react.useRef(); + var enhancedReducer = react.useCallback(function (state, action) { + actionRef.current = action; + state = getState(state, action.props); + var changes = reducer(state, action); + var newState = action.props.stateReducer(state, _extends__default["default"]({}, action, { + changes: changes + })); + return newState; + }, [reducer]); + var _useReducer = react.useReducer(enhancedReducer, initialState), + state = _useReducer[0], + dispatch = _useReducer[1]; + var propsRef = useLatestRef(props); + var dispatchWithProps = react.useCallback(function (action) { + return dispatch(_extends__default["default"]({ + props: propsRef.current + }, action)); + }, [propsRef]); + var action = actionRef.current; + react.useEffect(function () { + var shouldCallOnChangeProps = action && prevStateRef.current && !isStateEqual(prevStateRef.current, state); + if (shouldCallOnChangeProps) { + callOnChangeProps(action, getState(prevStateRef.current, action.props), state); + } + prevStateRef.current = state; + }, [state, action, isStateEqual]); + return [state, dispatchWithProps]; +} + +/** + * Wraps the useEnhancedReducer and applies the controlled prop values before + * returning the new state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useControlledReducer$1(reducer, initialState, props, isStateEqual) { + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props, isStateEqual), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + return [getState(state, props), dispatch]; +} +var defaultProps$3 = { + itemToString: itemToString, + stateReducer: stateReducer, + getA11ySelectionMessage: getA11ySelectionMessage, + scrollIntoView: scrollIntoView, + circularNavigation: false, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window +}; +function getDefaultValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + var defaultPropKey = "default" + capitalizeString(propKey); + if (defaultPropKey in props) { + return props[defaultPropKey]; + } + return defaultStateValues[propKey]; +} +function getInitialValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + if (propKey in props) { + return props[propKey]; + } + var initialPropKey = "initial" + capitalizeString(propKey); + if (initialPropKey in props) { + return props[initialPropKey]; + } + return getDefaultValue$1(props, propKey, defaultStateValues); +} +function getInitialState$2(props) { + var selectedItem = getInitialValue$1(props, 'selectedItem'); + var isOpen = getInitialValue$1(props, 'isOpen'); + var highlightedIndex = getInitialValue$1(props, 'highlightedIndex'); + var inputValue = getInitialValue$1(props, 'inputValue'); + return { + highlightedIndex: highlightedIndex < 0 && selectedItem ? props.items.indexOf(selectedItem) : highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} +function getHighlightedIndexOnOpen(props, state, offset, getItemNodeFromIndex) { + var items = props.items, + initialHighlightedIndex = props.initialHighlightedIndex, + defaultHighlightedIndex = props.defaultHighlightedIndex; + var selectedItem = state.selectedItem, + highlightedIndex = state.highlightedIndex; + if (items.length === 0) { + return -1; + } + + // initialHighlightedIndex will give value to highlightedIndex on initial state only. + if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex) { + return initialHighlightedIndex; + } + if (defaultHighlightedIndex !== undefined) { + return defaultHighlightedIndex; + } + if (selectedItem) { + if (offset === 0) { + return items.indexOf(selectedItem); + } + return getNextWrappingIndex(offset, items.indexOf(selectedItem), items.length, getItemNodeFromIndex, false); + } + if (offset === 0) { + return -1; + } + return offset < 0 ? items.length - 1 : 0; +} + +/** + * Reuse the movement tracking of mouse and touch events. + * + * @param {boolean} isOpen Whether the dropdown is open or not. + * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.) + * @param {Object} environment Environment where component/hook exists. + * @param {Function} handleBlur Handler on blur from mouse or touch. + * @returns {Object} Ref containing whether mouseDown or touchMove event is happening + */ +function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) { + var mouseAndTouchTrackersRef = react.useRef({ + isMouseDown: false, + isTouchMove: false + }); + react.useEffect(function () { + // The same strategy for checking if a click occurred inside or outside downsift + // as in downshift.js. + var onMouseDown = function () { + mouseAndTouchTrackersRef.current.isMouseDown = true; + }; + var onMouseUp = function (event) { + mouseAndTouchTrackersRef.current.isMouseDown = false; + if (isOpen && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document)) { + handleBlur(); + } + }; + var onTouchStart = function () { + mouseAndTouchTrackersRef.current.isTouchMove = false; + }; + var onTouchMove = function () { + mouseAndTouchTrackersRef.current.isTouchMove = true; + }; + var onTouchEnd = function (event) { + if (isOpen && !mouseAndTouchTrackersRef.current.isTouchMove && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document, false)) { + handleBlur(); + } + }; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + return function () { + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, environment]); + return mouseAndTouchTrackersRef; +} + +/** + * Custom hook that checks if getter props are called correctly. + * + * @param {...any} propKeys Getter prop names to be handled. + * @returns {Function} Setter function called inside getter props to set call information. + */ +function useGetterPropsCalledChecker() { + for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) { + propKeys[_key] = arguments[_key]; + } + var getterPropsCalledRef = react.useRef(propKeys.reduce(function (acc, propKey) { + acc[propKey] = {}; + return acc; + }, {})); + if (process.env.NODE_ENV !== 'production') { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + getterPropsCalledRef.current[propKey] = null; + }); + } + react.useEffect(function () { + if (process.env.NODE_ENV !== 'production') { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + if (!getterPropsCalledRef.current[propKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You forgot to call the " + propKey + " getter function on your component / element."); + return; + } + var _getterPropsCalledRef = getterPropsCalledRef.current[propKey], + suppressRefError = _getterPropsCalledRef.suppressRefError, + refKey = _getterPropsCalledRef.refKey, + elementRef = _getterPropsCalledRef.elementRef; + if ((!elementRef || !elementRef.current) && !suppressRefError) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from " + propKey + " was not applied correctly on your element."); + } + }); + } + }); + var setGetterPropCallInfo = react.useCallback(function (propKey, suppressRefError, refKey, elementRef) { + if (process.env.NODE_ENV !== 'production') { + getterPropsCalledRef.current[propKey] = { + suppressRefError: suppressRefError, + refKey: refKey, + elementRef: elementRef + }; + } + }, []); + return setGetterPropCallInfo; +} + +/** + * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item. + * Used by useSelect and useCombobox. + * + * @param {Object} prevState + * @param {Object} newState + * @returns {boolean} Wheather the states are deeply equal. + */ +function isDropdownsStateEqual(prevState, newState) { + return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem; +} + +function getItemIndexByCharacterKey(keysSoFar, highlightedIndex, items, itemToStringParam, getItemNodeFromIndex) { + var lowerCasedItemStrings = items.map(function (item) { + return itemToStringParam(item).toLowerCase(); + }); + var lowerCasedKeysSoFar = keysSoFar.toLowerCase(); + var isValid = function (itemString, index) { + var element = getItemNodeFromIndex(index); + return itemString.startsWith(lowerCasedKeysSoFar) && !(element && element.hasAttribute('disabled')); + }; + for (var index = highlightedIndex + 1; index < lowerCasedItemStrings.length; index++) { + var itemString = lowerCasedItemStrings[index]; + if (isValid(itemString, index)) { + return index; + } + } + for (var _index = 0; _index < highlightedIndex; _index++) { + var _itemString = lowerCasedItemStrings[_index]; + if (isValid(_itemString, _index)) { + return _index; + } + } + return highlightedIndex; +} +var propTypes$1 = { + items: PropTypes__default["default"].array.isRequired, + itemToString: PropTypes__default["default"].func, + getA11yStatusMessage: PropTypes__default["default"].func, + getA11ySelectionMessage: PropTypes__default["default"].func, + circularNavigation: PropTypes__default["default"].bool, + highlightedIndex: PropTypes__default["default"].number, + defaultHighlightedIndex: PropTypes__default["default"].number, + initialHighlightedIndex: PropTypes__default["default"].number, + isOpen: PropTypes__default["default"].bool, + defaultIsOpen: PropTypes__default["default"].bool, + initialIsOpen: PropTypes__default["default"].bool, + selectedItem: PropTypes__default["default"].any, + initialSelectedItem: PropTypes__default["default"].any, + defaultSelectedItem: PropTypes__default["default"].any, + id: PropTypes__default["default"].string, + labelId: PropTypes__default["default"].string, + menuId: PropTypes__default["default"].string, + getItemId: PropTypes__default["default"].func, + toggleButtonId: PropTypes__default["default"].string, + stateReducer: PropTypes__default["default"].func, + onSelectedItemChange: PropTypes__default["default"].func, + onHighlightedIndexChange: PropTypes__default["default"].func, + onStateChange: PropTypes__default["default"].func, + onIsOpenChange: PropTypes__default["default"].func, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }) +}; + +/** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ +function getA11yStatusMessage(_ref) { + var isOpen = _ref.isOpen, + resultCount = _ref.resultCount, + previousResultCount = _ref.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select."; + } + return ''; +} +var defaultProps$2 = _extends__default["default"]({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage +}); + +var MenuKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__menu_keydown_arrow_down__' : 0; +var MenuKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__menu_keydown_arrow_up__' : 1; +var MenuKeyDownEscape = process.env.NODE_ENV !== "production" ? '__menu_keydown_escape__' : 2; +var MenuKeyDownHome = process.env.NODE_ENV !== "production" ? '__menu_keydown_home__' : 3; +var MenuKeyDownEnd = process.env.NODE_ENV !== "production" ? '__menu_keydown_end__' : 4; +var MenuKeyDownEnter = process.env.NODE_ENV !== "production" ? '__menu_keydown_enter__' : 5; +var MenuKeyDownSpaceButton = process.env.NODE_ENV !== "production" ? '__menu_keydown_space_button__' : 6; +var MenuKeyDownCharacter = process.env.NODE_ENV !== "production" ? '__menu_keydown_character__' : 7; +var MenuBlur = process.env.NODE_ENV !== "production" ? '__menu_blur__' : 8; +var MenuMouseLeave$1 = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 9; +var ItemMouseMove$1 = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 10; +var ItemClick$1 = process.env.NODE_ENV !== "production" ? '__item_click__' : 11; +var ToggleButtonClick$1 = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 12; +var ToggleButtonKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_arrow_down__' : 13; +var ToggleButtonKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_arrow_up__' : 14; +var ToggleButtonKeyDownCharacter = process.env.NODE_ENV !== "production" ? '__togglebutton_keydown_character__' : 15; +var FunctionToggleMenu$1 = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 16; +var FunctionOpenMenu$1 = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 17; +var FunctionCloseMenu$1 = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 18; +var FunctionSetHighlightedIndex$1 = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 19; +var FunctionSelectItem$1 = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 20; +var FunctionSetInputValue$1 = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 21; +var FunctionReset$2 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 22; + +var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + MenuKeyDownArrowDown: MenuKeyDownArrowDown, + MenuKeyDownArrowUp: MenuKeyDownArrowUp, + MenuKeyDownEscape: MenuKeyDownEscape, + MenuKeyDownHome: MenuKeyDownHome, + MenuKeyDownEnd: MenuKeyDownEnd, + MenuKeyDownEnter: MenuKeyDownEnter, + MenuKeyDownSpaceButton: MenuKeyDownSpaceButton, + MenuKeyDownCharacter: MenuKeyDownCharacter, + MenuBlur: MenuBlur, + MenuMouseLeave: MenuMouseLeave$1, + ItemMouseMove: ItemMouseMove$1, + ItemClick: ItemClick$1, + ToggleButtonClick: ToggleButtonClick$1, + ToggleButtonKeyDownArrowDown: ToggleButtonKeyDownArrowDown, + ToggleButtonKeyDownArrowUp: ToggleButtonKeyDownArrowUp, + ToggleButtonKeyDownCharacter: ToggleButtonKeyDownCharacter, + FunctionToggleMenu: FunctionToggleMenu$1, + FunctionOpenMenu: FunctionOpenMenu$1, + FunctionCloseMenu: FunctionCloseMenu$1, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1, + FunctionSelectItem: FunctionSelectItem$1, + FunctionSetInputValue: FunctionSetInputValue$1, + FunctionReset: FunctionReset$2 +}); + +/* eslint-disable complexity */ +function downshiftSelectReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove$1: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick$1: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index] + }; + break; + case ToggleButtonKeyDownCharacter: + { + var lowercasedKey = action.key; + var inputValue = "" + state.inputValue + lowercasedKey; + var itemIndex = getItemIndexByCharacterKey(inputValue, state.selectedItem ? props.items.indexOf(state.selectedItem) : -1, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends__default["default"]({ + inputValue: inputValue + }, itemIndex >= 0 && { + selectedItem: props.items[itemIndex] + }); + } + break; + case ToggleButtonKeyDownArrowDown: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case ToggleButtonKeyDownArrowUp: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case MenuKeyDownEnter: + case MenuKeyDownSpaceButton: + changes = _extends__default["default"]({ + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex') + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex] + }); + break; + case MenuKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEscape: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuBlur: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuKeyDownCharacter: + { + var _lowercasedKey = action.key; + var _inputValue = "" + state.inputValue + _lowercasedKey; + var highlightedIndex = getItemIndexByCharacterKey(_inputValue, state.highlightedIndex, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends__default["default"]({ + inputValue: _inputValue + }, highlightedIndex >= 0 && { + highlightedIndex: highlightedIndex + }); + } + break; + case MenuKeyDownArrowDown: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuKeyDownArrowUp: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuMouseLeave$1: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick$1: + case FunctionToggleMenu$1: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu$1: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu$1: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex$1: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem$1: + changes = { + selectedItem: action.selectedItem + }; + break; + case FunctionSetInputValue$1: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$2: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends__default["default"]({}, state, changes); +} +/* eslint-enable complexity */ + +var _excluded$3 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"], + _excluded2$2 = ["onClick", "onKeyDown", "refKey", "ref"], + _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "refKey", "ref"]; +var validatePropTypes$1 = process.env.NODE_ENV === 'production' ? /* istanbul ignore next */null : getPropTypesValidator(useSelect, propTypes$1); +useSelect.stateChangeTypes = stateChangeTypes$2; +function useSelect(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + validatePropTypes$1(userProps); + } + // Props defaults and destructuring. + var props = _extends__default["default"]({}, defaultProps$2, userProps); + var items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + itemToString = props.itemToString, + getA11ySelectionMessage = props.getA11ySelectionMessage, + getA11yStatusMessage = props.getA11yStatusMessage; + // Initial state depending on controlled props. + var initialState = getInitialState$2(props); + var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, initialState, props, isDropdownsStateEqual), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element efs. + var toggleButtonRef = react.useRef(null); + var menuRef = react.useRef(null); + var itemRefs = react.useRef(); + itemRefs.current = {}; + // used not to scroll when highlight by mouse. + var shouldScrollRef = react.useRef(true); + // used not to trigger menu blur action in some scenarios. + var shouldBlurRef = react.useRef(true); + // used to keep the inputValue clearTimeout object between renders. + var clearTimeoutRef = react.useRef(null); + // prevent id re-generation between renders. + var elementIdsRef = react.useRef(getElementIds$1(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = react.useRef(); + var isInitialMountRef = react.useRef(true); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + + // Some utils. + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Sets cleanup for the keysSoFar after 500ms. + react.useEffect(function () { + // init the clean function here as we need access to dispatch. + if (isInitialMountRef.current) { + clearTimeoutRef.current = debounce(function (outerDispatch) { + outerDispatch({ + type: FunctionSetInputValue$1, + inputValue: '' + }); + }, 500); + } + if (!inputValue) { + return; + } + clearTimeoutRef.current(dispatch); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inputValue]); + /* Controls the focus on the menu or the toggle button. */ + react.useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus menu on open. + if (isOpen) { + // istanbul ignore else + if (menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus toggleButton on close, but not if it was closed with (Shift+)Tab. + if (environment.document.activeElement === menuRef.current) { + // istanbul ignore else + if (toggleButtonRef.current) { + shouldBlurRef.current = false; + toggleButtonRef.current.focus(); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + // Scroll on highlighted item if change comes from keyboard. + react.useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: MenuBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var toggleButtonKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + } + }; + }, [dispatch]); + var menuKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: MenuKeyDownEscape + }); + }, + Enter: function Enter(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnter + }); + }, + ' ': function _(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownSpaceButton + }); + } + }; + }, [dispatch]); + + // Action functions. + var toggleMenu = react.useCallback(function () { + dispatch({ + type: FunctionToggleMenu$1 + }); + }, [dispatch]); + var closeMenu = react.useCallback(function () { + dispatch({ + type: FunctionCloseMenu$1 + }); + }, [dispatch]); + var openMenu = react.useCallback(function () { + dispatch({ + type: FunctionOpenMenu$1 + }); + }, [dispatch]); + var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex$1, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = react.useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem$1, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset$2 + }); + }, [dispatch]); + var setInputValue = react.useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue$1, + inputValue: newInputValue + }); + }, [dispatch]); + // Getter functions. + var getLabelProps = react.useCallback(function (labelProps) { + return _extends__default["default"]({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.toggleButtonId + }, labelProps); + }, []); + var getMenuProps = react.useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + onKeyDown = _ref.onKeyDown, + onBlur = _ref.onBlur, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$3); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + var latestState = latest.current.state; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.tabIndex = -1, _extends2), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + onMouseLeave: callAllEventHandlers(onMouseLeave, function menuHandleMouseLeave() { + dispatch({ + type: MenuMouseLeave$1 + }); + }), + onKeyDown: callAllEventHandlers(onKeyDown, function menuHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && menuKeyDownHandlers[key]) { + menuKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: MenuKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }), + onBlur: callAllEventHandlers(onBlur, function menuHandleBlur() { + // if the blur was a result of selection, we don't trigger this action. + if (shouldBlurRef.current === false) { + shouldBlurRef.current = true; + return; + } + var shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown; + /* istanbul ignore else */ + if (shouldBlur) { + dispatch({ + type: MenuBlur + }); + } + }) + }, rest); + }, [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getToggleButtonProps = react.useCallback(function (_temp3, _temp4) { + var _extends3; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$2); + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$suppressRefErro = _ref4.suppressRefError, + suppressRefError = _ref4$suppressRefErro === void 0 ? false : _ref4$suppressRefErro; + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick$1 + }); + }; + var toggleButtonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && toggleButtonKeyDownHandlers[key]) { + toggleButtonKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: ToggleButtonKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }; + var toggleProps = _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends3.id = elementIdsRef.current.toggleButtonId, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-labelledby'] = elementIdsRef.current.labelId + " " + elementIdsRef.current.toggleButtonId, _extends3), rest); + if (!rest.disabled) { + toggleProps.onClick = callAllEventHandlers(onClick, toggleButtonHandleClick); + toggleProps.onKeyDown = callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown); + } + setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef); + return toggleProps; + }, [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo]); + var getItemProps = react.useCallback(function (_temp5) { + var _extends4; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + item = _ref5.item, + index = _ref5.index, + onMouseMove = _ref5.onMouseMove, + onClick = _ref5.onClick, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3$1); + var _latest$current = latest.current, + latestState = _latest$current.state, + latestProps = _latest$current.props; + var itemHandleMouseMove = function () { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove$1, + index: index + }); + }; + var itemHandleClick = function () { + dispatch({ + type: ItemClick$1, + index: index + }); + }; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var itemProps = _extends__default["default"]((_extends4 = { + role: 'option', + 'aria-selected': "" + (itemIndex === latestState.highlightedIndex), + id: elementIdsRef.current.getItemId(itemIndex) + }, _extends4[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends4), rest); + if (!rest.disabled) { + itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove); + itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick); + } + return itemProps; + }, [dispatch, latest]); + return { + // prop getters. + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getItemProps: getItemProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + selectItem: selectItem, + reset: reset, + setInputValue: setInputValue, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} + +var InputKeyDownArrowDown = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_down__' : 0; +var InputKeyDownArrowUp = process.env.NODE_ENV !== "production" ? '__input_keydown_arrow_up__' : 1; +var InputKeyDownEscape = process.env.NODE_ENV !== "production" ? '__input_keydown_escape__' : 2; +var InputKeyDownHome = process.env.NODE_ENV !== "production" ? '__input_keydown_home__' : 3; +var InputKeyDownEnd = process.env.NODE_ENV !== "production" ? '__input_keydown_end__' : 4; +var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 5; +var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 6; +var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 7; +var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 8; +var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 9; +var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 10; +var ToggleButtonClick = process.env.NODE_ENV !== "production" ? '__togglebutton_click__' : 11; +var FunctionToggleMenu = process.env.NODE_ENV !== "production" ? '__function_toggle_menu__' : 12; +var FunctionOpenMenu = process.env.NODE_ENV !== "production" ? '__function_open_menu__' : 13; +var FunctionCloseMenu = process.env.NODE_ENV !== "production" ? '__function_close_menu__' : 14; +var FunctionSetHighlightedIndex = process.env.NODE_ENV !== "production" ? '__function_set_highlighted_index__' : 15; +var FunctionSelectItem = process.env.NODE_ENV !== "production" ? '__function_select_item__' : 16; +var FunctionSetInputValue = process.env.NODE_ENV !== "production" ? '__function_set_input_value__' : 17; +var FunctionReset$1 = process.env.NODE_ENV !== "production" ? '__function_reset__' : 18; +var ControlledPropUpdatedSelectedItem = process.env.NODE_ENV !== "production" ? '__controlled_prop_updated_selected_item__' : 19; + +var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + InputKeyDownArrowDown: InputKeyDownArrowDown, + InputKeyDownArrowUp: InputKeyDownArrowUp, + InputKeyDownEscape: InputKeyDownEscape, + InputKeyDownHome: InputKeyDownHome, + InputKeyDownEnd: InputKeyDownEnd, + InputKeyDownEnter: InputKeyDownEnter, + InputChange: InputChange, + InputBlur: InputBlur, + MenuMouseLeave: MenuMouseLeave, + ItemMouseMove: ItemMouseMove, + ItemClick: ItemClick, + ToggleButtonClick: ToggleButtonClick, + FunctionToggleMenu: FunctionToggleMenu, + FunctionOpenMenu: FunctionOpenMenu, + FunctionCloseMenu: FunctionCloseMenu, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex, + FunctionSelectItem: FunctionSelectItem, + FunctionSetInputValue: FunctionSetInputValue, + FunctionReset: FunctionReset$1, + ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem +}); + +var _excluded$2 = ["id", "inputId"]; +function getElementIds(_ref) { + var id = _ref.id, + inputId = _ref.inputId, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$2); + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return _extends__default["default"]({ + inputId: inputId || uniqueId + "-input" + }, getElementIds$1(_extends__default["default"]({ + id: id + }, rest))); +} +function getInitialState$1(props) { + var initialState = getInitialState$2(props); + var selectedItem = initialState.selectedItem; + var inputValue = initialState.inputValue; + if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) { + inputValue = props.itemToString(selectedItem); + } + return _extends__default["default"]({}, initialState, { + inputValue: inputValue + }); +} +var propTypes = { + items: PropTypes__default["default"].array.isRequired, + itemToString: PropTypes__default["default"].func, + getA11yStatusMessage: PropTypes__default["default"].func, + getA11ySelectionMessage: PropTypes__default["default"].func, + circularNavigation: PropTypes__default["default"].bool, + highlightedIndex: PropTypes__default["default"].number, + defaultHighlightedIndex: PropTypes__default["default"].number, + initialHighlightedIndex: PropTypes__default["default"].number, + isOpen: PropTypes__default["default"].bool, + defaultIsOpen: PropTypes__default["default"].bool, + initialIsOpen: PropTypes__default["default"].bool, + selectedItem: PropTypes__default["default"].any, + initialSelectedItem: PropTypes__default["default"].any, + defaultSelectedItem: PropTypes__default["default"].any, + inputValue: PropTypes__default["default"].string, + defaultInputValue: PropTypes__default["default"].string, + initialInputValue: PropTypes__default["default"].string, + id: PropTypes__default["default"].string, + labelId: PropTypes__default["default"].string, + menuId: PropTypes__default["default"].string, + getItemId: PropTypes__default["default"].func, + inputId: PropTypes__default["default"].string, + toggleButtonId: PropTypes__default["default"].string, + stateReducer: PropTypes__default["default"].func, + onSelectedItemChange: PropTypes__default["default"].func, + onHighlightedIndexChange: PropTypes__default["default"].func, + onStateChange: PropTypes__default["default"].func, + onIsOpenChange: PropTypes__default["default"].func, + onInputValueChange: PropTypes__default["default"].func, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }) +}; + +/** + * The useCombobox version of useControlledReducer, which also + * checks if the controlled prop selectedItem changed between + * renders. If so, it will also update inputValue with its + * string equivalent. It uses the common useEnhancedReducer to + * compute the rest of the state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @returns {Array} An array with the state and an action dispatcher. + */ +function useControlledReducer(reducer, initialState, props) { + var previousSelectedItemRef = react.useRef(); + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + + // ToDo: if needed, make same approach as selectedItemChanged from Downshift. + if (isControlledProp(props, 'selectedItem')) { + if (previousSelectedItemRef.current !== props.selectedItem) { + dispatch({ + type: ControlledPropUpdatedSelectedItem, + inputValue: props.itemToString(props.selectedItem) + }); + } + previousSelectedItemRef.current = state.selectedItem === previousSelectedItemRef.current ? props.selectedItem : state.selectedItem; + } + return [getState(state, props), dispatch]; +} +var defaultProps$1 = _extends__default["default"]({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage$1, + circularNavigation: true +}); + +/* eslint-disable complexity */ +function downshiftUseComboboxReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index], + inputValue: props.itemToString(props.items[action.index]) + }; + break; + case InputKeyDownArrowDown: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownArrowUp: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownEnter: + changes = _extends__default["default"]({}, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: props.itemToString(props.items[state.highlightedIndex]) + }); + break; + case InputKeyDownEscape: + changes = { + isOpen: false, + selectedItem: null, + highlightedIndex: -1, + inputValue: '' + }; + break; + case InputKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputBlur: + changes = _extends__default["default"]({ + isOpen: false + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + inputValue: props.itemToString(props.items[state.highlightedIndex]), + highlightedIndex: -1 + }); + break; + case InputChange: + changes = { + isOpen: true, + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: action.inputValue + }; + break; + case MenuMouseLeave: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick: + case FunctionToggleMenu: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem: + changes = { + selectedItem: action.selectedItem, + inputValue: props.itemToString(action.selectedItem) + }; + break; + case ControlledPropUpdatedSelectedItem: + case FunctionSetInputValue: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$1: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends__default["default"]({}, state, changes); +} +/* eslint-enable complexity */ + +var _excluded$1 = ["onMouseLeave", "refKey", "ref"], + _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onClick", "onPress"], + _excluded3 = ["onClick", "onPress", "refKey", "ref"], + _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "refKey", "ref"], + _excluded5 = ["refKey", "ref"]; +var validatePropTypes = process.env.NODE_ENV === 'production' ? /* istanbul ignore next */null : getPropTypesValidator(useCombobox, propTypes); +useCombobox.stateChangeTypes = stateChangeTypes$1; +function useCombobox(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + if (process.env.NODE_ENV !== 'production') { + validatePropTypes(userProps); + } + // Props defaults and destructuring. + var props = _extends__default["default"]({}, defaultProps$1, userProps); + var initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + getA11yStatusMessage = props.getA11yStatusMessage, + getA11ySelectionMessage = props.getA11ySelectionMessage, + itemToString = props.itemToString; + // Initial state depending on controlled props. + var initialState = getInitialState$1(props); + var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, initialState, props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element refs. + var menuRef = react.useRef(null); + var itemRefs = react.useRef(); + var inputRef = react.useRef(null); + var toggleButtonRef = react.useRef(null); + var comboboxRef = react.useRef(null); + itemRefs.current = {}; + // used not to scroll on highlight by mouse. + var shouldScrollRef = react.useRef(true); + var isInitialMountRef = react.useRef(true); + // prevent id re-generation between renders. + var elementIdsRef = react.useRef(getElementIds(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = react.useRef(); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + // used to store information about getter props being called on render. + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Scroll on highlighted item if change comes from keyboard. + react.useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + // Controls the focus on the menu or the toggle button. + react.useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if (initialIsOpen || defaultIsOpen || isOpen) { + if (inputRef.current) { + inputRef.current.focus(); + } + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [comboboxRef, menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: InputBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getComboboxProps', 'getMenuProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + /* Event handler functions */ + var inputKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowDown, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowUp, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: InputKeyDownEscape + }); + }, + Enter: function Enter(event) { + // if IME composing, wait for next Enter keydown event. + if (event.which === 229) { + return; + } + var latestState = latest.current.state; + if (latestState.isOpen && latestState.highlightedIndex > -1) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnter, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + } + }; + }, [dispatch, latest]); + + // Getter props. + var getLabelProps = react.useCallback(function (labelProps) { + return _extends__default["default"]({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.inputId + }, labelProps); + }, []); + var getMenuProps = react.useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref, _excluded$1); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () { + dispatch({ + type: MenuMouseLeave + }); + }), _extends2), rest); + }, [dispatch, setGetterPropCallInfo]); + var getItemProps = react.useCallback(function (_temp3) { + var _extends3, _ref4; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + item = _ref3.item, + index = _ref3.index, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onMouseMove = _ref3.onMouseMove; + _ref3.onClick; + var onPress = _ref3.onPress, + rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$1); + var _latest$current = latest.current, + latestProps = _latest$current.props, + latestState = _latest$current.state; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var onSelectKey = /* istanbul ignore next (react-native) */'onPress'; + var customClickHandler = /* istanbul ignore next (react-native) */onPress; + return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends3.role = 'option', _extends3['aria-selected'] = "" + (itemIndex === latestState.highlightedIndex), _extends3.id = elementIdsRef.current.getItemId(itemIndex), _extends3), !rest.disabled && (_ref4 = { + onMouseMove: callAllEventHandlers(onMouseMove, function itemHandleMouseMove() { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove, + index: index + }); + }) + }, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, function itemHandleClick() { + dispatch({ + type: ItemClick, + index: index + }); + }), _ref4), rest); + }, [dispatch, latest]); + var getToggleButtonProps = react.useCallback(function (_temp4) { + var _extends4; + var _ref5 = _temp4 === void 0 ? {} : _temp4; + _ref5.onClick; + var onPress = _ref5.onPress, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3); + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick + }); + if (!latest.current.state.isOpen && inputRef.current) { + inputRef.current.focus(); + } + }; + return _extends__default["default"]((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends4.id = elementIdsRef.current.toggleButtonId, _extends4.tabIndex = -1, _extends4), !rest.disabled && _extends__default["default"]({}, /* istanbul ignore next (react-native) */{ + onPress: callAllEventHandlers(onPress, toggleButtonHandleClick) + }), rest); + }, [dispatch, latest]); + var getInputProps = react.useCallback(function (_temp5, _temp6) { + var _extends5; + var _ref6 = _temp5 === void 0 ? {} : _temp5, + onKeyDown = _ref6.onKeyDown, + onChange = _ref6.onChange, + onInput = _ref6.onInput, + onBlur = _ref6.onBlur, + onChangeText = _ref6.onChangeText, + _ref6$refKey = _ref6.refKey, + refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey, + ref = _ref6.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref6, _excluded4); + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressRefErro = _ref7.suppressRefError, + suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro; + setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef); + var latestState = latest.current.state; + var inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && inputKeyDownHandlers[key]) { + inputKeyDownHandlers[key](event); + } + }; + var inputHandleChange = function (event) { + dispatch({ + type: InputChange, + inputValue: /* istanbul ignore next (react-native) */event.nativeEvent.text + }); + }; + var inputHandleBlur = function () { + /* istanbul ignore else */ + if (!mouseAndTouchTrackersRef.current.isMouseDown) { + dispatch({ + type: InputBlur + }); + } + }; + + /* istanbul ignore next (preact) */ + var onChangeKey = 'onChange'; + var eventHandlers = {}; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + eventHandlers.onChange = callAllEventHandlers(onChange, onInput, inputHandleChange); + eventHandlers.onChangeText = callAllEventHandlers(onChangeText, onInput, function (text) { + inputHandleChange({ + nativeEvent: { + text: text + } + }); + }); + return _extends__default["default"]((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) { + inputRef.current = inputNode; + }), _extends5.id = elementIdsRef.current.inputId, _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIdsRef.current.menuId, _extends5), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + 'aria-labelledby': elementIdsRef.current.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: latestState.inputValue + }, eventHandlers, rest); + }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getComboboxProps = react.useCallback(function (_temp7, _temp8) { + var _extends6; + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$refKey = _ref8.refKey, + refKey = _ref8$refKey === void 0 ? 'ref' : _ref8$refKey, + ref = _ref8.ref, + rest = _objectWithoutPropertiesLoose__default["default"](_ref8, _excluded5); + var _ref9 = _temp8 === void 0 ? {} : _temp8, + _ref9$suppressRefErro = _ref9.suppressRefError, + suppressRefError = _ref9$suppressRefErro === void 0 ? false : _ref9$suppressRefErro; + setGetterPropCallInfo('getComboboxProps', suppressRefError, refKey, comboboxRef); + return _extends__default["default"]((_extends6 = {}, _extends6[refKey] = handleRefs(ref, function (comboboxNode) { + comboboxRef.current = comboboxNode; + }), _extends6.role = 'combobox', _extends6['aria-haspopup'] = 'listbox', _extends6['aria-owns'] = elementIdsRef.current.menuId, _extends6['aria-expanded'] = latest.current.state.isOpen, _extends6), rest); + }, [latest, setGetterPropCallInfo]); + + // returns + var toggleMenu = react.useCallback(function () { + dispatch({ + type: FunctionToggleMenu + }); + }, [dispatch]); + var closeMenu = react.useCallback(function () { + dispatch({ + type: FunctionCloseMenu + }); + }, [dispatch]); + var openMenu = react.useCallback(function () { + dispatch({ + type: FunctionOpenMenu + }); + }, [dispatch]); + var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = react.useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var setInputValue = react.useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue, + inputValue: newInputValue + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset$1 + }); + }, [dispatch]); + return { + // prop getters. + getItemProps: getItemProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getComboboxProps: getComboboxProps, + getToggleButtonProps: getToggleButtonProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + setInputValue: setInputValue, + selectItem: selectItem, + reset: reset, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; +} + +var defaultStateValues = { + activeIndex: -1, + selectedItems: [] +}; + +/** + * Returns the initial value for a state key in the following order: + * 1. controlled prop, 2. initial prop, 3. default prop, 4. default + * value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ +function getInitialValue(props, propKey) { + return getInitialValue$1(props, propKey, defaultStateValues); +} + +/** + * Returns the default value for a state key in the following order: + * 1. controlled prop, 2. default prop, 3. default value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ +function getDefaultValue(props, propKey) { + return getDefaultValue$1(props, propKey, defaultStateValues); +} + +/** + * Gets the initial state based on the provided props. It uses initial, default + * and controlled props related to state in order to compute the initial value. + * + * @param {Object} props Props passed to the hook. + * @returns {Object} The initial state. + */ +function getInitialState(props) { + var activeIndex = getInitialValue(props, 'activeIndex'); + var selectedItems = getInitialValue(props, 'selectedItems'); + return { + activeIndex: activeIndex, + selectedItems: selectedItems + }; +} + +/** + * Returns true if dropdown keydown operation is permitted. Should not be + * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on + * input element with text content that is either highlighted or selection + * cursor is not at the starting position. + * + * @param {KeyboardEvent} event The event from keydown. + * @returns {boolean} Whether the operation is allowed. + */ +function isKeyDownOperationPermitted(event) { + if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) { + return false; + } + var element = event.target; + if (element instanceof HTMLInputElement && + // if element is a text input + element.value !== '' && ( + // and we have text in it + // and cursor is either not at the start or is currently highlighting text. + element.selectionStart !== 0 || element.selectionEnd !== 0)) { + return false; + } + return true; +} + +/** + * Returns a message to be added to aria-live region when item is removed. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ +function getA11yRemovalMessage(selectionParameters) { + var removedSelectedItem = selectionParameters.removedSelectedItem, + itemToStringLocal = selectionParameters.itemToString; + return itemToStringLocal(removedSelectedItem) + " has been removed."; +} +({ + selectedItems: PropTypes__default["default"].array, + initialSelectedItems: PropTypes__default["default"].array, + defaultSelectedItems: PropTypes__default["default"].array, + itemToString: PropTypes__default["default"].func, + getA11yRemovalMessage: PropTypes__default["default"].func, + stateReducer: PropTypes__default["default"].func, + activeIndex: PropTypes__default["default"].number, + initialActiveIndex: PropTypes__default["default"].number, + defaultActiveIndex: PropTypes__default["default"].number, + onActiveIndexChange: PropTypes__default["default"].func, + onSelectedItemsChange: PropTypes__default["default"].func, + keyNavigationNext: PropTypes__default["default"].string, + keyNavigationPrevious: PropTypes__default["default"].string, + environment: PropTypes__default["default"].shape({ + addEventListener: PropTypes__default["default"].func, + removeEventListener: PropTypes__default["default"].func, + document: PropTypes__default["default"].shape({ + getElementById: PropTypes__default["default"].func, + activeElement: PropTypes__default["default"].any, + body: PropTypes__default["default"].any + }) + }) +}); +var defaultProps = { + itemToString: defaultProps$3.itemToString, + stateReducer: defaultProps$3.stateReducer, + environment: defaultProps$3.environment, + getA11yRemovalMessage: getA11yRemovalMessage, + keyNavigationNext: 'ArrowRight', + keyNavigationPrevious: 'ArrowLeft' +}; + +var SelectedItemClick = process.env.NODE_ENV !== "production" ? '__selected_item_click__' : 0; +var SelectedItemKeyDownDelete = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_delete__' : 1; +var SelectedItemKeyDownBackspace = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_backspace__' : 2; +var SelectedItemKeyDownNavigationNext = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_navigation_next__' : 3; +var SelectedItemKeyDownNavigationPrevious = process.env.NODE_ENV !== "production" ? '__selected_item_keydown_navigation_previous__' : 4; +var DropdownKeyDownNavigationPrevious = process.env.NODE_ENV !== "production" ? '__dropdown_keydown_navigation_previous__' : 5; +var DropdownKeyDownBackspace = process.env.NODE_ENV !== "production" ? '__dropdown_keydown_backspace__' : 6; +var DropdownClick = process.env.NODE_ENV !== "production" ? '__dropdown_click__' : 7; +var FunctionAddSelectedItem = process.env.NODE_ENV !== "production" ? '__function_add_selected_item__' : 8; +var FunctionRemoveSelectedItem = process.env.NODE_ENV !== "production" ? '__function_remove_selected_item__' : 9; +var FunctionSetSelectedItems = process.env.NODE_ENV !== "production" ? '__function_set_selected_items__' : 10; +var FunctionSetActiveIndex = process.env.NODE_ENV !== "production" ? '__function_set_active_index__' : 11; +var FunctionReset = process.env.NODE_ENV !== "production" ? '__function_reset__' : 12; + +var stateChangeTypes = /*#__PURE__*/Object.freeze({ + __proto__: null, + SelectedItemClick: SelectedItemClick, + SelectedItemKeyDownDelete: SelectedItemKeyDownDelete, + SelectedItemKeyDownBackspace: SelectedItemKeyDownBackspace, + SelectedItemKeyDownNavigationNext: SelectedItemKeyDownNavigationNext, + SelectedItemKeyDownNavigationPrevious: SelectedItemKeyDownNavigationPrevious, + DropdownKeyDownNavigationPrevious: DropdownKeyDownNavigationPrevious, + DropdownKeyDownBackspace: DropdownKeyDownBackspace, + DropdownClick: DropdownClick, + FunctionAddSelectedItem: FunctionAddSelectedItem, + FunctionRemoveSelectedItem: FunctionRemoveSelectedItem, + FunctionSetSelectedItems: FunctionSetSelectedItems, + FunctionSetActiveIndex: FunctionSetActiveIndex, + FunctionReset: FunctionReset +}); + +/* eslint-disable complexity */ +function downshiftMultipleSelectionReducer(state, action) { + var type = action.type, + index = action.index, + props = action.props, + selectedItem = action.selectedItem; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + var changes; + switch (type) { + case SelectedItemClick: + changes = { + activeIndex: index + }; + break; + case SelectedItemKeyDownNavigationPrevious: + changes = { + activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1 + }; + break; + case SelectedItemKeyDownNavigationNext: + changes = { + activeIndex: activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1 + }; + break; + case SelectedItemKeyDownBackspace: + case SelectedItemKeyDownDelete: + { + var newActiveIndex = activeIndex; + if (selectedItems.length === 1) { + newActiveIndex = -1; + } else if (activeIndex === selectedItems.length - 1) { + newActiveIndex = selectedItems.length - 2; + } + changes = _extends__default["default"]({ + selectedItems: [].concat(selectedItems.slice(0, activeIndex), selectedItems.slice(activeIndex + 1)) + }, { + activeIndex: newActiveIndex + }); + break; + } + case DropdownKeyDownNavigationPrevious: + changes = { + activeIndex: selectedItems.length - 1 + }; + break; + case DropdownKeyDownBackspace: + changes = { + selectedItems: selectedItems.slice(0, selectedItems.length - 1) + }; + break; + case FunctionAddSelectedItem: + changes = { + selectedItems: [].concat(selectedItems, [selectedItem]) + }; + break; + case DropdownClick: + changes = { + activeIndex: -1 + }; + break; + case FunctionRemoveSelectedItem: + { + var _newActiveIndex = activeIndex; + var selectedItemIndex = selectedItems.indexOf(selectedItem); + if (selectedItems.length === 1) { + _newActiveIndex = -1; + } else if (selectedItemIndex === selectedItems.length - 1) { + _newActiveIndex = selectedItems.length - 2; + } + changes = _extends__default["default"]({ + selectedItems: [].concat(selectedItems.slice(0, selectedItemIndex), selectedItems.slice(selectedItemIndex + 1)) + }, { + activeIndex: _newActiveIndex + }); + break; + } + case FunctionSetSelectedItems: + { + var newSelectedItems = action.selectedItems; + changes = { + selectedItems: newSelectedItems + }; + break; + } + case FunctionSetActiveIndex: + { + var _newActiveIndex2 = action.activeIndex; + changes = { + activeIndex: _newActiveIndex2 + }; + break; + } + case FunctionReset: + changes = { + activeIndex: getDefaultValue(props, 'activeIndex'), + selectedItems: getDefaultValue(props, 'selectedItems') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends__default["default"]({}, state, changes); +} + +var _excluded = ["refKey", "ref", "onClick", "onKeyDown", "selectedItem", "index"], + _excluded2 = ["refKey", "ref", "onKeyDown", "onClick", "preventKeyAction"]; +useMultipleSelection.stateChangeTypes = stateChangeTypes; +function useMultipleSelection(userProps) { + if (userProps === void 0) { + userProps = {}; + } + // Props defaults and destructuring. + var props = _extends__default["default"]({}, defaultProps, userProps); + var getA11yRemovalMessage = props.getA11yRemovalMessage, + itemToString = props.itemToString, + environment = props.environment, + keyNavigationNext = props.keyNavigationNext, + keyNavigationPrevious = props.keyNavigationPrevious; + + // Reducer init. + var _useControlledReducer = useControlledReducer$1(downshiftMultipleSelectionReducer, getInitialState(props), props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + + // Refs. + var isInitialMountRef = react.useRef(true); + var dropdownRef = react.useRef(null); + var previousSelectedItemsRef = react.useRef(selectedItems); + var selectedItemRefs = react.useRef(); + selectedItemRefs.current = []; + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + var latest = useLatestRef({ + state: state, + props: props + }); + + // Effects. + /* Sets a11y status message on changes in selectedItem. */ + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (selectedItems.length < previousSelectedItemsRef.current.length) { + var removedSelectedItem = previousSelectedItemsRef.current.find(function (item) { + return selectedItems.indexOf(item) < 0; + }); + setStatus(getA11yRemovalMessage({ + itemToString: itemToString, + resultCount: selectedItems.length, + removedSelectedItem: removedSelectedItem, + activeIndex: activeIndex, + activeSelectedItem: selectedItems[activeIndex] + }), environment.document); + } + previousSelectedItemsRef.current = selectedItems; + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItems.length]); + // Sets focus on active item. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (activeIndex === -1 && dropdownRef.current) { + dropdownRef.current.focus(); + } else if (selectedItemRefs.current[activeIndex]) { + selectedItemRefs.current[activeIndex].focus(); + } + }, [activeIndex]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var selectedItemKeyDownHandlers = react.useMemo(function () { + var _ref; + return _ref = {}, _ref[keyNavigationPrevious] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationPrevious + }); + }, _ref[keyNavigationNext] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationNext + }); + }, _ref.Delete = function Delete() { + dispatch({ + type: SelectedItemKeyDownDelete + }); + }, _ref.Backspace = function Backspace() { + dispatch({ + type: SelectedItemKeyDownBackspace + }); + }, _ref; + }, [dispatch, keyNavigationNext, keyNavigationPrevious]); + var dropdownKeyDownHandlers = react.useMemo(function () { + var _ref2; + return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownNavigationPrevious + }); + } + }, _ref2.Backspace = function Backspace(event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownBackspace + }); + } + }, _ref2; + }, [dispatch, keyNavigationPrevious]); + + // Getter props. + var getSelectedItemProps = react.useCallback(function (_temp) { + var _extends2; + var _ref3 = _temp === void 0 ? {} : _temp, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + selectedItem = _ref3.selectedItem, + index = _ref3.index, + rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded); + var latestState = latest.current.state; + var itemIndex = getItemIndex(index, selectedItem, latestState.selectedItems); + if (itemIndex < 0) { + throw new Error('Pass either selectedItem or index in getSelectedItemProps!'); + } + return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (selectedItemNode) { + if (selectedItemNode) { + selectedItemRefs.current.push(selectedItemNode); + } + }), _extends2.tabIndex = index === latestState.activeIndex ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, function selectedItemHandleClick() { + dispatch({ + type: SelectedItemClick, + index: index + }); + }), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, function selectedItemHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && selectedItemKeyDownHandlers[key]) { + selectedItemKeyDownHandlers[key](event); + } + }), _extends2), rest); + }, [dispatch, latest, selectedItemKeyDownHandlers]); + var getDropdownProps = react.useCallback(function (_temp2, _temp3) { + var _extends3; + var _ref4 = _temp2 === void 0 ? {} : _temp2, + _ref4$refKey = _ref4.refKey, + refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey, + ref = _ref4.ref, + onKeyDown = _ref4.onKeyDown, + onClick = _ref4.onClick, + _ref4$preventKeyActio = _ref4.preventKeyAction, + preventKeyAction = _ref4$preventKeyActio === void 0 ? false : _ref4$preventKeyActio, + rest = _objectWithoutPropertiesLoose__default["default"](_ref4, _excluded2); + var _ref5 = _temp3 === void 0 ? {} : _temp3, + _ref5$suppressRefErro = _ref5.suppressRefError, + suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro; + setGetterPropCallInfo('getDropdownProps', suppressRefError, refKey, dropdownRef); + return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (dropdownNode) { + if (dropdownNode) { + dropdownRef.current = dropdownNode; + } + }), _extends3), !preventKeyAction && { + onKeyDown: callAllEventHandlers(onKeyDown, function dropdownHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && dropdownKeyDownHandlers[key]) { + dropdownKeyDownHandlers[key](event); + } + }), + onClick: callAllEventHandlers(onClick, function dropdownHandleClick() { + dispatch({ + type: DropdownClick + }); + }) + }, rest); + }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]); + + // returns + var addSelectedItem = react.useCallback(function (selectedItem) { + dispatch({ + type: FunctionAddSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var removeSelectedItem = react.useCallback(function (selectedItem) { + dispatch({ + type: FunctionRemoveSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var setSelectedItems = react.useCallback(function (newSelectedItems) { + dispatch({ + type: FunctionSetSelectedItems, + selectedItems: newSelectedItems + }); + }, [dispatch]); + var setActiveIndex = react.useCallback(function (newActiveIndex) { + dispatch({ + type: FunctionSetActiveIndex, + activeIndex: newActiveIndex + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset + }); + }, [dispatch]); + return { + getSelectedItemProps: getSelectedItemProps, + getDropdownProps: getDropdownProps, + addSelectedItem: addSelectedItem, + removeSelectedItem: removeSelectedItem, + setSelectedItems: setSelectedItems, + setActiveIndex: setActiveIndex, + reset: reset, + selectedItems: selectedItems, + activeIndex: activeIndex + }; +} + +exports["default"] = Downshift$1; +exports.resetIdCounter = resetIdCounter; +exports.useCombobox = useCombobox; +exports.useMultipleSelection = useMultipleSelection; +exports.useSelect = useSelect; diff --git a/dist/downshift.umd.js b/dist/downshift.umd.js new file mode 100644 index 000000000..90a2762e2 --- /dev/null +++ b/dist/downshift.umd.js @@ -0,0 +1,4856 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) : + typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Downshift = {}, global.React)); +})(this, (function (exports, react) { 'use strict'; + + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + return target; + } + + function _extends() { + _extends = Object.assign ? Object.assign.bind() : function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var reactIs_development = createCommonjsModule(function (module, exports) { + + { + (function () { + + // The Symbol used to tag the ReactElement-like types. If there is no native Symbol + // nor polyfill, then a plain number is used for performance. + var hasSymbol = typeof Symbol === 'function' && Symbol.for; + var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; + var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; + var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; + var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; + var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; + var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; + var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary + // (unstable) APIs that have been removed. Can we remove the symbols? + + var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; + var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; + var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; + var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; + var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; + var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; + var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; + var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; + var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; + var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; + var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || + // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); + } + function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + default: + var $$typeofType = type && type.$$typeof; + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + default: + return $$typeof; + } + } + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + return undefined; + } // AsyncMode is deprecated along with isAsyncMode + + var AsyncMode = REACT_ASYNC_MODE_TYPE; + var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; + var ContextConsumer = REACT_CONTEXT_TYPE; + var ContextProvider = REACT_PROVIDER_TYPE; + var Element = REACT_ELEMENT_TYPE; + var ForwardRef = REACT_FORWARD_REF_TYPE; + var Fragment = REACT_FRAGMENT_TYPE; + var Lazy = REACT_LAZY_TYPE; + var Memo = REACT_MEMO_TYPE; + var Portal = REACT_PORTAL_TYPE; + var Profiler = REACT_PROFILER_TYPE; + var StrictMode = REACT_STRICT_MODE_TYPE; + var Suspense = REACT_SUSPENSE_TYPE; + var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + + function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; + } + function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; + } + function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; + } + function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; + } + function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; + } + function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; + } + function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; + } + function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; + } + function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; + } + function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; + } + function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; + } + function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; + } + exports.AsyncMode = AsyncMode; + exports.ConcurrentMode = ConcurrentMode; + exports.ContextConsumer = ContextConsumer; + exports.ContextProvider = ContextProvider; + exports.Element = Element; + exports.ForwardRef = ForwardRef; + exports.Fragment = Fragment; + exports.Lazy = Lazy; + exports.Memo = Memo; + exports.Portal = Portal; + exports.Profiler = Profiler; + exports.StrictMode = StrictMode; + exports.Suspense = Suspense; + exports.isAsyncMode = isAsyncMode; + exports.isConcurrentMode = isConcurrentMode; + exports.isContextConsumer = isContextConsumer; + exports.isContextProvider = isContextProvider; + exports.isElement = isElement; + exports.isForwardRef = isForwardRef; + exports.isFragment = isFragment; + exports.isLazy = isLazy; + exports.isMemo = isMemo; + exports.isPortal = isPortal; + exports.isProfiler = isProfiler; + exports.isStrictMode = isStrictMode; + exports.isSuspense = isSuspense; + exports.isValidElementType = isValidElementType; + exports.typeOf = typeOf; + })(); + } + }); + reactIs_development.AsyncMode; + reactIs_development.ConcurrentMode; + reactIs_development.ContextConsumer; + reactIs_development.ContextProvider; + reactIs_development.Element; + reactIs_development.ForwardRef; + reactIs_development.Fragment; + reactIs_development.Lazy; + reactIs_development.Memo; + reactIs_development.Portal; + reactIs_development.Profiler; + reactIs_development.StrictMode; + reactIs_development.Suspense; + reactIs_development.isAsyncMode; + reactIs_development.isConcurrentMode; + reactIs_development.isContextConsumer; + reactIs_development.isContextProvider; + reactIs_development.isElement; + reactIs_development.isForwardRef; + reactIs_development.isFragment; + reactIs_development.isLazy; + reactIs_development.isMemo; + reactIs_development.isPortal; + reactIs_development.isProfiler; + reactIs_development.isStrictMode; + reactIs_development.isSuspense; + reactIs_development.isValidElementType; + reactIs_development.typeOf; + + var reactIs = createCommonjsModule(function (module) { + + { + module.exports = reactIs_development; + } + }); + var reactIs_1 = reactIs.isForwardRef; + + /* + object-assign + (c) Sindre Sorhus + @license MIT + */ + + /* eslint-disable no-unused-vars */ + var getOwnPropertySymbols = Object.getOwnPropertySymbols; + var hasOwnProperty = Object.prototype.hasOwnProperty; + var propIsEnumerable = Object.prototype.propertyIsEnumerable; + function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + return Object(val); + } + function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { + return false; + } + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } + } + var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + return to; + }; + + /** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + var ReactPropTypesSecret$2 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + var ReactPropTypesSecret_1 = ReactPropTypesSecret$2; + + var has$2 = Function.call.bind(Object.prototype.hasOwnProperty); + + var ReactPropTypesSecret$1 = ReactPropTypesSecret_1; + + var has$1 = has$2; + + var printWarning$1 = function () {}; + { + var ReactPropTypesSecret = ReactPropTypesSecret$1; + var loggedTypeFailures = {}; + var has = has$1; + printWarning$1 = function (text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {/**/} + }; + } + + /** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ + function checkPropTypes$1(typeSpecs, values, location, componentName, getStack) { + { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning$1((componentName || 'React class') + ': type specification of ' + location + ' `' + typeSpecName + '` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).'); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + var stack = getStack ? getStack() : ''; + printWarning$1('Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')); + } + } + } + } + } + + /** + * Resets warning cache when testing. + * + * @private + */ + checkPropTypes$1.resetWarningCache = function () { + { + loggedTypeFailures = {}; + } + }; + var checkPropTypes_1 = checkPropTypes$1; + + var checkPropTypes = checkPropTypes_1; + + var printWarning = function () {}; + { + printWarning = function (text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; + } + function emptyFunctionThatReturnsNull() { + return null; + } + var factoryWithTypeCheckers = function (isValidElement, throwOnDirectAccess) { + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<>'; + + // Important! + // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bigint: createPrimitiveTypeChecker('bigint'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + symbol: createPrimitiveTypeChecker('symbol'), + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + elementType: createElementTypeTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker, + exact: createStrictShapeTypeChecker + }; + + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + /*eslint-disable no-self-compare*/ + function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return x !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } + } + /*eslint-enable no-self-compare*/ + + /** + * We use an Error-like object for backward compatibility as people may call + * PropTypes directly and inspect their output. However, we don't use real + * Errors anymore. We don't inspect their stack anyway, and creating them + * is prohibitively expensive if they are created too often, such as what + * happens in oneOfType() for any type before the one that matched. + */ + function PropTypeError(message, data) { + this.message = message; + this.data = data && typeof data === 'object' ? data : {}; + this.stack = ''; + } + // Make `instanceof Error` still work for returned errors. + PropTypeError.prototype = Error.prototype; + function createChainableTypeChecker(validate) { + { + var manualPropTypeCallCache = {}; + var manualPropTypeWarningCount = 0; + } + function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + if (secret !== ReactPropTypesSecret$1) { + if (throwOnDirectAccess) { + // New behavior only for users of `prop-types` package + var err = new Error('Calling PropTypes validators directly is not supported by the `prop-types` package. ' + 'Use `PropTypes.checkPropTypes()` to call them. ' + 'Read more at http://fb.me/use-check-prop-types'); + err.name = 'Invariant Violation'; + throw err; + } else if (typeof console !== 'undefined') { + // Old behavior for people using React.PropTypes + var cacheKey = componentName + ':' + propName; + if (!manualPropTypeCallCache[cacheKey] && + // Avoid spamming the console because they are often not actionable except for lib authors + manualPropTypeWarningCount < 3) { + printWarning('You are manually calling a React.PropTypes validation ' + 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + 'and will throw in the standalone `prop-types` package. ' + 'You may be seeing this warning due to a third-party PropTypes ' + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'); + manualPropTypeCallCache[cacheKey] = true; + manualPropTypeWarningCount++; + } + } + } + if (props[propName] == null) { + if (isRequired) { + if (props[propName] === null) { + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); + } + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + return chainedCheckType; + } + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName, secret) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'), { + expectedType: expectedType + }); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunctionThatReturnsNull); + } + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); + } + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret$1); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!isValidElement(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createElementTypeTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!reactIs.isValidElementType(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + { + if (arguments.length > 1) { + printWarning('Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'); + } else { + printWarning('Invalid argument supplied to oneOf, expected an array.'); + } + } + return emptyFunctionThatReturnsNull; + } + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (is(propValue, expectedValues[i])) { + return null; + } + } + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + var type = getPreciseType(value); + if (type === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); + } + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (has$1(propValue, key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') ; + return emptyFunctionThatReturnsNull; + } + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (typeof checker !== 'function') { + printWarning('Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'); + return emptyFunctionThatReturnsNull; + } + } + function validate(props, propName, componentName, location, propFullName) { + var expectedTypes = []; + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret$1); + if (checkerResult == null) { + return null; + } + if (checkerResult.data && has$1(checkerResult.data, 'expectedType')) { + expectedTypes.push(checkerResult.data.expectedType); + } + } + var expectedTypesMessage = expectedTypes.length > 0 ? ', expected one of type [' + expectedTypes.join(', ') + ']' : ''; + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.')); + } + return createChainableTypeChecker(validate); + } + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + function invalidValidatorError(componentName, location, propFullName, key, type) { + return new PropTypeError((componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'); + } + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + function createStrictShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + // We need to check all keys in case some are required but missing from props. + var allKeys = objectAssign({}, props[propName], shapeTypes); + for (var key in allKeys) { + var checker = shapeTypes[key]; + if (has$1(shapeTypes, key) && typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + if (!checker) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || isValidElement(propValue)) { + return true; + } + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + return true; + default: + return false; + } + } + function isSymbol(propType, propValue) { + // Native Symbol. + if (propType === 'symbol') { + return true; + } + + // falsy value can't be a Symbol + if (!propValue) { + return false; + } + + // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' + if (propValue['@@toStringTag'] === 'Symbol') { + return true; + } + + // Fallback for non-spec compliant Symbols which are polyfilled. + if (typeof Symbol === 'function' && propValue instanceof Symbol) { + return true; + } + return false; + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + if (isSymbol(propType, propValue)) { + return 'symbol'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + if (typeof propValue === 'undefined' || propValue === null) { + return '' + propValue; + } + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns a string that is postfixed to a warning about an invalid type. + // For example, "undefined" or "of type array" + function getPostfixForTypeWarning(value) { + var type = getPreciseType(value); + switch (type) { + case 'array': + case 'object': + return 'an ' + type; + case 'boolean': + case 'date': + case 'regexp': + return 'a ' + type; + default: + return type; + } + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return ANONYMOUS; + } + return propValue.constructor.name; + } + ReactPropTypes.checkPropTypes = checkPropTypes; + ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; + ReactPropTypes.PropTypes = ReactPropTypes; + return ReactPropTypes; + }; + + var require$$1 = factoryWithTypeCheckers; + + var propTypes$2 = createCommonjsModule(function (module) { + /** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + { + var ReactIs = reactIs; + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = require$$1(ReactIs.isElement, throwOnDirectAccess); + } + }); + var PropTypes = propTypes$2; + + function t(t) { + return "object" == typeof t && null != t && 1 === t.nodeType; + } + function e(t, e) { + return (!e || "hidden" !== t) && "visible" !== t && "clip" !== t; + } + function n(t, n) { + if (t.clientHeight < t.scrollHeight || t.clientWidth < t.scrollWidth) { + var r = getComputedStyle(t, null); + return e(r.overflowY, n) || e(r.overflowX, n) || function (t) { + var e = function (t) { + if (!t.ownerDocument || !t.ownerDocument.defaultView) return null; + try { + return t.ownerDocument.defaultView.frameElement; + } catch (t) { + return null; + } + }(t); + return !!e && (e.clientHeight < t.scrollHeight || e.clientWidth < t.scrollWidth); + }(t); + } + return !1; + } + function r(t, e, n, r, i, o, l, d) { + return o < t && l > e || o > t && l < e ? 0 : o <= t && d <= n || l >= e && d >= n ? o - t - r : l > e && d < n || o < t && d > n ? l - e + i : 0; + } + var i = function (e, i) { + var o = window, + l = i.scrollMode, + d = i.block, + f = i.inline, + h = i.boundary, + u = i.skipOverflowHiddenElements, + s = "function" == typeof h ? h : function (t) { + return t !== h; + }; + if (!t(e)) throw new TypeError("Invalid target"); + for (var a, c, g = document.scrollingElement || document.documentElement, p = [], m = e; t(m) && s(m);) { + if ((m = null == (c = (a = m).parentElement) ? a.getRootNode().host || null : c) === g) { + p.push(m); + break; + } + null != m && m === document.body && n(m) && !n(document.documentElement) || null != m && n(m, u) && p.push(m); + } + for (var w = o.visualViewport ? o.visualViewport.width : innerWidth, v = o.visualViewport ? o.visualViewport.height : innerHeight, W = window.scrollX || pageXOffset, H = window.scrollY || pageYOffset, b = e.getBoundingClientRect(), y = b.height, E = b.width, M = b.top, V = b.right, x = b.bottom, I = b.left, C = "start" === d || "nearest" === d ? M : "end" === d ? x : M + y / 2, R = "center" === f ? I + E / 2 : "end" === f ? V : I, T = [], k = 0; k < p.length; k++) { + var B = p[k], + D = B.getBoundingClientRect(), + O = D.height, + X = D.width, + Y = D.top, + L = D.right, + S = D.bottom, + j = D.left; + if ("if-needed" === l && M >= 0 && I >= 0 && x <= v && V <= w && M >= Y && x <= S && I >= j && V <= L) return T; + var N = getComputedStyle(B), + q = parseInt(N.borderLeftWidth, 10), + z = parseInt(N.borderTopWidth, 10), + A = parseInt(N.borderRightWidth, 10), + F = parseInt(N.borderBottomWidth, 10), + G = 0, + J = 0, + K = "offsetWidth" in B ? B.offsetWidth - B.clientWidth - q - A : 0, + P = "offsetHeight" in B ? B.offsetHeight - B.clientHeight - z - F : 0, + Q = "offsetWidth" in B ? 0 === B.offsetWidth ? 0 : X / B.offsetWidth : 0, + U = "offsetHeight" in B ? 0 === B.offsetHeight ? 0 : O / B.offsetHeight : 0; + if (g === B) G = "start" === d ? C : "end" === d ? C - v : "nearest" === d ? r(H, H + v, v, z, F, H + C, H + C + y, y) : C - v / 2, J = "start" === f ? R : "center" === f ? R - w / 2 : "end" === f ? R - w : r(W, W + w, w, q, A, W + R, W + R + E, E), G = Math.max(0, G + H), J = Math.max(0, J + W);else { + G = "start" === d ? C - Y - z : "end" === d ? C - S + F + P : "nearest" === d ? r(Y, S, O, z, F + P, C, C + y, y) : C - (Y + O / 2) + P / 2, J = "start" === f ? R - j - q : "center" === f ? R - (j + X / 2) + K / 2 : "end" === f ? R - L + A + K : r(j, L, X, q, A + K, R, R + E, E); + var Z = B.scrollLeft, + $ = B.scrollTop; + C += $ - (G = Math.max(0, Math.min($ + G / U, B.scrollHeight - O / U + P))), R += Z - (J = Math.max(0, Math.min(Z + J / Q, B.scrollWidth - X / Q + K))); + } + T.push({ + el: B, + top: G, + left: J + }); + } + return T; + }; + + var idCounter = 0; + + /** + * Accepts a parameter and returns it if it's a function + * or a noop function if it's not. This allows us to + * accept a callback, but not worry about it if it's not + * passed. + * @param {Function} cb the callback + * @return {Function} a function + */ + function cbToCb(cb) { + return typeof cb === 'function' ? cb : noop; + } + function noop() {} + + /** + * Scroll node into view if necessary + * @param {HTMLElement} node the element that should scroll into view + * @param {HTMLElement} menuNode the menu element of the component + */ + function scrollIntoView(node, menuNode) { + if (!node) { + return; + } + var actions = i(node, { + boundary: menuNode, + block: 'nearest', + scrollMode: 'if-needed' + }); + actions.forEach(function (_ref) { + var el = _ref.el, + top = _ref.top, + left = _ref.left; + el.scrollTop = top; + el.scrollLeft = left; + }); + } + + /** + * @param {HTMLElement} parent the parent node + * @param {HTMLElement} child the child node + * @return {Boolean} whether the parent is the child or the child is in the parent + */ + function isOrContainsNode(parent, child) { + return parent === child || parent.contains && parent.contains(child); + } + + /** + * Simple debounce implementation. Will call the given + * function once after the time given has passed since + * it was last called. + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + * @return {Function} the debounced function + */ + function debounce(fn, time) { + var timeoutId; + function cancel() { + if (timeoutId) { + clearTimeout(timeoutId); + } + } + function wrapper() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + cancel(); + timeoutId = setTimeout(function () { + timeoutId = null; + fn.apply(void 0, args); + }, time); + } + wrapper.cancel = cancel; + return wrapper; + } + + /** + * This is intended to be used to compose event handlers. + * They are executed in order until one of them sets + * `event.preventDownshiftDefault = true`. + * @param {...Function} fns the event handler functions + * @return {Function} the event handler to add to an element + */ + function callAllEventHandlers() { + for (var _len2 = arguments.length, fns = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + fns[_key2] = arguments[_key2]; + } + return function (event) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return fns.some(function (fn) { + if (fn) { + fn.apply(void 0, [event].concat(args)); + } + return event.preventDownshiftDefault || event.hasOwnProperty('nativeEvent') && event.nativeEvent.preventDownshiftDefault; + }); + }; + } + function handleRefs() { + for (var _len4 = arguments.length, refs = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { + refs[_key4] = arguments[_key4]; + } + return function (node) { + refs.forEach(function (ref) { + if (typeof ref === 'function') { + ref(node); + } else if (ref) { + ref.current = node; + } + }); + }; + } + + /** + * This generates a unique ID for an instance of Downshift + * @return {String} the unique ID + */ + function generateId() { + return String(idCounter++); + } + + /** + * Resets idCounter to 0. Used for SSR. + */ + function resetIdCounter() { + idCounter = 0; + } + + /** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ + function getA11yStatusMessage$1(_ref2) { + var isOpen = _ref2.isOpen, + resultCount = _ref2.resultCount, + previousResultCount = _ref2.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter key to select."; + } + return ''; + } + + /** + * Takes an argument and if it's an array, returns the first item in the array + * otherwise returns the argument + * @param {*} arg the maybe-array + * @param {*} defaultValue the value if arg is falsey not defined + * @return {*} the arg or it's first item + */ + function unwrapArray(arg, defaultValue) { + arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */arg[0] : arg; + if (!arg && defaultValue) { + return defaultValue; + } else { + return arg; + } + } + + /** + * @param {Object} element (P)react element + * @return {Boolean} whether it's a DOM element + */ + function isDOMElement(element) { + // then we assume this is react + return typeof element.type === 'string'; + } + + /** + * @param {Object} element (P)react element + * @return {Object} the props + */ + function getElementProps(element) { + return element.props; + } + + /** + * Throws a helpful error message for required properties. Useful + * to be used as a default in destructuring or object params. + * @param {String} fnName the function name + * @param {String} propName the prop name + */ + function requiredProp(fnName, propName) { + // eslint-disable-next-line no-console + console.error("The property \"" + propName + "\" is required in \"" + fnName + "\""); + } + var stateKeys = ['highlightedIndex', 'inputValue', 'isOpen', 'selectedItem', 'type']; + /** + * @param {Object} state the state object + * @return {Object} state that is relevant to downshift + */ + function pickState(state) { + if (state === void 0) { + state = {}; + } + var result = {}; + stateKeys.forEach(function (k) { + if (state.hasOwnProperty(k)) { + result[k] = state[k]; + } + }); + return result; + } + + /** + * This will perform a shallow merge of the given state object + * with the state coming from props + * (for the controlled component scenario) + * This is used in state updater functions so they're referencing + * the right state regardless of where it comes from. + * + * @param {Object} state The state of the component/hook. + * @param {Object} props The props that may contain controlled values. + * @returns {Object} The merged controlled state. + */ + function getState(state, props) { + return Object.keys(state).reduce(function (prevState, key) { + prevState[key] = isControlledProp(props, key) ? props[key] : state[key]; + return prevState; + }, {}); + } + + /** + * This determines whether a prop is a "controlled prop" meaning it is + * state which is controlled by the outside of this component rather + * than within this component. + * + * @param {Object} props The props that may contain controlled values. + * @param {String} key the key to check + * @return {Boolean} whether it is a controlled controlled prop + */ + function isControlledProp(props, key) { + return props[key] !== undefined; + } + + /** + * Normalizes the 'key' property of a KeyboardEvent in IE/Edge + * @param {Object} event a keyboardEvent object + * @return {String} keyboard key + */ + function normalizeArrowKey(event) { + var key = event.key, + keyCode = event.keyCode; + /* istanbul ignore next (ie) */ + if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) { + return "Arrow" + key; + } + return key; + } + + /** + * Simple check if the value passed is object literal + * @param {*} obj any things + * @return {Boolean} whether it's object literal + */ + function isPlainObject(obj) { + return Object.prototype.toString.call(obj) === '[object Object]'; + } + + /** + * Returns the new index in the list, in a circular way. If next value is out of bonds from the total, + * it will wrap to either 0 or itemCount - 1. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @returns {number} The new index after the move. + */ + function getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + if (circular === void 0) { + circular = true; + } + if (itemCount === 0) { + return -1; + } + var itemsLastIndex = itemCount - 1; + if (typeof baseIndex !== 'number' || baseIndex < 0 || baseIndex >= itemCount) { + baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1; + } + var newIndex = baseIndex + moveAmount; + if (newIndex < 0) { + newIndex = circular ? itemsLastIndex : 0; + } else if (newIndex > itemsLastIndex) { + newIndex = circular ? 0 : itemsLastIndex; + } + var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular); + return nonDisabledNewIndex === -1 ? baseIndex : nonDisabledNewIndex; + } + + /** + * Returns the next index in the list of an item that is not disabled. + * + * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards. + * @param {number} baseIndex The initial position to move from. + * @param {number} itemCount The total number of items. + * @param {Function} getItemNodeFromIndex Used to check if item is disabled. + * @param {boolean} circular Specify if navigation is circular. Default is true. + * @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. + */ + function getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) { + var currentElementNode = getItemNodeFromIndex(baseIndex); + if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) { + return baseIndex; + } + if (moveAmount > 0) { + for (var index = baseIndex + 1; index < itemCount; index++) { + if (!getItemNodeFromIndex(index).hasAttribute('disabled')) { + return index; + } + } + } else { + for (var _index = baseIndex - 1; _index >= 0; _index--) { + if (!getItemNodeFromIndex(_index).hasAttribute('disabled')) { + return _index; + } + } + } + if (circular) { + return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false); + } + return -1; + } + + /** + * Checks if event target is within the downshift elements. + * + * @param {EventTarget} target Target to check. + * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc). + * @param {Document} document The document. + * @param {boolean} checkActiveElement Whether to also check activeElement. + * + * @returns {boolean} Whether or not the target is within downshift elements. + */ + function targetWithinDownshift(target, downshiftElements, document, checkActiveElement) { + if (checkActiveElement === void 0) { + checkActiveElement = true; + } + return downshiftElements.some(function (contextNode) { + return contextNode && (isOrContainsNode(contextNode, target) || checkActiveElement && isOrContainsNode(contextNode, document.activeElement)); + }); + } + function validateControlledUnchanged(state, prevProps, nextProps) { + var warningDescription = "This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props"; + Object.keys(state).forEach(function (propKey) { + if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the controlled prop \"" + propKey + "\" to be uncontrolled. " + warningDescription); + } else if (prevProps[propKey] === undefined && nextProps[propKey] !== undefined) { + // eslint-disable-next-line no-console + console.error("downshift: A component has changed the uncontrolled prop \"" + propKey + "\" to be controlled. " + warningDescription); + } + }); + } + + var cleanupStatus = debounce(function () { + getStatusDiv().textContent = ''; + }, 500); + + /** + * @param {String} status the status message + * @param {Object} documentProp document passed by the user. + */ + function setStatus(status, documentProp) { + var div = getStatusDiv(documentProp); + if (!status) { + return; + } + div.textContent = status; + cleanupStatus(); + } + + /** + * Get the status node or create it if it does not already exist. + * @param {Object} documentProp document passed by the user. + * @return {HTMLElement} the status node. + */ + function getStatusDiv(documentProp) { + if (documentProp === void 0) { + documentProp = document; + } + var statusDiv = documentProp.getElementById('a11y-status-message'); + if (statusDiv) { + return statusDiv; + } + statusDiv = documentProp.createElement('div'); + statusDiv.setAttribute('id', 'a11y-status-message'); + statusDiv.setAttribute('role', 'status'); + statusDiv.setAttribute('aria-live', 'polite'); + statusDiv.setAttribute('aria-relevant', 'additions text'); + Object.assign(statusDiv.style, { + border: '0', + clip: 'rect(0 0 0 0)', + height: '1px', + margin: '-1px', + overflow: 'hidden', + padding: '0', + position: 'absolute', + width: '1px' + }); + documentProp.body.appendChild(statusDiv); + return statusDiv; + } + + var unknown = '__autocomplete_unknown__'; + var mouseUp = '__autocomplete_mouseup__'; + var itemMouseEnter = '__autocomplete_item_mouseenter__'; + var keyDownArrowUp = '__autocomplete_keydown_arrow_up__'; + var keyDownArrowDown = '__autocomplete_keydown_arrow_down__'; + var keyDownEscape = '__autocomplete_keydown_escape__'; + var keyDownEnter = '__autocomplete_keydown_enter__'; + var keyDownHome = '__autocomplete_keydown_home__'; + var keyDownEnd = '__autocomplete_keydown_end__'; + var clickItem = '__autocomplete_click_item__'; + var blurInput = '__autocomplete_blur_input__'; + var changeInput = '__autocomplete_change_input__'; + var keyDownSpaceButton = '__autocomplete_keydown_space_button__'; + var clickButton = '__autocomplete_click_button__'; + var blurButton = '__autocomplete_blur_button__'; + var controlledPropUpdatedSelectedItem = '__autocomplete_controlled_prop_updated_selected_item__'; + var touchEnd = '__autocomplete_touchend__'; + + var stateChangeTypes$3 = /*#__PURE__*/Object.freeze({ + __proto__: null, + unknown: unknown, + mouseUp: mouseUp, + itemMouseEnter: itemMouseEnter, + keyDownArrowUp: keyDownArrowUp, + keyDownArrowDown: keyDownArrowDown, + keyDownEscape: keyDownEscape, + keyDownEnter: keyDownEnter, + keyDownHome: keyDownHome, + keyDownEnd: keyDownEnd, + clickItem: clickItem, + blurInput: blurInput, + changeInput: changeInput, + keyDownSpaceButton: keyDownSpaceButton, + clickButton: clickButton, + blurButton: blurButton, + controlledPropUpdatedSelectedItem: controlledPropUpdatedSelectedItem, + touchEnd: touchEnd + }); + + var _excluded$4 = ["refKey", "ref"], + _excluded2$3 = ["onClick", "onPress", "onKeyDown", "onKeyUp", "onBlur"], + _excluded3$2 = ["onKeyDown", "onBlur", "onChange", "onInput", "onChangeText"], + _excluded4$1 = ["refKey", "ref"], + _excluded5$1 = ["onMouseMove", "onMouseDown", "onClick", "onPress", "index", "item"]; + var Downshift = /*#__PURE__*/function () { + var Downshift = /*#__PURE__*/function (_Component) { + _inheritsLoose(Downshift, _Component); + function Downshift(_props) { + var _this = _Component.call(this, _props) || this; + // fancy destructuring + defaults + aliases + // this basically says each value of state should either be set to + // the initial value or the default value if the initial value is not provided + _this.id = _this.props.id || "downshift-" + generateId(); + _this.menuId = _this.props.menuId || _this.id + "-menu"; + _this.labelId = _this.props.labelId || _this.id + "-label"; + _this.inputId = _this.props.inputId || _this.id + "-input"; + _this.getItemId = _this.props.getItemId || function (index) { + return _this.id + "-item-" + index; + }; + _this.input = null; + _this.items = []; + // itemCount can be changed asynchronously + // from within downshift (so it can't come from a prop) + // this is why we store it as an instance and use + // getItemCount rather than just use items.length + // (to support windowing + async) + _this.itemCount = null; + _this.previousResultCount = 0; + _this.timeoutIds = []; + /** + * @param {Function} fn the function to call after the time + * @param {Number} time the time to wait + */ + _this.internalSetTimeout = function (fn, time) { + var id = setTimeout(function () { + _this.timeoutIds = _this.timeoutIds.filter(function (i) { + return i !== id; + }); + fn(); + }, time); + _this.timeoutIds.push(id); + }; + _this.setItemCount = function (count) { + _this.itemCount = count; + }; + _this.unsetItemCount = function () { + _this.itemCount = null; + }; + _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) { + if (highlightedIndex === void 0) { + highlightedIndex = _this.props.defaultHighlightedIndex; + } + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends({ + highlightedIndex: highlightedIndex + }, otherStateToSet)); + }; + _this.clearSelection = function (cb) { + _this.internalSetState({ + selectedItem: null, + inputValue: '', + highlightedIndex: _this.props.defaultHighlightedIndex, + isOpen: _this.props.defaultIsOpen + }, cb); + }; + _this.selectItem = function (item, otherStateToSet, cb) { + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(_extends({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + selectedItem: item, + inputValue: _this.props.itemToString(item) + }, otherStateToSet), cb); + }; + _this.selectItemAtIndex = function (itemIndex, otherStateToSet, cb) { + var item = _this.items[itemIndex]; + if (item == null) { + return; + } + _this.selectItem(item, otherStateToSet, cb); + }; + _this.selectHighlightedItem = function (otherStateToSet, cb) { + return _this.selectItemAtIndex(_this.getState().highlightedIndex, otherStateToSet, cb); + }; + // any piece of our state can live in two places: + // 1. Uncontrolled: it's internal (this.state) + // We will call this.setState to update that state + // 2. Controlled: it's external (this.props) + // We will call this.props.onStateChange to update that state + // + // In addition, we'll call this.props.onChange if the + // selectedItem is changed. + _this.internalSetState = function (stateToSet, cb) { + var isItemSelected, onChangeArg; + var onStateChangeArg = {}; + var isStateToSetFunction = typeof stateToSet === 'function'; + + // we want to call `onInputValueChange` before the `setState` call + // so someone controlling the `inputValue` state gets notified of + // the input change as soon as possible. This avoids issues with + // preserving the cursor position. + // See https://github.com/downshift-js/downshift/issues/217 for more info. + if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(stateToSet.inputValue, _extends({}, _this.getStateAndHelpers(), stateToSet)); + } + return _this.setState(function (state) { + state = _this.getState(state); + var newStateToSet = isStateToSetFunction ? stateToSet(state) : stateToSet; + + // Your own function that could modify the state that will be set. + newStateToSet = _this.props.stateReducer(state, newStateToSet); + + // checks if an item is selected, regardless of if it's different from + // what was selected before + // used to determine if onSelect and onChange callbacks should be called + isItemSelected = newStateToSet.hasOwnProperty('selectedItem'); + // this keeps track of the object we want to call with setState + var nextState = {}; + // we need to call on change if the outside world is controlling any of our state + // and we're trying to update that state. OR if the selection has changed and we're + // trying to update the selection + if (isItemSelected && newStateToSet.selectedItem !== state.selectedItem) { + onChangeArg = newStateToSet.selectedItem; + } + newStateToSet.type = newStateToSet.type || unknown; + Object.keys(newStateToSet).forEach(function (key) { + // onStateChangeArg should only have the state that is + // actually changing + if (state[key] !== newStateToSet[key]) { + onStateChangeArg[key] = newStateToSet[key]; + } + // the type is useful for the onStateChangeArg + // but we don't actually want to set it in internal state. + // this is an undocumented feature for now... Not all internalSetState + // calls support it and I'm not certain we want them to yet. + // But it enables users controlling the isOpen state to know when + // the isOpen state changes due to mouseup events which is quite handy. + if (key === 'type') { + return; + } + newStateToSet[key]; + // if it's coming from props, then we don't care to set it internally + if (!isControlledProp(_this.props, key)) { + nextState[key] = newStateToSet[key]; + } + }); + + // if stateToSet is a function, then we weren't able to call onInputValueChange + // earlier, so we'll call it now that we know what the inputValue state will be. + if (isStateToSetFunction && newStateToSet.hasOwnProperty('inputValue')) { + _this.props.onInputValueChange(newStateToSet.inputValue, _extends({}, _this.getStateAndHelpers(), newStateToSet)); + } + return nextState; + }, function () { + // call the provided callback if it's a function + cbToCb(cb)(); + + // only call the onStateChange and onChange callbacks if + // we have relevant information to pass them. + var hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1; + if (hasMoreStateThanType) { + _this.props.onStateChange(onStateChangeArg, _this.getStateAndHelpers()); + } + if (isItemSelected) { + _this.props.onSelect(stateToSet.selectedItem, _this.getStateAndHelpers()); + } + if (onChangeArg !== undefined) { + _this.props.onChange(onChangeArg, _this.getStateAndHelpers()); + } + // this is currently undocumented and therefore subject to change + // We'll try to not break it, but just be warned. + _this.props.onUserAction(onStateChangeArg, _this.getStateAndHelpers()); + }); + }; + //////////////////////////// ROOT + _this.rootRef = function (node) { + return _this._rootNode = node; + }; + _this.getRootProps = function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$4); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + // this is used in the render to know whether the user has called getRootProps. + // It uses that to know whether to apply the props automatically + _this.getRootProps.called = true; + _this.getRootProps.refKey = refKey; + _this.getRootProps.suppressRefError = suppressRefError; + var _this$getState = _this.getState(), + isOpen = _this$getState.isOpen; + return _extends((_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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT + _this.keyDownHandlers = { + ArrowDown: function ArrowDown(event) { + var _this2 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? 5 : 1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowDown + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowDown + }, function () { + var itemCount = _this2.getItemCount(); + if (itemCount > 0) { + var _this2$getState = _this2.getState(), + highlightedIndex = _this2$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) { + return _this2.getItemNodeFromIndex(index); + }); + _this2.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowDown + }); + } + }); + } + }, + ArrowUp: function ArrowUp(event) { + var _this3 = this; + event.preventDefault(); + if (this.getState().isOpen) { + var amount = event.shiftKey ? -5 : -1; + this.moveHighlightedIndex(amount, { + type: keyDownArrowUp + }); + } else { + this.internalSetState({ + isOpen: true, + type: keyDownArrowUp + }, function () { + var itemCount = _this3.getItemCount(); + if (itemCount > 0) { + var _this3$getState = _this3.getState(), + highlightedIndex = _this3$getState.highlightedIndex; + var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) { + return _this3.getItemNodeFromIndex(index); + }); + _this3.setHighlightedIndex(nextHighlightedIndex, { + type: keyDownArrowUp + }); + } + }); + } + }, + Enter: function Enter(event) { + if (event.which === 229) { + return; + } + var _this$getState2 = this.getState(), + isOpen = _this$getState2.isOpen, + highlightedIndex = _this$getState2.highlightedIndex; + if (isOpen && highlightedIndex != null) { + event.preventDefault(); + var item = this.items[highlightedIndex]; + var itemNode = this.getItemNodeFromIndex(highlightedIndex); + if (item == null || itemNode && itemNode.hasAttribute('disabled')) { + return; + } + this.selectHighlightedItem({ + type: keyDownEnter + }); + } + }, + Escape: function Escape(event) { + event.preventDefault(); + this.reset({ + type: keyDownEscape, + selectedItem: null, + inputValue: '' + }); + } + }; + //////////////////////////// BUTTON + _this.buttonKeyDownHandlers = _extends({}, _this.keyDownHandlers, { + ' ': function _(event) { + event.preventDefault(); + this.toggleMenu({ + type: keyDownSpaceButton + }); + } + }); + _this.inputKeyDownHandlers = _extends({}, _this.keyDownHandlers, { + Home: function Home(event) { + var _this4 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState3 = this.getState(), + isOpen = _this$getState3.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting downwards from 0 if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) { + return _this4.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownHome + }); + }, + End: function End(event) { + var _this5 = this; + event.preventDefault(); + var itemCount = this.getItemCount(); + var _this$getState4 = this.getState(), + isOpen = _this$getState4.isOpen; + if (itemCount <= 0 || !isOpen) { + return; + } + + // get next non-disabled starting upwards from last index if that's disabled. + var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) { + return _this5.getItemNodeFromIndex(index); + }, false); + this.setHighlightedIndex(newHighlightedIndex, { + type: keyDownEnd + }); + } + }); + _this.getToggleButtonProps = function (_temp3) { + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick; + _ref3.onPress; + var onKeyDown = _ref3.onKeyDown, + onKeyUp = _ref3.onKeyUp, + onBlur = _ref3.onBlur, + rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$3); + var _this$getState5 = _this.getState(), + isOpen = _this$getState5.isOpen; + var enabledEventHandlers = { + onClick: callAllEventHandlers(onClick, _this.buttonHandleClick), + onKeyDown: callAllEventHandlers(onKeyDown, _this.buttonHandleKeyDown), + onKeyUp: callAllEventHandlers(onKeyUp, _this.buttonHandleKeyUp), + onBlur: callAllEventHandlers(onBlur, _this.buttonHandleBlur) + }; + var eventHandlers = rest.disabled ? {} : enabledEventHandlers; + return _extends({ + type: 'button', + role: 'button', + 'aria-label': isOpen ? 'close menu' : 'open menu', + 'aria-haspopup': true, + 'data-toggle': true + }, eventHandlers, rest); + }; + _this.buttonHandleKeyUp = function (event) { + // Prevent click event from emitting in Firefox + event.preventDefault(); + }; + _this.buttonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (_this.buttonKeyDownHandlers[key]) { + _this.buttonKeyDownHandlers[key].call(_assertThisInitialized(_this), event); + } + }; + _this.buttonHandleClick = function (event) { + event.preventDefault(); + // handle odd case for Safari and Firefox which + // don't give the button the focus properly. + /* istanbul ignore if (can't reasonably test this) */ + if (_this.props.environment.document.activeElement === _this.props.environment.document.body) { + event.target.focus(); + } + // to simplify testing components that use downshift, we'll not wrap this in a setTimeout + // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated + // when building for production and should therefore have no impact on production code. + + // Ensure that toggle of menu occurs after the potential blur event in iOS + _this.internalSetTimeout(function () { + return _this.toggleMenu({ + type: clickButton + }); + }); + }; + _this.buttonHandleBlur = function (event) { + var blurTarget = event.target; // Save blur target for comparison with activeElement later + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element + _this.internalSetTimeout(function () { + if (!_this.isMouseDown && (_this.props.environment.document.activeElement == null || _this.props.environment.document.activeElement.id !== _this.inputId) && _this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS) + ) { + _this.reset({ + type: blurButton + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON + /////////////////////////////// LABEL + _this.getLabelProps = function (props) { + return _extends({ + htmlFor: _this.inputId, + id: _this.labelId + }, props); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL + /////////////////////////////// INPUT + _this.getInputProps = function (_temp4) { + var _ref4 = _temp4 === void 0 ? {} : _temp4, + onKeyDown = _ref4.onKeyDown, + onBlur = _ref4.onBlur, + onChange = _ref4.onChange, + onInput = _ref4.onInput; + _ref4.onChangeText; + var rest = _objectWithoutPropertiesLoose(_ref4, _excluded3$2); + var onChangeKey; + var eventHandlers = {}; + + /* istanbul ignore next (preact) */ + + onChangeKey = 'onChange'; + var _this$getState6 = _this.getState(), + inputValue = _this$getState6.inputValue, + isOpen = _this$getState6.isOpen, + highlightedIndex = _this$getState6.highlightedIndex; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, _this.inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, _this.inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, _this.inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + return _extends({ + 'aria-autocomplete': 'list', + 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null, + 'aria-controls': isOpen ? _this.menuId : null, + 'aria-labelledby': _this.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: inputValue, + id: _this.inputId + }, eventHandlers, rest); + }; + _this.inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && _this.inputKeyDownHandlers[key]) { + _this.inputKeyDownHandlers[key].call(_assertThisInitialized(_this), event); + } + }; + _this.inputHandleChange = function (event) { + _this.internalSetState({ + type: changeInput, + isOpen: true, + inputValue: event.target.value, + highlightedIndex: _this.props.defaultHighlightedIndex + }); + }; + _this.inputHandleBlur = function () { + // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element + _this.internalSetTimeout(function () { + var downshiftButtonIsActive = _this.props.environment.document && !!_this.props.environment.document.activeElement && !!_this.props.environment.document.activeElement.dataset && _this.props.environment.document.activeElement.dataset.toggle && _this._rootNode && _this._rootNode.contains(_this.props.environment.document.activeElement); + if (!_this.isMouseDown && !downshiftButtonIsActive) { + _this.reset({ + type: blurInput + }); + } + }); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT + /////////////////////////////// MENU + _this.menuRef = function (node) { + _this._menuNode = node; + }; + _this.getMenuProps = function (_temp5, _temp6) { + var _extends3; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + props = _objectWithoutPropertiesLoose(_ref5, _excluded4$1); + var _ref6 = _temp6 === void 0 ? {} : _temp6, + _ref6$suppressRefErro = _ref6.suppressRefError, + suppressRefError = _ref6$suppressRefErro === void 0 ? false : _ref6$suppressRefErro; + _this.getMenuProps.called = true; + _this.getMenuProps.refKey = refKey; + _this.getMenuProps.suppressRefError = suppressRefError; + return _extends((_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); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU + /////////////////////////////// ITEM + _this.getItemProps = function (_temp7) { + var _enabledEventHandlers; + var _ref7 = _temp7 === void 0 ? {} : _temp7, + onMouseMove = _ref7.onMouseMove, + onMouseDown = _ref7.onMouseDown, + onClick = _ref7.onClick; + _ref7.onPress; + var index = _ref7.index, + _ref7$item = _ref7.item, + item = _ref7$item === void 0 ? requiredProp('getItemProps', 'item') : _ref7$item, + rest = _objectWithoutPropertiesLoose(_ref7, _excluded5$1); + if (index === undefined) { + _this.items.push(item); + index = _this.items.indexOf(item); + } else { + _this.items[index] = item; + } + var onSelectKey = 'onClick'; + var customClickHandler = onClick; + var enabledEventHandlers = (_enabledEventHandlers = { + // onMouseMove is used over onMouseEnter here. onMouseMove + // is only triggered on actual mouse movement while onMouseEnter + // can fire on DOM changes, interrupting keyboard navigation + onMouseMove: callAllEventHandlers(onMouseMove, function () { + if (index === _this.getState().highlightedIndex) { + return; + } + _this.setHighlightedIndex(index, { + type: itemMouseEnter + }); + + // We never want to manually scroll when changing state based + // on `onMouseMove` because we will be moving the element out + // from under the user which is currently scrolling/moving the + // cursor + _this.avoidScrolling = true; + _this.internalSetTimeout(function () { + return _this.avoidScrolling = false; + }, 250); + }), + onMouseDown: callAllEventHandlers(onMouseDown, function (event) { + // This prevents the activeElement from being changed + // to the item so it can remain with the current activeElement + // which is a more common use case. + event.preventDefault(); + }) + }, _enabledEventHandlers[onSelectKey] = callAllEventHandlers(customClickHandler, function () { + _this.selectItemAtIndex(index, { + type: clickItem + }); + }), _enabledEventHandlers); + + // Passing down the onMouseDown handler to prevent redirect + // of the activeElement if clicking on disabled items + var eventHandlers = rest.disabled ? { + onMouseDown: enabledEventHandlers.onMouseDown + } : enabledEventHandlers; + return _extends({ + id: _this.getItemId(index), + role: 'option', + 'aria-selected': _this.getState().highlightedIndex === index + }, eventHandlers, rest); + }; + //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM + _this.clearItems = function () { + _this.items = []; + }; + _this.reset = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref8) { + var selectedItem = _ref8.selectedItem; + return _extends({ + isOpen: _this.props.defaultIsOpen, + highlightedIndex: _this.props.defaultHighlightedIndex, + inputValue: _this.props.itemToString(selectedItem) + }, otherStateToSet); + }, cb); + }; + _this.toggleMenu = function (otherStateToSet, cb) { + if (otherStateToSet === void 0) { + otherStateToSet = {}; + } + otherStateToSet = pickState(otherStateToSet); + _this.internalSetState(function (_ref9) { + var isOpen = _ref9.isOpen; + return _extends({ + isOpen: !isOpen + }, isOpen && { + highlightedIndex: _this.props.defaultHighlightedIndex + }, otherStateToSet); + }, function () { + var _this$getState7 = _this.getState(), + isOpen = _this$getState7.isOpen, + highlightedIndex = _this$getState7.highlightedIndex; + if (isOpen) { + if (_this.getItemCount() > 0 && typeof highlightedIndex === 'number') { + _this.setHighlightedIndex(highlightedIndex, otherStateToSet); + } + } + cbToCb(cb)(); + }); + }; + _this.openMenu = function (cb) { + _this.internalSetState({ + isOpen: true + }, cb); + }; + _this.closeMenu = function (cb) { + _this.internalSetState({ + isOpen: false + }, cb); + }; + _this.updateStatus = debounce(function () { + var state = _this.getState(); + var item = _this.items[state.highlightedIndex]; + var resultCount = _this.getItemCount(); + var status = _this.props.getA11yStatusMessage(_extends({ + itemToString: _this.props.itemToString, + previousResultCount: _this.previousResultCount, + resultCount: resultCount, + highlightedItem: item + }, state)); + _this.previousResultCount = resultCount; + setStatus(status, _this.props.environment.document); + }, 200); + var _this$props = _this.props, + defaultHighlightedIndex = _this$props.defaultHighlightedIndex, + _this$props$initialHi = _this$props.initialHighlightedIndex, + _highlightedIndex = _this$props$initialHi === void 0 ? defaultHighlightedIndex : _this$props$initialHi, + defaultIsOpen = _this$props.defaultIsOpen, + _this$props$initialIs = _this$props.initialIsOpen, + _isOpen = _this$props$initialIs === void 0 ? defaultIsOpen : _this$props$initialIs, + _this$props$initialIn = _this$props.initialInputValue, + _inputValue = _this$props$initialIn === void 0 ? '' : _this$props$initialIn, + _this$props$initialSe = _this$props.initialSelectedItem, + _selectedItem = _this$props$initialSe === void 0 ? null : _this$props$initialSe; + var _state = _this.getState({ + highlightedIndex: _highlightedIndex, + isOpen: _isOpen, + inputValue: _inputValue, + selectedItem: _selectedItem + }); + if (_state.selectedItem != null && _this.props.initialInputValue === undefined) { + _state.inputValue = _this.props.itemToString(_state.selectedItem); + } + _this.state = _state; + return _this; + } + var _proto = Downshift.prototype; + /** + * Clear all running timeouts + */ + _proto.internalClearTimeouts = function internalClearTimeouts() { + this.timeoutIds.forEach(function (id) { + clearTimeout(id); + }); + this.timeoutIds = []; + } + + /** + * Gets the state based on internal state or props + * If a state value is passed via props, then that + * is the value given, otherwise it's retrieved from + * stateToMerge + * + * @param {Object} stateToMerge defaults to this.state + * @return {Object} the state + */; + _proto.getState = function getState$1(stateToMerge) { + if (stateToMerge === void 0) { + stateToMerge = this.state; + } + return getState(stateToMerge, this.props); + }; + _proto.getItemCount = function getItemCount() { + // things read better this way. They're in priority order: + // 1. `this.itemCount` + // 2. `this.props.itemCount` + // 3. `this.items.length` + var itemCount = this.items.length; + if (this.itemCount != null) { + itemCount = this.itemCount; + } else if (this.props.itemCount !== undefined) { + itemCount = this.props.itemCount; + } + return itemCount; + }; + _proto.getItemNodeFromIndex = function getItemNodeFromIndex(index) { + return this.props.environment.document.getElementById(this.getItemId(index)); + }; + _proto.scrollHighlightedItemIntoView = function scrollHighlightedItemIntoView() { + /* istanbul ignore else (react-native) */ + + var node = this.getItemNodeFromIndex(this.getState().highlightedIndex); + this.props.scrollIntoView(node, this._menuNode); + }; + _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) { + var _this6 = this; + var itemCount = this.getItemCount(); + var _this$getState8 = this.getState(), + highlightedIndex = _this$getState8.highlightedIndex; + if (itemCount > 0) { + var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) { + return _this6.getItemNodeFromIndex(index); + }); + this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet); + } + }; + _proto.getStateAndHelpers = function getStateAndHelpers() { + var _this$getState9 = this.getState(), + highlightedIndex = _this$getState9.highlightedIndex, + inputValue = _this$getState9.inputValue, + selectedItem = _this$getState9.selectedItem, + isOpen = _this$getState9.isOpen; + var itemToString = this.props.itemToString; + var id = this.id; + var getRootProps = this.getRootProps, + getToggleButtonProps = this.getToggleButtonProps, + getLabelProps = this.getLabelProps, + getMenuProps = this.getMenuProps, + getInputProps = this.getInputProps, + getItemProps = this.getItemProps, + openMenu = this.openMenu, + closeMenu = this.closeMenu, + toggleMenu = this.toggleMenu, + selectItem = this.selectItem, + selectItemAtIndex = this.selectItemAtIndex, + selectHighlightedItem = this.selectHighlightedItem, + setHighlightedIndex = this.setHighlightedIndex, + clearSelection = this.clearSelection, + clearItems = this.clearItems, + reset = this.reset, + setItemCount = this.setItemCount, + unsetItemCount = this.unsetItemCount, + setState = this.internalSetState; + return { + // prop getters + getRootProps: getRootProps, + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getItemProps: getItemProps, + // actions + reset: reset, + openMenu: openMenu, + closeMenu: closeMenu, + toggleMenu: toggleMenu, + selectItem: selectItem, + selectItemAtIndex: selectItemAtIndex, + selectHighlightedItem: selectHighlightedItem, + setHighlightedIndex: setHighlightedIndex, + clearSelection: clearSelection, + clearItems: clearItems, + setItemCount: setItemCount, + unsetItemCount: unsetItemCount, + setState: setState, + // props + itemToString: itemToString, + // derived + id: id, + // state + highlightedIndex: highlightedIndex, + inputValue: inputValue, + isOpen: isOpen, + selectedItem: selectedItem + }; + }; + _proto.componentDidMount = function componentDidMount() { + var _this7 = this; + /* istanbul ignore if (react-native) */ + if (this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + + /* istanbul ignore if (react-native) */ + + // this.isMouseDown helps us track whether the mouse is currently held down. + // This is useful when the user clicks on an item in the list, but holds the mouse + // down long enough for the list to disappear (because the blur event fires on the input) + // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should + // trigger hiding the menu. + var onMouseDown = function () { + _this7.isMouseDown = true; + }; + var onMouseUp = function (event) { + _this7.isMouseDown = false; + // if the target element or the activeElement is within a downshift node + // then we don't want to reset downshift + var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment.document); + if (!contextWithinDownshift && _this7.getState().isOpen) { + _this7.reset({ + type: mouseUp + }, function () { + return _this7.props.onOuterClick(_this7.getStateAndHelpers()); + }); + } + }; + // Touching an element in iOS gives focus and hover states, but touching out of + // the element will remove hover, and persist the focus state, resulting in the + // blur event not being triggered. + // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen. + // If the user taps outside of Downshift, the component should be reset, + // but not if the user is swiping + var onTouchStart = function () { + _this7.isTouchMove = false; + }; + var onTouchMove = function () { + _this7.isTouchMove = true; + }; + var onTouchEnd = function (event) { + var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment.document, false); + if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) { + _this7.reset({ + type: touchEnd + }, function () { + return _this7.props.onOuterClick(_this7.getStateAndHelpers()); + }); + } + }; + var environment = this.props.environment; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + this.cleanup = function () { + _this7.internalClearTimeouts(); + _this7.updateStatus.cancel(); + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + }; + _proto.shouldScroll = function shouldScroll(prevState, prevProps) { + var _ref10 = this.props.highlightedIndex === undefined ? this.getState() : this.props, + currentHighlightedIndex = _ref10.highlightedIndex; + var _ref11 = prevProps.highlightedIndex === undefined ? prevState : prevProps, + prevHighlightedIndex = _ref11.highlightedIndex; + var scrollWhenOpen = currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen; + return scrollWhenOpen || currentHighlightedIndex !== prevHighlightedIndex; + }; + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + validateControlledUnchanged(this.state, prevProps, this.props); + /* istanbul ignore if (react-native) */ + if (this.getMenuProps.called && !this.getMenuProps.suppressRefError) { + validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps); + } + if (isControlledProp(this.props, 'selectedItem') && this.props.selectedItemChanged(prevProps.selectedItem, this.props.selectedItem)) { + this.internalSetState({ + type: controlledPropUpdatedSelectedItem, + inputValue: this.props.itemToString(this.props.selectedItem) + }); + } + if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) { + this.scrollHighlightedItemIntoView(); + } + + /* istanbul ignore else (react-native) */ + + this.updateStatus(); + }; + _proto.componentWillUnmount = function componentWillUnmount() { + this.cleanup(); // avoids memory leak + }; + _proto.render = function render() { + var children = unwrapArray(this.props.children, noop); + // because the items are rerendered every time we call the children + // we clear this out each render and it will be populated again as + // getItemProps is called. + this.clearItems(); + // we reset this so we know whether the user calls getRootProps during + // this render. If they do then we don't need to do anything, + // if they don't then we need to clone the element they return and + // apply the props for them. + this.getRootProps.called = false; + this.getRootProps.refKey = undefined; + this.getRootProps.suppressRefError = undefined; + // we do something similar for getMenuProps + this.getMenuProps.called = false; + this.getMenuProps.refKey = undefined; + this.getMenuProps.suppressRefError = undefined; + // we do something similar for getLabelProps + this.getLabelProps.called = false; + // and something similar for getInputProps + this.getInputProps.called = false; + var element = unwrapArray(children(this.getStateAndHelpers())); + if (!element) { + return null; + } + if (this.getRootProps.called || this.props.suppressRefError) { + if (!this.getRootProps.suppressRefError && !this.props.suppressRefError) { + validateGetRootPropsCalledCorrectly(element, this.getRootProps); + } + return element; + } else if (isDOMElement(element)) { + // they didn't apply the root props, but we can clone + // this and apply the props ourselves + return /*#__PURE__*/react.cloneElement(element, this.getRootProps(getElementProps(element))); + } + + /* istanbul ignore else */ + + // they didn't apply the root props, but they need to + // otherwise we can't query around the autocomplete + throw new Error('downshift: If you return a non-DOM element, you must apply the getRootProps function'); + + /* istanbul ignore next */ + }; + return Downshift; + }(react.Component); + Downshift.defaultProps = { + defaultHighlightedIndex: null, + defaultIsOpen: false, + getA11yStatusMessage: getA11yStatusMessage$1, + itemToString: function itemToString(i) { + if (i == null) { + return ''; + } + if (isPlainObject(i) && !i.hasOwnProperty('toString')) { + // eslint-disable-next-line no-console + console.warn('downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.', 'The object that was passed:', i); + } + return String(i); + }, + onStateChange: noop, + onInputValueChange: noop, + onUserAction: noop, + onChange: noop, + onSelect: noop, + onOuterClick: noop, + selectedItemChanged: function selectedItemChanged(prevItem, item) { + return prevItem !== item; + }, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window, + stateReducer: function stateReducer(state, stateToSet) { + return stateToSet; + }, + suppressRefError: false, + scrollIntoView: scrollIntoView + }; + Downshift.stateChangeTypes = stateChangeTypes$3; + return Downshift; + }(); + Downshift.propTypes = { + children: PropTypes.func, + defaultHighlightedIndex: PropTypes.number, + defaultIsOpen: PropTypes.bool, + initialHighlightedIndex: PropTypes.number, + initialSelectedItem: PropTypes.any, + initialInputValue: PropTypes.string, + initialIsOpen: PropTypes.bool, + getA11yStatusMessage: PropTypes.func, + itemToString: PropTypes.func, + onChange: PropTypes.func, + onSelect: PropTypes.func, + onStateChange: PropTypes.func, + onInputValueChange: PropTypes.func, + onUserAction: PropTypes.func, + onOuterClick: PropTypes.func, + selectedItemChanged: PropTypes.func, + stateReducer: PropTypes.func, + itemCount: PropTypes.number, + id: PropTypes.string, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }), + suppressRefError: PropTypes.bool, + scrollIntoView: PropTypes.func, + // things we keep in state for uncontrolled components + // but can accept as props for controlled components + /* eslint-disable react/no-unused-prop-types */ + selectedItem: PropTypes.any, + isOpen: PropTypes.bool, + inputValue: PropTypes.string, + highlightedIndex: PropTypes.number, + labelId: PropTypes.string, + inputId: PropTypes.string, + menuId: PropTypes.string, + getItemId: PropTypes.func + /* eslint-enable react/no-unused-prop-types */ + }; + var Downshift$1 = Downshift; + function validateGetMenuPropsCalledCorrectly(node, _ref12) { + var refKey = _ref12.refKey; + if (!node) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from getMenuProps was not applied correctly on your menu element."); + } + } + function validateGetRootPropsCalledCorrectly(element, _ref13) { + var refKey = _ref13.refKey; + var refKeySpecified = refKey !== 'ref'; + var isComposite = !isDOMElement(element); + if (isComposite && !refKeySpecified && !reactIs_1(element)) { + // eslint-disable-next-line no-console + console.error('downshift: You returned a non-DOM element. You must specify a refKey in getRootProps'); + } else if (!isComposite && refKeySpecified) { + // eslint-disable-next-line no-console + console.error("downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \"" + refKey + "\""); + } + if (!reactIs_1(element) && !getElementProps(element)[refKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You must apply the ref prop \"" + refKey + "\" from getRootProps onto your root element."); + } + } + + var dropdownDefaultStateValues = { + highlightedIndex: -1, + isOpen: false, + selectedItem: null, + inputValue: '' + }; + function callOnChangeProps(action, state, newState) { + var props = action.props, + type = action.type; + var changes = {}; + Object.keys(state).forEach(function (key) { + invokeOnChangeHandler(key, props, state, newState); + if (newState[key] !== state[key]) { + changes[key] = newState[key]; + } + }); + if (props.onStateChange && Object.keys(changes).length) { + props.onStateChange(_extends({ + type: type + }, changes)); + } + } + function invokeOnChangeHandler(key, props, state, newState) { + var handler = "on" + capitalizeString(key) + "Change"; + if (props[handler] && newState[key] !== undefined && newState[key] !== state[key]) { + props[handler](newState); + } + } + + /** + * Default state reducer that returns the changes. + * + * @param {Object} s state. + * @param {Object} a action with changes. + * @returns {Object} changes. + */ + function stateReducer(s, a) { + return a.changes; + } + + /** + * Returns a message to be added to aria-live region when item is selected. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ + function getA11ySelectionMessage(selectionParameters) { + var selectedItem = selectionParameters.selectedItem, + itemToStringLocal = selectionParameters.itemToString; + return selectedItem ? itemToStringLocal(selectedItem) + " has been selected." : ''; + } + + /** + * Debounced call for updating the a11y message. + */ + var updateA11yStatus = debounce(function (getA11yMessage, document) { + setStatus(getA11yMessage(), document); + }, 200); + function getElementIds$1(_ref) { + var id = _ref.id, + labelId = _ref.labelId, + menuId = _ref.menuId, + getItemId = _ref.getItemId, + toggleButtonId = _ref.toggleButtonId; + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return { + labelId: labelId || uniqueId + "-label", + menuId: menuId || uniqueId + "-menu", + getItemId: getItemId || function (index) { + return uniqueId + "-item-" + index; + }, + toggleButtonId: toggleButtonId || uniqueId + "-toggle-button" + }; + } + function getItemIndex(index, item, items) { + if (index !== undefined) { + return index; + } + if (items.length === 0) { + return -1; + } + return items.indexOf(item); + } + function itemToString(item) { + return item ? String(item) : ''; + } + function getPropTypesValidator(caller, propTypes) { + // istanbul ignore next + return function (options) { + if (options === void 0) { + options = {}; + } + Object.keys(propTypes).forEach(function (key) { + PropTypes.checkPropTypes(propTypes, options, key, caller.name); + }); + }; + } + function isAcceptedCharacterKey(key) { + return /^\S{1}$/.test(key); + } + function capitalizeString(string) { + return "" + string.slice(0, 1).toUpperCase() + string.slice(1); + } + function useLatestRef(val) { + var ref = react.useRef(val); + // technically this is not "concurrent mode safe" because we're manipulating + // the value during render (so it's not idempotent). However, the places this + // hook is used is to support memoizing callbacks which will be called + // *during* render, so we need the latest values *during* render. + // If not for this, then we'd probably want to use useLayoutEffect instead. + ref.current = val; + return ref; + } + + /** + * Computes the controlled state using a the previous state, props, + * two reducers, one from downshift and an optional one from the user. + * Also calls the onChange handlers for state values that have changed. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ + function useEnhancedReducer(reducer, initialState, props, isStateEqual) { + var prevStateRef = react.useRef(); + var actionRef = react.useRef(); + var enhancedReducer = react.useCallback(function (state, action) { + actionRef.current = action; + state = getState(state, action.props); + var changes = reducer(state, action); + var newState = action.props.stateReducer(state, _extends({}, action, { + changes: changes + })); + return newState; + }, [reducer]); + var _useReducer = react.useReducer(enhancedReducer, initialState), + state = _useReducer[0], + dispatch = _useReducer[1]; + var propsRef = useLatestRef(props); + var dispatchWithProps = react.useCallback(function (action) { + return dispatch(_extends({ + props: propsRef.current + }, action)); + }, [propsRef]); + var action = actionRef.current; + react.useEffect(function () { + var shouldCallOnChangeProps = action && prevStateRef.current && !isStateEqual(prevStateRef.current, state); + if (shouldCallOnChangeProps) { + callOnChangeProps(action, getState(prevStateRef.current, action.props), state); + } + prevStateRef.current = state; + }, [state, action, isStateEqual]); + return [state, dispatchWithProps]; + } + + /** + * Wraps the useEnhancedReducer and applies the controlled prop values before + * returning the new state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. + * @returns {Array} An array with the state and an action dispatcher. + */ + function useControlledReducer$1(reducer, initialState, props, isStateEqual) { + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props, isStateEqual), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + return [getState(state, props), dispatch]; + } + var defaultProps$3 = { + itemToString: itemToString, + stateReducer: stateReducer, + getA11ySelectionMessage: getA11ySelectionMessage, + scrollIntoView: scrollIntoView, + circularNavigation: false, + environment: typeof window === 'undefined' /* istanbul ignore next (ssr) */ ? {} : window + }; + function getDefaultValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + var defaultPropKey = "default" + capitalizeString(propKey); + if (defaultPropKey in props) { + return props[defaultPropKey]; + } + return defaultStateValues[propKey]; + } + function getInitialValue$1(props, propKey, defaultStateValues) { + if (defaultStateValues === void 0) { + defaultStateValues = dropdownDefaultStateValues; + } + if (propKey in props) { + return props[propKey]; + } + var initialPropKey = "initial" + capitalizeString(propKey); + if (initialPropKey in props) { + return props[initialPropKey]; + } + return getDefaultValue$1(props, propKey, defaultStateValues); + } + function getInitialState$2(props) { + var selectedItem = getInitialValue$1(props, 'selectedItem'); + var isOpen = getInitialValue$1(props, 'isOpen'); + var highlightedIndex = getInitialValue$1(props, 'highlightedIndex'); + var inputValue = getInitialValue$1(props, 'inputValue'); + return { + highlightedIndex: highlightedIndex < 0 && selectedItem ? props.items.indexOf(selectedItem) : highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; + } + function getHighlightedIndexOnOpen(props, state, offset, getItemNodeFromIndex) { + var items = props.items, + initialHighlightedIndex = props.initialHighlightedIndex, + defaultHighlightedIndex = props.defaultHighlightedIndex; + var selectedItem = state.selectedItem, + highlightedIndex = state.highlightedIndex; + if (items.length === 0) { + return -1; + } + + // initialHighlightedIndex will give value to highlightedIndex on initial state only. + if (initialHighlightedIndex !== undefined && highlightedIndex === initialHighlightedIndex) { + return initialHighlightedIndex; + } + if (defaultHighlightedIndex !== undefined) { + return defaultHighlightedIndex; + } + if (selectedItem) { + if (offset === 0) { + return items.indexOf(selectedItem); + } + return getNextWrappingIndex(offset, items.indexOf(selectedItem), items.length, getItemNodeFromIndex, false); + } + if (offset === 0) { + return -1; + } + return offset < 0 ? items.length - 1 : 0; + } + + /** + * Reuse the movement tracking of mouse and touch events. + * + * @param {boolean} isOpen Whether the dropdown is open or not. + * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.) + * @param {Object} environment Environment where component/hook exists. + * @param {Function} handleBlur Handler on blur from mouse or touch. + * @returns {Object} Ref containing whether mouseDown or touchMove event is happening + */ + function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) { + var mouseAndTouchTrackersRef = react.useRef({ + isMouseDown: false, + isTouchMove: false + }); + react.useEffect(function () { + // The same strategy for checking if a click occurred inside or outside downsift + // as in downshift.js. + var onMouseDown = function () { + mouseAndTouchTrackersRef.current.isMouseDown = true; + }; + var onMouseUp = function (event) { + mouseAndTouchTrackersRef.current.isMouseDown = false; + if (isOpen && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document)) { + handleBlur(); + } + }; + var onTouchStart = function () { + mouseAndTouchTrackersRef.current.isTouchMove = false; + }; + var onTouchMove = function () { + mouseAndTouchTrackersRef.current.isTouchMove = true; + }; + var onTouchEnd = function (event) { + if (isOpen && !mouseAndTouchTrackersRef.current.isTouchMove && !targetWithinDownshift(event.target, downshiftElementRefs.map(function (ref) { + return ref.current; + }), environment.document, false)) { + handleBlur(); + } + }; + environment.addEventListener('mousedown', onMouseDown); + environment.addEventListener('mouseup', onMouseUp); + environment.addEventListener('touchstart', onTouchStart); + environment.addEventListener('touchmove', onTouchMove); + environment.addEventListener('touchend', onTouchEnd); + return function () { + environment.removeEventListener('mousedown', onMouseDown); + environment.removeEventListener('mouseup', onMouseUp); + environment.removeEventListener('touchstart', onTouchStart); + environment.removeEventListener('touchmove', onTouchMove); + environment.removeEventListener('touchend', onTouchEnd); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, environment]); + return mouseAndTouchTrackersRef; + } + + /** + * Custom hook that checks if getter props are called correctly. + * + * @param {...any} propKeys Getter prop names to be handled. + * @returns {Function} Setter function called inside getter props to set call information. + */ + function useGetterPropsCalledChecker() { + for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) { + propKeys[_key] = arguments[_key]; + } + var getterPropsCalledRef = react.useRef(propKeys.reduce(function (acc, propKey) { + acc[propKey] = {}; + return acc; + }, {})); + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + getterPropsCalledRef.current[propKey] = null; + }); + react.useEffect(function () { + Object.keys(getterPropsCalledRef.current).forEach(function (propKey) { + if (!getterPropsCalledRef.current[propKey]) { + // eslint-disable-next-line no-console + console.error("downshift: You forgot to call the " + propKey + " getter function on your component / element."); + return; + } + var _getterPropsCalledRef = getterPropsCalledRef.current[propKey], + suppressRefError = _getterPropsCalledRef.suppressRefError, + refKey = _getterPropsCalledRef.refKey, + elementRef = _getterPropsCalledRef.elementRef; + if ((!elementRef || !elementRef.current) && !suppressRefError) { + // eslint-disable-next-line no-console + console.error("downshift: The ref prop \"" + refKey + "\" from " + propKey + " was not applied correctly on your element."); + } + }); + }); + var setGetterPropCallInfo = react.useCallback(function (propKey, suppressRefError, refKey, elementRef) { + getterPropsCalledRef.current[propKey] = { + suppressRefError: suppressRefError, + refKey: refKey, + elementRef: elementRef + }; + }, []); + return setGetterPropCallInfo; + } + + /** + * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item. + * Used by useSelect and useCombobox. + * + * @param {Object} prevState + * @param {Object} newState + * @returns {boolean} Wheather the states are deeply equal. + */ + function isDropdownsStateEqual(prevState, newState) { + return prevState.isOpen === newState.isOpen && prevState.inputValue === newState.inputValue && prevState.highlightedIndex === newState.highlightedIndex && prevState.selectedItem === newState.selectedItem; + } + + function getItemIndexByCharacterKey(keysSoFar, highlightedIndex, items, itemToStringParam, getItemNodeFromIndex) { + var lowerCasedItemStrings = items.map(function (item) { + return itemToStringParam(item).toLowerCase(); + }); + var lowerCasedKeysSoFar = keysSoFar.toLowerCase(); + var isValid = function (itemString, index) { + var element = getItemNodeFromIndex(index); + return itemString.startsWith(lowerCasedKeysSoFar) && !(element && element.hasAttribute('disabled')); + }; + for (var index = highlightedIndex + 1; index < lowerCasedItemStrings.length; index++) { + var itemString = lowerCasedItemStrings[index]; + if (isValid(itemString, index)) { + return index; + } + } + for (var _index = 0; _index < highlightedIndex; _index++) { + var _itemString = lowerCasedItemStrings[_index]; + if (isValid(_itemString, _index)) { + return _index; + } + } + return highlightedIndex; + } + var propTypes$1 = { + items: PropTypes.array.isRequired, + itemToString: PropTypes.func, + getA11yStatusMessage: PropTypes.func, + getA11ySelectionMessage: PropTypes.func, + circularNavigation: PropTypes.bool, + highlightedIndex: PropTypes.number, + defaultHighlightedIndex: PropTypes.number, + initialHighlightedIndex: PropTypes.number, + isOpen: PropTypes.bool, + defaultIsOpen: PropTypes.bool, + initialIsOpen: PropTypes.bool, + selectedItem: PropTypes.any, + initialSelectedItem: PropTypes.any, + defaultSelectedItem: PropTypes.any, + id: PropTypes.string, + labelId: PropTypes.string, + menuId: PropTypes.string, + getItemId: PropTypes.func, + toggleButtonId: PropTypes.string, + stateReducer: PropTypes.func, + onSelectedItemChange: PropTypes.func, + onHighlightedIndexChange: PropTypes.func, + onStateChange: PropTypes.func, + onIsOpenChange: PropTypes.func, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }) + }; + + /** + * Default implementation for status message. Only added when menu is open. + * Will specift if there are results in the list, and if so, how many, + * and what keys are relevant. + * + * @param {Object} param the downshift state and other relevant properties + * @return {String} the a11y status message + */ + function getA11yStatusMessage(_ref) { + var isOpen = _ref.isOpen, + resultCount = _ref.resultCount, + previousResultCount = _ref.previousResultCount; + if (!isOpen) { + return ''; + } + if (!resultCount) { + return 'No results are available.'; + } + if (resultCount !== previousResultCount) { + return resultCount + " result" + (resultCount === 1 ? ' is' : 's are') + " available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select."; + } + return ''; + } + var defaultProps$2 = _extends({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage + }); + + var MenuKeyDownArrowDown = '__menu_keydown_arrow_down__'; + var MenuKeyDownArrowUp = '__menu_keydown_arrow_up__'; + var MenuKeyDownEscape = '__menu_keydown_escape__'; + var MenuKeyDownHome = '__menu_keydown_home__'; + var MenuKeyDownEnd = '__menu_keydown_end__'; + var MenuKeyDownEnter = '__menu_keydown_enter__'; + var MenuKeyDownSpaceButton = '__menu_keydown_space_button__'; + var MenuKeyDownCharacter = '__menu_keydown_character__'; + var MenuBlur = '__menu_blur__'; + var MenuMouseLeave$1 = '__menu_mouse_leave__'; + var ItemMouseMove$1 = '__item_mouse_move__'; + var ItemClick$1 = '__item_click__'; + var ToggleButtonClick$1 = '__togglebutton_click__'; + var ToggleButtonKeyDownArrowDown = '__togglebutton_keydown_arrow_down__'; + var ToggleButtonKeyDownArrowUp = '__togglebutton_keydown_arrow_up__'; + var ToggleButtonKeyDownCharacter = '__togglebutton_keydown_character__'; + var FunctionToggleMenu$1 = '__function_toggle_menu__'; + var FunctionOpenMenu$1 = '__function_open_menu__'; + var FunctionCloseMenu$1 = '__function_close_menu__'; + var FunctionSetHighlightedIndex$1 = '__function_set_highlighted_index__'; + var FunctionSelectItem$1 = '__function_select_item__'; + var FunctionSetInputValue$1 = '__function_set_input_value__'; + var FunctionReset$2 = '__function_reset__'; + + var stateChangeTypes$2 = /*#__PURE__*/Object.freeze({ + __proto__: null, + MenuKeyDownArrowDown: MenuKeyDownArrowDown, + MenuKeyDownArrowUp: MenuKeyDownArrowUp, + MenuKeyDownEscape: MenuKeyDownEscape, + MenuKeyDownHome: MenuKeyDownHome, + MenuKeyDownEnd: MenuKeyDownEnd, + MenuKeyDownEnter: MenuKeyDownEnter, + MenuKeyDownSpaceButton: MenuKeyDownSpaceButton, + MenuKeyDownCharacter: MenuKeyDownCharacter, + MenuBlur: MenuBlur, + MenuMouseLeave: MenuMouseLeave$1, + ItemMouseMove: ItemMouseMove$1, + ItemClick: ItemClick$1, + ToggleButtonClick: ToggleButtonClick$1, + ToggleButtonKeyDownArrowDown: ToggleButtonKeyDownArrowDown, + ToggleButtonKeyDownArrowUp: ToggleButtonKeyDownArrowUp, + ToggleButtonKeyDownCharacter: ToggleButtonKeyDownCharacter, + FunctionToggleMenu: FunctionToggleMenu$1, + FunctionOpenMenu: FunctionOpenMenu$1, + FunctionCloseMenu: FunctionCloseMenu$1, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex$1, + FunctionSelectItem: FunctionSelectItem$1, + FunctionSetInputValue: FunctionSetInputValue$1, + FunctionReset: FunctionReset$2 + }); + + /* eslint-disable complexity */ + function downshiftSelectReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove$1: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick$1: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index] + }; + break; + case ToggleButtonKeyDownCharacter: + { + var lowercasedKey = action.key; + var inputValue = "" + state.inputValue + lowercasedKey; + var itemIndex = getItemIndexByCharacterKey(inputValue, state.selectedItem ? props.items.indexOf(state.selectedItem) : -1, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends({ + inputValue: inputValue + }, itemIndex >= 0 && { + selectedItem: props.items[itemIndex] + }); + } + break; + case ToggleButtonKeyDownArrowDown: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case ToggleButtonKeyDownArrowUp: + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + break; + case MenuKeyDownEnter: + case MenuKeyDownSpaceButton: + changes = _extends({ + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex') + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex] + }); + break; + case MenuKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case MenuKeyDownEscape: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuBlur: + changes = { + isOpen: false, + highlightedIndex: -1 + }; + break; + case MenuKeyDownCharacter: + { + var _lowercasedKey = action.key; + var _inputValue = "" + state.inputValue + _lowercasedKey; + var highlightedIndex = getItemIndexByCharacterKey(_inputValue, state.highlightedIndex, props.items, props.itemToString, action.getItemNodeFromIndex); + changes = _extends({ + inputValue: _inputValue + }, highlightedIndex >= 0 && { + highlightedIndex: highlightedIndex + }); + } + break; + case MenuKeyDownArrowDown: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuKeyDownArrowUp: + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + break; + case MenuMouseLeave$1: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick$1: + case FunctionToggleMenu$1: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu$1: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu$1: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex$1: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem$1: + changes = { + selectedItem: action.selectedItem + }; + break; + case FunctionSetInputValue$1: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$2: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends({}, state, changes); + } + /* eslint-enable complexity */ + + var _excluded$3 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"], + _excluded2$2 = ["onClick", "onKeyDown", "refKey", "ref"], + _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "refKey", "ref"]; + var validatePropTypes$1 = getPropTypesValidator(useSelect, propTypes$1); + useSelect.stateChangeTypes = stateChangeTypes$2; + function useSelect(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + + validatePropTypes$1(userProps); + + // Props defaults and destructuring. + var props = _extends({}, defaultProps$2, userProps); + var items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + itemToString = props.itemToString, + getA11ySelectionMessage = props.getA11ySelectionMessage, + getA11yStatusMessage = props.getA11yStatusMessage; + // Initial state depending on controlled props. + var initialState = getInitialState$2(props); + var _useControlledReducer = useControlledReducer$1(downshiftSelectReducer, initialState, props, isDropdownsStateEqual), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element efs. + var toggleButtonRef = react.useRef(null); + var menuRef = react.useRef(null); + var itemRefs = react.useRef(); + itemRefs.current = {}; + // used not to scroll when highlight by mouse. + var shouldScrollRef = react.useRef(true); + // used not to trigger menu blur action in some scenarios. + var shouldBlurRef = react.useRef(true); + // used to keep the inputValue clearTimeout object between renders. + var clearTimeoutRef = react.useRef(null); + // prevent id re-generation between renders. + var elementIdsRef = react.useRef(getElementIds$1(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = react.useRef(); + var isInitialMountRef = react.useRef(true); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + + // Some utils. + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Sets cleanup for the keysSoFar after 500ms. + react.useEffect(function () { + // init the clean function here as we need access to dispatch. + if (isInitialMountRef.current) { + clearTimeoutRef.current = debounce(function (outerDispatch) { + outerDispatch({ + type: FunctionSetInputValue$1, + inputValue: '' + }); + }, 500); + } + if (!inputValue) { + return; + } + clearTimeoutRef.current(dispatch); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inputValue]); + /* Controls the focus on the menu or the toggle button. */ + react.useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus menu on open. + if (isOpen) { + // istanbul ignore else + if (menuRef.current) { + menuRef.current.focus(); + } + return; + } + // Focus toggleButton on close, but not if it was closed with (Shift+)Tab. + if (environment.document.activeElement === menuRef.current) { + // istanbul ignore else + if (toggleButtonRef.current) { + shouldBlurRef.current = false; + toggleButtonRef.current.focus(); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + // Scroll on highlighted item if change comes from keyboard. + react.useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: MenuBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var toggleButtonKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: ToggleButtonKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + } + }; + }, [dispatch]); + var menuKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowDown, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownArrowUp, + getItemNodeFromIndex: getItemNodeFromIndex, + shiftKey: event.shiftKey + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: MenuKeyDownEscape + }); + }, + Enter: function Enter(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownEnter + }); + }, + ' ': function _(event) { + event.preventDefault(); + dispatch({ + type: MenuKeyDownSpaceButton + }); + } + }; + }, [dispatch]); + + // Action functions. + var toggleMenu = react.useCallback(function () { + dispatch({ + type: FunctionToggleMenu$1 + }); + }, [dispatch]); + var closeMenu = react.useCallback(function () { + dispatch({ + type: FunctionCloseMenu$1 + }); + }, [dispatch]); + var openMenu = react.useCallback(function () { + dispatch({ + type: FunctionOpenMenu$1 + }); + }, [dispatch]); + var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex$1, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = react.useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem$1, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset$2 + }); + }, [dispatch]); + var setInputValue = react.useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue$1, + inputValue: newInputValue + }); + }, [dispatch]); + // Getter functions. + var getLabelProps = react.useCallback(function (labelProps) { + return _extends({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.toggleButtonId + }, labelProps); + }, []); + var getMenuProps = react.useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + onKeyDown = _ref.onKeyDown, + onBlur = _ref.onBlur, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$3); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + var latestState = latest.current.state; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.tabIndex = -1, _extends2), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + onMouseLeave: callAllEventHandlers(onMouseLeave, function menuHandleMouseLeave() { + dispatch({ + type: MenuMouseLeave$1 + }); + }), + onKeyDown: callAllEventHandlers(onKeyDown, function menuHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && menuKeyDownHandlers[key]) { + menuKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: MenuKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }), + onBlur: callAllEventHandlers(onBlur, function menuHandleBlur() { + // if the blur was a result of selection, we don't trigger this action. + if (shouldBlurRef.current === false) { + shouldBlurRef.current = true; + return; + } + var shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown; + /* istanbul ignore else */ + if (shouldBlur) { + dispatch({ + type: MenuBlur + }); + } + }) + }, rest); + }, [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getToggleButtonProps = react.useCallback(function (_temp3, _temp4) { + var _extends3; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$2); + var _ref4 = _temp4 === void 0 ? {} : _temp4, + _ref4$suppressRefErro = _ref4.suppressRefError, + suppressRefError = _ref4$suppressRefErro === void 0 ? false : _ref4$suppressRefErro; + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick$1 + }); + }; + var toggleButtonHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && toggleButtonKeyDownHandlers[key]) { + toggleButtonKeyDownHandlers[key](event); + } else if (isAcceptedCharacterKey(key)) { + dispatch({ + type: ToggleButtonKeyDownCharacter, + key: key, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + }; + var toggleProps = _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends3.id = elementIdsRef.current.toggleButtonId, _extends3['aria-haspopup'] = 'listbox', _extends3['aria-expanded'] = latest.current.state.isOpen, _extends3['aria-labelledby'] = elementIdsRef.current.labelId + " " + elementIdsRef.current.toggleButtonId, _extends3), rest); + if (!rest.disabled) { + toggleProps.onClick = callAllEventHandlers(onClick, toggleButtonHandleClick); + toggleProps.onKeyDown = callAllEventHandlers(onKeyDown, toggleButtonHandleKeyDown); + } + setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef); + return toggleProps; + }, [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo]); + var getItemProps = react.useCallback(function (_temp5) { + var _extends4; + var _ref5 = _temp5 === void 0 ? {} : _temp5, + item = _ref5.item, + index = _ref5.index, + onMouseMove = _ref5.onMouseMove, + onClick = _ref5.onClick, + _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose(_ref5, _excluded3$1); + var _latest$current = latest.current, + latestState = _latest$current.state, + latestProps = _latest$current.props; + var itemHandleMouseMove = function () { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove$1, + index: index + }); + }; + var itemHandleClick = function () { + dispatch({ + type: ItemClick$1, + index: index + }); + }; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var itemProps = _extends((_extends4 = { + role: 'option', + 'aria-selected': "" + (itemIndex === latestState.highlightedIndex), + id: elementIdsRef.current.getItemId(itemIndex) + }, _extends4[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends4), rest); + if (!rest.disabled) { + itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove); + itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick); + } + return itemProps; + }, [dispatch, latest]); + return { + // prop getters. + getToggleButtonProps: getToggleButtonProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getItemProps: getItemProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + selectItem: selectItem, + reset: reset, + setInputValue: setInputValue, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; + } + + var InputKeyDownArrowDown = '__input_keydown_arrow_down__'; + var InputKeyDownArrowUp = '__input_keydown_arrow_up__'; + var InputKeyDownEscape = '__input_keydown_escape__'; + var InputKeyDownHome = '__input_keydown_home__'; + var InputKeyDownEnd = '__input_keydown_end__'; + var InputKeyDownEnter = '__input_keydown_enter__'; + var InputChange = '__input_change__'; + var InputBlur = '__input_blur__'; + var MenuMouseLeave = '__menu_mouse_leave__'; + var ItemMouseMove = '__item_mouse_move__'; + var ItemClick = '__item_click__'; + var ToggleButtonClick = '__togglebutton_click__'; + var FunctionToggleMenu = '__function_toggle_menu__'; + var FunctionOpenMenu = '__function_open_menu__'; + var FunctionCloseMenu = '__function_close_menu__'; + var FunctionSetHighlightedIndex = '__function_set_highlighted_index__'; + var FunctionSelectItem = '__function_select_item__'; + var FunctionSetInputValue = '__function_set_input_value__'; + var FunctionReset$1 = '__function_reset__'; + var ControlledPropUpdatedSelectedItem = '__controlled_prop_updated_selected_item__'; + + var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + InputKeyDownArrowDown: InputKeyDownArrowDown, + InputKeyDownArrowUp: InputKeyDownArrowUp, + InputKeyDownEscape: InputKeyDownEscape, + InputKeyDownHome: InputKeyDownHome, + InputKeyDownEnd: InputKeyDownEnd, + InputKeyDownEnter: InputKeyDownEnter, + InputChange: InputChange, + InputBlur: InputBlur, + MenuMouseLeave: MenuMouseLeave, + ItemMouseMove: ItemMouseMove, + ItemClick: ItemClick, + ToggleButtonClick: ToggleButtonClick, + FunctionToggleMenu: FunctionToggleMenu, + FunctionOpenMenu: FunctionOpenMenu, + FunctionCloseMenu: FunctionCloseMenu, + FunctionSetHighlightedIndex: FunctionSetHighlightedIndex, + FunctionSelectItem: FunctionSelectItem, + FunctionSetInputValue: FunctionSetInputValue, + FunctionReset: FunctionReset$1, + ControlledPropUpdatedSelectedItem: ControlledPropUpdatedSelectedItem + }); + + var _excluded$2 = ["id", "inputId"]; + function getElementIds(_ref) { + var id = _ref.id, + inputId = _ref.inputId, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$2); + var uniqueId = id === undefined ? "downshift-" + generateId() : id; + return _extends({ + inputId: inputId || uniqueId + "-input" + }, getElementIds$1(_extends({ + id: id + }, rest))); + } + function getInitialState$1(props) { + var initialState = getInitialState$2(props); + var selectedItem = initialState.selectedItem; + var inputValue = initialState.inputValue; + if (inputValue === '' && selectedItem && props.defaultInputValue === undefined && props.initialInputValue === undefined && props.inputValue === undefined) { + inputValue = props.itemToString(selectedItem); + } + return _extends({}, initialState, { + inputValue: inputValue + }); + } + var propTypes = { + items: PropTypes.array.isRequired, + itemToString: PropTypes.func, + getA11yStatusMessage: PropTypes.func, + getA11ySelectionMessage: PropTypes.func, + circularNavigation: PropTypes.bool, + highlightedIndex: PropTypes.number, + defaultHighlightedIndex: PropTypes.number, + initialHighlightedIndex: PropTypes.number, + isOpen: PropTypes.bool, + defaultIsOpen: PropTypes.bool, + initialIsOpen: PropTypes.bool, + selectedItem: PropTypes.any, + initialSelectedItem: PropTypes.any, + defaultSelectedItem: PropTypes.any, + inputValue: PropTypes.string, + defaultInputValue: PropTypes.string, + initialInputValue: PropTypes.string, + id: PropTypes.string, + labelId: PropTypes.string, + menuId: PropTypes.string, + getItemId: PropTypes.func, + inputId: PropTypes.string, + toggleButtonId: PropTypes.string, + stateReducer: PropTypes.func, + onSelectedItemChange: PropTypes.func, + onHighlightedIndexChange: PropTypes.func, + onStateChange: PropTypes.func, + onIsOpenChange: PropTypes.func, + onInputValueChange: PropTypes.func, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }) + }; + + /** + * The useCombobox version of useControlledReducer, which also + * checks if the controlled prop selectedItem changed between + * renders. If so, it will also update inputValue with its + * string equivalent. It uses the common useEnhancedReducer to + * compute the rest of the state. + * + * @param {Function} reducer Reducer function from downshift. + * @param {Object} initialState Initial state of the hook. + * @param {Object} props The hook props. + * @returns {Array} An array with the state and an action dispatcher. + */ + function useControlledReducer(reducer, initialState, props) { + var previousSelectedItemRef = react.useRef(); + var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props), + state = _useEnhancedReducer[0], + dispatch = _useEnhancedReducer[1]; + + // ToDo: if needed, make same approach as selectedItemChanged from Downshift. + if (isControlledProp(props, 'selectedItem')) { + if (previousSelectedItemRef.current !== props.selectedItem) { + dispatch({ + type: ControlledPropUpdatedSelectedItem, + inputValue: props.itemToString(props.selectedItem) + }); + } + previousSelectedItemRef.current = state.selectedItem === previousSelectedItemRef.current ? props.selectedItem : state.selectedItem; + } + return [getState(state, props), dispatch]; + } + var defaultProps$1 = _extends({}, defaultProps$3, { + getA11yStatusMessage: getA11yStatusMessage$1, + circularNavigation: true + }); + + /* eslint-disable complexity */ + function downshiftUseComboboxReducer(state, action) { + var type = action.type, + props = action.props, + shiftKey = action.shiftKey; + var changes; + switch (type) { + case ItemMouseMove: + changes = { + highlightedIndex: action.index + }; + break; + case ItemClick: + changes = { + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + selectedItem: props.items[action.index], + inputValue: props.itemToString(props.items[action.index]) + }; + break; + case InputKeyDownArrowDown: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? 5 : 1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownArrowUp: + if (state.isOpen) { + changes = { + highlightedIndex: getNextWrappingIndex(shiftKey ? -5 : -1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, props.circularNavigation) + }; + } else { + changes = { + highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex), + isOpen: true + }; + } + break; + case InputKeyDownEnter: + changes = _extends({}, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + isOpen: getDefaultValue$1(props, 'isOpen'), + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: props.itemToString(props.items[state.highlightedIndex]) + }); + break; + case InputKeyDownEscape: + changes = { + isOpen: false, + selectedItem: null, + highlightedIndex: -1, + inputValue: '' + }; + break; + case InputKeyDownHome: + changes = { + highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputKeyDownEnd: + changes = { + highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false) + }; + break; + case InputBlur: + changes = _extends({ + isOpen: false + }, state.highlightedIndex >= 0 && { + selectedItem: props.items[state.highlightedIndex], + inputValue: props.itemToString(props.items[state.highlightedIndex]), + highlightedIndex: -1 + }); + break; + case InputChange: + changes = { + isOpen: true, + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + inputValue: action.inputValue + }; + break; + case MenuMouseLeave: + changes = { + highlightedIndex: -1 + }; + break; + case ToggleButtonClick: + case FunctionToggleMenu: + changes = { + isOpen: !state.isOpen, + highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionOpenMenu: + changes = { + isOpen: true, + highlightedIndex: getHighlightedIndexOnOpen(props, state, 0) + }; + break; + case FunctionCloseMenu: + changes = { + isOpen: false + }; + break; + case FunctionSetHighlightedIndex: + changes = { + highlightedIndex: action.highlightedIndex + }; + break; + case FunctionSelectItem: + changes = { + selectedItem: action.selectedItem, + inputValue: props.itemToString(action.selectedItem) + }; + break; + case ControlledPropUpdatedSelectedItem: + case FunctionSetInputValue: + changes = { + inputValue: action.inputValue + }; + break; + case FunctionReset$1: + changes = { + highlightedIndex: getDefaultValue$1(props, 'highlightedIndex'), + isOpen: getDefaultValue$1(props, 'isOpen'), + selectedItem: getDefaultValue$1(props, 'selectedItem'), + inputValue: getDefaultValue$1(props, 'inputValue') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends({}, state, changes); + } + /* eslint-enable complexity */ + + var _excluded$1 = ["onMouseLeave", "refKey", "ref"], + _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onClick", "onPress"], + _excluded3 = ["onClick", "onPress", "refKey", "ref"], + _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "refKey", "ref"], + _excluded5 = ["refKey", "ref"]; + var validatePropTypes = getPropTypesValidator(useCombobox, propTypes); + useCombobox.stateChangeTypes = stateChangeTypes$1; + function useCombobox(userProps) { + if (userProps === void 0) { + userProps = {}; + } + /* istanbul ignore else */ + + validatePropTypes(userProps); + + // Props defaults and destructuring. + var props = _extends({}, defaultProps$1, userProps); + var initialIsOpen = props.initialIsOpen, + defaultIsOpen = props.defaultIsOpen, + items = props.items, + scrollIntoView = props.scrollIntoView, + environment = props.environment, + getA11yStatusMessage = props.getA11yStatusMessage, + getA11ySelectionMessage = props.getA11ySelectionMessage, + itemToString = props.itemToString; + // Initial state depending on controlled props. + var initialState = getInitialState$1(props); + var _useControlledReducer = useControlledReducer(downshiftUseComboboxReducer, initialState, props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var isOpen = state.isOpen, + highlightedIndex = state.highlightedIndex, + selectedItem = state.selectedItem, + inputValue = state.inputValue; + + // Element refs. + var menuRef = react.useRef(null); + var itemRefs = react.useRef(); + var inputRef = react.useRef(null); + var toggleButtonRef = react.useRef(null); + var comboboxRef = react.useRef(null); + itemRefs.current = {}; + // used not to scroll on highlight by mouse. + var shouldScrollRef = react.useRef(true); + var isInitialMountRef = react.useRef(true); + // prevent id re-generation between renders. + var elementIdsRef = react.useRef(getElementIds(props)); + // used to keep track of how many items we had on previous cycle. + var previousResultCountRef = react.useRef(); + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + // used to store information about getter props being called on render. + // utility callback to get item element. + var latest = useLatestRef({ + state: state, + props: props + }); + var getItemNodeFromIndex = function (index) { + return itemRefs.current[elementIdsRef.current.getItemId(index)]; + }; + + // Effects. + // Sets a11y status message on changes in state. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11yStatusMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen, highlightedIndex, inputValue, items]); + // Sets a11y status message on changes in selectedItem. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + var previousResultCount = previousResultCountRef.current; + updateA11yStatus(function () { + return getA11ySelectionMessage({ + isOpen: isOpen, + highlightedIndex: highlightedIndex, + selectedItem: selectedItem, + inputValue: inputValue, + highlightedItem: items[highlightedIndex], + resultCount: items.length, + itemToString: itemToString, + previousResultCount: previousResultCount + }); + }, environment.document); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItem]); + // Scroll on highlighted item if change comes from keyboard. + react.useEffect(function () { + if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) { + return; + } + if (shouldScrollRef.current === false) { + shouldScrollRef.current = true; + } else { + scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [highlightedIndex]); + // Controls the focus on the menu or the toggle button. + react.useEffect(function () { + // Don't focus menu on first render. + if (isInitialMountRef.current) { + // Unless it was initialised as open. + if (initialIsOpen || defaultIsOpen || isOpen) { + if (inputRef.current) { + inputRef.current.focus(); + } + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isOpen]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + previousResultCountRef.current = items.length; + }); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + // Add mouse/touch events to document. + var mouseAndTouchTrackersRef = useMouseAndTouchTracker(isOpen, [comboboxRef, menuRef, toggleButtonRef], environment, function () { + dispatch({ + type: InputBlur + }); + }); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getComboboxProps', 'getMenuProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + /* Event handler functions */ + var inputKeyDownHandlers = react.useMemo(function () { + return { + ArrowDown: function ArrowDown(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowDown, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + ArrowUp: function ArrowUp(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownArrowUp, + shiftKey: event.shiftKey, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Home: function Home(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownHome, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + End: function End(event) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnd, + getItemNodeFromIndex: getItemNodeFromIndex + }); + }, + Escape: function Escape() { + dispatch({ + type: InputKeyDownEscape + }); + }, + Enter: function Enter(event) { + // if IME composing, wait for next Enter keydown event. + if (event.which === 229) { + return; + } + var latestState = latest.current.state; + if (latestState.isOpen && latestState.highlightedIndex > -1) { + event.preventDefault(); + dispatch({ + type: InputKeyDownEnter, + getItemNodeFromIndex: getItemNodeFromIndex + }); + } + } + }; + }, [dispatch, latest]); + + // Getter props. + var getLabelProps = react.useCallback(function (labelProps) { + return _extends({ + id: elementIdsRef.current.labelId, + htmlFor: elementIdsRef.current.inputId + }, labelProps); + }, []); + var getMenuProps = react.useCallback(function (_temp, _temp2) { + var _extends2; + var _ref = _temp === void 0 ? {} : _temp, + onMouseLeave = _ref.onMouseLeave, + _ref$refKey = _ref.refKey, + refKey = _ref$refKey === void 0 ? 'ref' : _ref$refKey, + ref = _ref.ref, + rest = _objectWithoutPropertiesLoose(_ref, _excluded$1); + var _ref2 = _temp2 === void 0 ? {} : _temp2, + _ref2$suppressRefErro = _ref2.suppressRefError, + suppressRefError = _ref2$suppressRefErro === void 0 ? false : _ref2$suppressRefErro; + setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef); + return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (menuNode) { + menuRef.current = menuNode; + }), _extends2.id = elementIdsRef.current.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = elementIdsRef.current.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, function () { + dispatch({ + type: MenuMouseLeave + }); + }), _extends2), rest); + }, [dispatch, setGetterPropCallInfo]); + var getItemProps = react.useCallback(function (_temp3) { + var _extends3, _ref4; + var _ref3 = _temp3 === void 0 ? {} : _temp3, + item = _ref3.item, + index = _ref3.index, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onMouseMove = _ref3.onMouseMove, + onClick = _ref3.onClick; + _ref3.onPress; + var rest = _objectWithoutPropertiesLoose(_ref3, _excluded2$1); + var _latest$current = latest.current, + latestProps = _latest$current.props, + latestState = _latest$current.state; + var itemIndex = getItemIndex(index, item, latestProps.items); + if (itemIndex < 0) { + throw new Error('Pass either item or item index in getItemProps!'); + } + var onSelectKey = 'onClick'; + var customClickHandler = onClick; + return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (itemNode) { + if (itemNode) { + itemRefs.current[elementIdsRef.current.getItemId(itemIndex)] = itemNode; + } + }), _extends3.role = 'option', _extends3['aria-selected'] = "" + (itemIndex === latestState.highlightedIndex), _extends3.id = elementIdsRef.current.getItemId(itemIndex), _extends3), !rest.disabled && (_ref4 = { + onMouseMove: callAllEventHandlers(onMouseMove, function itemHandleMouseMove() { + if (index === latestState.highlightedIndex) { + return; + } + shouldScrollRef.current = false; + dispatch({ + type: ItemMouseMove, + index: index + }); + }) + }, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, function itemHandleClick() { + dispatch({ + type: ItemClick, + index: index + }); + }), _ref4), rest); + }, [dispatch, latest]); + var getToggleButtonProps = react.useCallback(function (_temp4) { + var _extends4; + var _ref5 = _temp4 === void 0 ? {} : _temp4, + onClick = _ref5.onClick; + _ref5.onPress; + var _ref5$refKey = _ref5.refKey, + refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey, + ref = _ref5.ref, + rest = _objectWithoutPropertiesLoose(_ref5, _excluded3); + var toggleButtonHandleClick = function () { + dispatch({ + type: ToggleButtonClick + }); + if (!latest.current.state.isOpen && inputRef.current) { + inputRef.current.focus(); + } + }; + return _extends((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (toggleButtonNode) { + toggleButtonRef.current = toggleButtonNode; + }), _extends4.id = elementIdsRef.current.toggleButtonId, _extends4.tabIndex = -1, _extends4), !rest.disabled && _extends({}, { + onClick: callAllEventHandlers(onClick, toggleButtonHandleClick) + }), rest); + }, [dispatch, latest]); + var getInputProps = react.useCallback(function (_temp5, _temp6) { + var _extends5; + var _ref6 = _temp5 === void 0 ? {} : _temp5, + onKeyDown = _ref6.onKeyDown, + onChange = _ref6.onChange, + onInput = _ref6.onInput, + onBlur = _ref6.onBlur; + _ref6.onChangeText; + var _ref6$refKey = _ref6.refKey, + refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey, + ref = _ref6.ref, + rest = _objectWithoutPropertiesLoose(_ref6, _excluded4); + var _ref7 = _temp6 === void 0 ? {} : _temp6, + _ref7$suppressRefErro = _ref7.suppressRefError, + suppressRefError = _ref7$suppressRefErro === void 0 ? false : _ref7$suppressRefErro; + setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef); + var latestState = latest.current.state; + var inputHandleKeyDown = function (event) { + var key = normalizeArrowKey(event); + if (key && inputKeyDownHandlers[key]) { + inputKeyDownHandlers[key](event); + } + }; + var inputHandleChange = function (event) { + dispatch({ + type: InputChange, + inputValue: event.target.value + }); + }; + var inputHandleBlur = function () { + /* istanbul ignore else */ + if (!mouseAndTouchTrackersRef.current.isMouseDown) { + dispatch({ + type: InputBlur + }); + } + }; + + /* istanbul ignore next (preact) */ + var onChangeKey = 'onChange'; + var eventHandlers = {}; + if (!rest.disabled) { + var _eventHandlers; + eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers); + } + + /* istanbul ignore if (react-native) */ + + return _extends((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) { + inputRef.current = inputNode; + }), _extends5.id = elementIdsRef.current.inputId, _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIdsRef.current.menuId, _extends5), latestState.isOpen && latestState.highlightedIndex > -1 && { + 'aria-activedescendant': elementIdsRef.current.getItemId(latestState.highlightedIndex) + }, { + 'aria-labelledby': elementIdsRef.current.labelId, + // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion + // revert back since autocomplete="nope" is ignored on latest Chrome and Opera + autoComplete: 'off', + value: latestState.inputValue + }, eventHandlers, rest); + }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo]); + var getComboboxProps = react.useCallback(function (_temp7, _temp8) { + var _extends6; + var _ref8 = _temp7 === void 0 ? {} : _temp7, + _ref8$refKey = _ref8.refKey, + refKey = _ref8$refKey === void 0 ? 'ref' : _ref8$refKey, + ref = _ref8.ref, + rest = _objectWithoutPropertiesLoose(_ref8, _excluded5); + var _ref9 = _temp8 === void 0 ? {} : _temp8, + _ref9$suppressRefErro = _ref9.suppressRefError, + suppressRefError = _ref9$suppressRefErro === void 0 ? false : _ref9$suppressRefErro; + setGetterPropCallInfo('getComboboxProps', suppressRefError, refKey, comboboxRef); + return _extends((_extends6 = {}, _extends6[refKey] = handleRefs(ref, function (comboboxNode) { + comboboxRef.current = comboboxNode; + }), _extends6.role = 'combobox', _extends6['aria-haspopup'] = 'listbox', _extends6['aria-owns'] = elementIdsRef.current.menuId, _extends6['aria-expanded'] = latest.current.state.isOpen, _extends6), rest); + }, [latest, setGetterPropCallInfo]); + + // returns + var toggleMenu = react.useCallback(function () { + dispatch({ + type: FunctionToggleMenu + }); + }, [dispatch]); + var closeMenu = react.useCallback(function () { + dispatch({ + type: FunctionCloseMenu + }); + }, [dispatch]); + var openMenu = react.useCallback(function () { + dispatch({ + type: FunctionOpenMenu + }); + }, [dispatch]); + var setHighlightedIndex = react.useCallback(function (newHighlightedIndex) { + dispatch({ + type: FunctionSetHighlightedIndex, + highlightedIndex: newHighlightedIndex + }); + }, [dispatch]); + var selectItem = react.useCallback(function (newSelectedItem) { + dispatch({ + type: FunctionSelectItem, + selectedItem: newSelectedItem + }); + }, [dispatch]); + var setInputValue = react.useCallback(function (newInputValue) { + dispatch({ + type: FunctionSetInputValue, + inputValue: newInputValue + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset$1 + }); + }, [dispatch]); + return { + // prop getters. + getItemProps: getItemProps, + getLabelProps: getLabelProps, + getMenuProps: getMenuProps, + getInputProps: getInputProps, + getComboboxProps: getComboboxProps, + getToggleButtonProps: getToggleButtonProps, + // actions. + toggleMenu: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + setHighlightedIndex: setHighlightedIndex, + setInputValue: setInputValue, + selectItem: selectItem, + reset: reset, + // state. + highlightedIndex: highlightedIndex, + isOpen: isOpen, + selectedItem: selectedItem, + inputValue: inputValue + }; + } + + var defaultStateValues = { + activeIndex: -1, + selectedItems: [] + }; + + /** + * Returns the initial value for a state key in the following order: + * 1. controlled prop, 2. initial prop, 3. default prop, 4. default + * value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ + function getInitialValue(props, propKey) { + return getInitialValue$1(props, propKey, defaultStateValues); + } + + /** + * Returns the default value for a state key in the following order: + * 1. controlled prop, 2. default prop, 3. default value from Downshift. + * + * @param {Object} props Props passed to the hook. + * @param {string} propKey Props key to generate the value for. + * @returns {any} The initial value for that prop. + */ + function getDefaultValue(props, propKey) { + return getDefaultValue$1(props, propKey, defaultStateValues); + } + + /** + * Gets the initial state based on the provided props. It uses initial, default + * and controlled props related to state in order to compute the initial value. + * + * @param {Object} props Props passed to the hook. + * @returns {Object} The initial state. + */ + function getInitialState(props) { + var activeIndex = getInitialValue(props, 'activeIndex'); + var selectedItems = getInitialValue(props, 'selectedItems'); + return { + activeIndex: activeIndex, + selectedItems: selectedItems + }; + } + + /** + * Returns true if dropdown keydown operation is permitted. Should not be + * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on + * input element with text content that is either highlighted or selection + * cursor is not at the starting position. + * + * @param {KeyboardEvent} event The event from keydown. + * @returns {boolean} Whether the operation is allowed. + */ + function isKeyDownOperationPermitted(event) { + if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) { + return false; + } + var element = event.target; + if (element instanceof HTMLInputElement && + // if element is a text input + element.value !== '' && ( + // and we have text in it + // and cursor is either not at the start or is currently highlighting text. + element.selectionStart !== 0 || element.selectionEnd !== 0)) { + return false; + } + return true; + } + + /** + * Returns a message to be added to aria-live region when item is removed. + * + * @param {Object} selectionParameters Parameters required to build the message. + * @returns {string} The a11y message. + */ + function getA11yRemovalMessage(selectionParameters) { + var removedSelectedItem = selectionParameters.removedSelectedItem, + itemToStringLocal = selectionParameters.itemToString; + return itemToStringLocal(removedSelectedItem) + " has been removed."; + } + ({ + selectedItems: PropTypes.array, + initialSelectedItems: PropTypes.array, + defaultSelectedItems: PropTypes.array, + itemToString: PropTypes.func, + getA11yRemovalMessage: PropTypes.func, + stateReducer: PropTypes.func, + activeIndex: PropTypes.number, + initialActiveIndex: PropTypes.number, + defaultActiveIndex: PropTypes.number, + onActiveIndexChange: PropTypes.func, + onSelectedItemsChange: PropTypes.func, + keyNavigationNext: PropTypes.string, + keyNavigationPrevious: PropTypes.string, + environment: PropTypes.shape({ + addEventListener: PropTypes.func, + removeEventListener: PropTypes.func, + document: PropTypes.shape({ + getElementById: PropTypes.func, + activeElement: PropTypes.any, + body: PropTypes.any + }) + }) + }); + var defaultProps = { + itemToString: defaultProps$3.itemToString, + stateReducer: defaultProps$3.stateReducer, + environment: defaultProps$3.environment, + getA11yRemovalMessage: getA11yRemovalMessage, + keyNavigationNext: 'ArrowRight', + keyNavigationPrevious: 'ArrowLeft' + }; + + var SelectedItemClick = '__selected_item_click__'; + var SelectedItemKeyDownDelete = '__selected_item_keydown_delete__'; + var SelectedItemKeyDownBackspace = '__selected_item_keydown_backspace__'; + var SelectedItemKeyDownNavigationNext = '__selected_item_keydown_navigation_next__'; + var SelectedItemKeyDownNavigationPrevious = '__selected_item_keydown_navigation_previous__'; + var DropdownKeyDownNavigationPrevious = '__dropdown_keydown_navigation_previous__'; + var DropdownKeyDownBackspace = '__dropdown_keydown_backspace__'; + var DropdownClick = '__dropdown_click__'; + var FunctionAddSelectedItem = '__function_add_selected_item__'; + var FunctionRemoveSelectedItem = '__function_remove_selected_item__'; + var FunctionSetSelectedItems = '__function_set_selected_items__'; + var FunctionSetActiveIndex = '__function_set_active_index__'; + var FunctionReset = '__function_reset__'; + + var stateChangeTypes = /*#__PURE__*/Object.freeze({ + __proto__: null, + SelectedItemClick: SelectedItemClick, + SelectedItemKeyDownDelete: SelectedItemKeyDownDelete, + SelectedItemKeyDownBackspace: SelectedItemKeyDownBackspace, + SelectedItemKeyDownNavigationNext: SelectedItemKeyDownNavigationNext, + SelectedItemKeyDownNavigationPrevious: SelectedItemKeyDownNavigationPrevious, + DropdownKeyDownNavigationPrevious: DropdownKeyDownNavigationPrevious, + DropdownKeyDownBackspace: DropdownKeyDownBackspace, + DropdownClick: DropdownClick, + FunctionAddSelectedItem: FunctionAddSelectedItem, + FunctionRemoveSelectedItem: FunctionRemoveSelectedItem, + FunctionSetSelectedItems: FunctionSetSelectedItems, + FunctionSetActiveIndex: FunctionSetActiveIndex, + FunctionReset: FunctionReset + }); + + /* eslint-disable complexity */ + function downshiftMultipleSelectionReducer(state, action) { + var type = action.type, + index = action.index, + props = action.props, + selectedItem = action.selectedItem; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + var changes; + switch (type) { + case SelectedItemClick: + changes = { + activeIndex: index + }; + break; + case SelectedItemKeyDownNavigationPrevious: + changes = { + activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1 + }; + break; + case SelectedItemKeyDownNavigationNext: + changes = { + activeIndex: activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1 + }; + break; + case SelectedItemKeyDownBackspace: + case SelectedItemKeyDownDelete: + { + var newActiveIndex = activeIndex; + if (selectedItems.length === 1) { + newActiveIndex = -1; + } else if (activeIndex === selectedItems.length - 1) { + newActiveIndex = selectedItems.length - 2; + } + changes = _extends({ + selectedItems: [].concat(selectedItems.slice(0, activeIndex), selectedItems.slice(activeIndex + 1)) + }, { + activeIndex: newActiveIndex + }); + break; + } + case DropdownKeyDownNavigationPrevious: + changes = { + activeIndex: selectedItems.length - 1 + }; + break; + case DropdownKeyDownBackspace: + changes = { + selectedItems: selectedItems.slice(0, selectedItems.length - 1) + }; + break; + case FunctionAddSelectedItem: + changes = { + selectedItems: [].concat(selectedItems, [selectedItem]) + }; + break; + case DropdownClick: + changes = { + activeIndex: -1 + }; + break; + case FunctionRemoveSelectedItem: + { + var _newActiveIndex = activeIndex; + var selectedItemIndex = selectedItems.indexOf(selectedItem); + if (selectedItems.length === 1) { + _newActiveIndex = -1; + } else if (selectedItemIndex === selectedItems.length - 1) { + _newActiveIndex = selectedItems.length - 2; + } + changes = _extends({ + selectedItems: [].concat(selectedItems.slice(0, selectedItemIndex), selectedItems.slice(selectedItemIndex + 1)) + }, { + activeIndex: _newActiveIndex + }); + break; + } + case FunctionSetSelectedItems: + { + var newSelectedItems = action.selectedItems; + changes = { + selectedItems: newSelectedItems + }; + break; + } + case FunctionSetActiveIndex: + { + var _newActiveIndex2 = action.activeIndex; + changes = { + activeIndex: _newActiveIndex2 + }; + break; + } + case FunctionReset: + changes = { + activeIndex: getDefaultValue(props, 'activeIndex'), + selectedItems: getDefaultValue(props, 'selectedItems') + }; + break; + default: + throw new Error('Reducer called without proper action type.'); + } + return _extends({}, state, changes); + } + + var _excluded = ["refKey", "ref", "onClick", "onKeyDown", "selectedItem", "index"], + _excluded2 = ["refKey", "ref", "onKeyDown", "onClick", "preventKeyAction"]; + useMultipleSelection.stateChangeTypes = stateChangeTypes; + function useMultipleSelection(userProps) { + if (userProps === void 0) { + userProps = {}; + } + // Props defaults and destructuring. + var props = _extends({}, defaultProps, userProps); + var getA11yRemovalMessage = props.getA11yRemovalMessage, + itemToString = props.itemToString, + environment = props.environment, + keyNavigationNext = props.keyNavigationNext, + keyNavigationPrevious = props.keyNavigationPrevious; + + // Reducer init. + var _useControlledReducer = useControlledReducer$1(downshiftMultipleSelectionReducer, getInitialState(props), props), + state = _useControlledReducer[0], + dispatch = _useControlledReducer[1]; + var activeIndex = state.activeIndex, + selectedItems = state.selectedItems; + + // Refs. + var isInitialMountRef = react.useRef(true); + var dropdownRef = react.useRef(null); + var previousSelectedItemsRef = react.useRef(selectedItems); + var selectedItemRefs = react.useRef(); + selectedItemRefs.current = []; + // used for checking when props are moving from controlled to uncontrolled. + var prevPropsRef = react.useRef(props); + var latest = useLatestRef({ + state: state, + props: props + }); + + // Effects. + /* Sets a11y status message on changes in selectedItem. */ + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (selectedItems.length < previousSelectedItemsRef.current.length) { + var removedSelectedItem = previousSelectedItemsRef.current.find(function (item) { + return selectedItems.indexOf(item) < 0; + }); + setStatus(getA11yRemovalMessage({ + itemToString: itemToString, + resultCount: selectedItems.length, + removedSelectedItem: removedSelectedItem, + activeIndex: activeIndex, + activeSelectedItem: selectedItems[activeIndex] + }), environment.document); + } + previousSelectedItemsRef.current = selectedItems; + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedItems.length]); + // Sets focus on active item. + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + if (activeIndex === -1 && dropdownRef.current) { + dropdownRef.current.focus(); + } else if (selectedItemRefs.current[activeIndex]) { + selectedItemRefs.current[activeIndex].focus(); + } + }, [activeIndex]); + react.useEffect(function () { + if (isInitialMountRef.current) { + return; + } + validateControlledUnchanged(state, prevPropsRef.current, props); + prevPropsRef.current = props; + }, [state, props]); + var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps'); + // Make initial ref false. + react.useEffect(function () { + isInitialMountRef.current = false; + }, []); + + // Event handler functions. + var selectedItemKeyDownHandlers = react.useMemo(function () { + var _ref; + return _ref = {}, _ref[keyNavigationPrevious] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationPrevious + }); + }, _ref[keyNavigationNext] = function () { + dispatch({ + type: SelectedItemKeyDownNavigationNext + }); + }, _ref.Delete = function Delete() { + dispatch({ + type: SelectedItemKeyDownDelete + }); + }, _ref.Backspace = function Backspace() { + dispatch({ + type: SelectedItemKeyDownBackspace + }); + }, _ref; + }, [dispatch, keyNavigationNext, keyNavigationPrevious]); + var dropdownKeyDownHandlers = react.useMemo(function () { + var _ref2; + return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownNavigationPrevious + }); + } + }, _ref2.Backspace = function Backspace(event) { + if (isKeyDownOperationPermitted(event)) { + dispatch({ + type: DropdownKeyDownBackspace + }); + } + }, _ref2; + }, [dispatch, keyNavigationPrevious]); + + // Getter props. + var getSelectedItemProps = react.useCallback(function (_temp) { + var _extends2; + var _ref3 = _temp === void 0 ? {} : _temp, + _ref3$refKey = _ref3.refKey, + refKey = _ref3$refKey === void 0 ? 'ref' : _ref3$refKey, + ref = _ref3.ref, + onClick = _ref3.onClick, + onKeyDown = _ref3.onKeyDown, + selectedItem = _ref3.selectedItem, + index = _ref3.index, + rest = _objectWithoutPropertiesLoose(_ref3, _excluded); + var latestState = latest.current.state; + var itemIndex = getItemIndex(index, selectedItem, latestState.selectedItems); + if (itemIndex < 0) { + throw new Error('Pass either selectedItem or index in getSelectedItemProps!'); + } + return _extends((_extends2 = {}, _extends2[refKey] = handleRefs(ref, function (selectedItemNode) { + if (selectedItemNode) { + selectedItemRefs.current.push(selectedItemNode); + } + }), _extends2.tabIndex = index === latestState.activeIndex ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, function selectedItemHandleClick() { + dispatch({ + type: SelectedItemClick, + index: index + }); + }), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, function selectedItemHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && selectedItemKeyDownHandlers[key]) { + selectedItemKeyDownHandlers[key](event); + } + }), _extends2), rest); + }, [dispatch, latest, selectedItemKeyDownHandlers]); + var getDropdownProps = react.useCallback(function (_temp2, _temp3) { + var _extends3; + var _ref4 = _temp2 === void 0 ? {} : _temp2, + _ref4$refKey = _ref4.refKey, + refKey = _ref4$refKey === void 0 ? 'ref' : _ref4$refKey, + ref = _ref4.ref, + onKeyDown = _ref4.onKeyDown, + onClick = _ref4.onClick, + _ref4$preventKeyActio = _ref4.preventKeyAction, + preventKeyAction = _ref4$preventKeyActio === void 0 ? false : _ref4$preventKeyActio, + rest = _objectWithoutPropertiesLoose(_ref4, _excluded2); + var _ref5 = _temp3 === void 0 ? {} : _temp3, + _ref5$suppressRefErro = _ref5.suppressRefError, + suppressRefError = _ref5$suppressRefErro === void 0 ? false : _ref5$suppressRefErro; + setGetterPropCallInfo('getDropdownProps', suppressRefError, refKey, dropdownRef); + return _extends((_extends3 = {}, _extends3[refKey] = handleRefs(ref, function (dropdownNode) { + if (dropdownNode) { + dropdownRef.current = dropdownNode; + } + }), _extends3), !preventKeyAction && { + onKeyDown: callAllEventHandlers(onKeyDown, function dropdownHandleKeyDown(event) { + var key = normalizeArrowKey(event); + if (key && dropdownKeyDownHandlers[key]) { + dropdownKeyDownHandlers[key](event); + } + }), + onClick: callAllEventHandlers(onClick, function dropdownHandleClick() { + dispatch({ + type: DropdownClick + }); + }) + }, rest); + }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]); + + // returns + var addSelectedItem = react.useCallback(function (selectedItem) { + dispatch({ + type: FunctionAddSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var removeSelectedItem = react.useCallback(function (selectedItem) { + dispatch({ + type: FunctionRemoveSelectedItem, + selectedItem: selectedItem + }); + }, [dispatch]); + var setSelectedItems = react.useCallback(function (newSelectedItems) { + dispatch({ + type: FunctionSetSelectedItems, + selectedItems: newSelectedItems + }); + }, [dispatch]); + var setActiveIndex = react.useCallback(function (newActiveIndex) { + dispatch({ + type: FunctionSetActiveIndex, + activeIndex: newActiveIndex + }); + }, [dispatch]); + var reset = react.useCallback(function () { + dispatch({ + type: FunctionReset + }); + }, [dispatch]); + return { + getSelectedItemProps: getSelectedItemProps, + getDropdownProps: getDropdownProps, + addSelectedItem: addSelectedItem, + removeSelectedItem: removeSelectedItem, + setSelectedItems: setSelectedItems, + setActiveIndex: setActiveIndex, + reset: reset, + selectedItems: selectedItems, + activeIndex: activeIndex + }; + } + + exports["default"] = Downshift$1; + exports.resetIdCounter = resetIdCounter; + exports.useCombobox = useCombobox; + exports.useMultipleSelection = useMultipleSelection; + exports.useSelect = useSelect; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +//# sourceMappingURL=downshift.umd.js.map diff --git a/dist/downshift.umd.js.map b/dist/downshift.umd.js.map new file mode 100644 index 000000000..ec89e39eb --- /dev/null +++ b/dist/downshift.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"downshift.umd.js","sources":["../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/lib/has.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/index.js","../node_modules/compute-scroll-into-view/dist/index.mjs","../src/utils.js","../src/set-a11y-status.js","../src/stateChangeTypes.js","../src/downshift.js","../src/hooks/utils.js","../src/hooks/useSelect/utils.js","../src/hooks/useSelect/stateChangeTypes.js","../src/hooks/useSelect/reducer.js","../src/hooks/useSelect/index.js","../src/hooks/useCombobox/stateChangeTypes.js","../src/hooks/useCombobox/utils.js","../src/hooks/useCombobox/reducer.js","../src/hooks/useCombobox/index.js","../src/hooks/useMultipleSelection/utils.js","../src/hooks/useMultipleSelection/stateChangeTypes.js","../src/hooks/useMultipleSelection/reducer.js","../src/hooks/useMultipleSelection/index.js"],"sourcesContent":["export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","function t(t){return\"object\"==typeof t&&null!=t&&1===t.nodeType}function e(t,e){return(!e||\"hidden\"!==t)&&\"visible\"!==t&&\"clip\"!==t}function n(t,n){if(t.clientHeighte||o>t&&l=e&&d>=n?o-t-r:l>e&&dn?l-e+i:0}var i=function(e,i){var o=window,l=i.scrollMode,d=i.block,f=i.inline,h=i.boundary,u=i.skipOverflowHiddenElements,s=\"function\"==typeof h?h:function(t){return t!==h};if(!t(e))throw new TypeError(\"Invalid target\");for(var a,c,g=document.scrollingElement||document.documentElement,p=[],m=e;t(m)&&s(m);){if((m=null==(c=(a=m).parentElement)?a.getRootNode().host||null:c)===g){p.push(m);break}null!=m&&m===document.body&&n(m)&&!n(document.documentElement)||null!=m&&n(m,u)&&p.push(m)}for(var w=o.visualViewport?o.visualViewport.width:innerWidth,v=o.visualViewport?o.visualViewport.height:innerHeight,W=window.scrollX||pageXOffset,H=window.scrollY||pageYOffset,b=e.getBoundingClientRect(),y=b.height,E=b.width,M=b.top,V=b.right,x=b.bottom,I=b.left,C=\"start\"===d||\"nearest\"===d?M:\"end\"===d?x:M+y/2,R=\"center\"===f?I+E/2:\"end\"===f?V:I,T=[],k=0;k=0&&I>=0&&x<=v&&V<=w&&M>=Y&&x<=S&&I>=j&&V<=L)return T;var N=getComputedStyle(B),q=parseInt(N.borderLeftWidth,10),z=parseInt(N.borderTopWidth,10),A=parseInt(N.borderRightWidth,10),F=parseInt(N.borderBottomWidth,10),G=0,J=0,K=\"offsetWidth\"in B?B.offsetWidth-B.clientWidth-q-A:0,P=\"offsetHeight\"in B?B.offsetHeight-B.clientHeight-z-F:0,Q=\"offsetWidth\"in B?0===B.offsetWidth?0:X/B.offsetWidth:0,U=\"offsetHeight\"in B?0===B.offsetHeight?0:O/B.offsetHeight:0;if(g===B)G=\"start\"===d?C:\"end\"===d?C-v:\"nearest\"===d?r(H,H+v,v,z,F,H+C,H+C+y,y):C-v/2,J=\"start\"===f?R:\"center\"===f?R-w/2:\"end\"===f?R-w:r(W,W+w,w,q,A,W+R,W+R+E,E),G=Math.max(0,G+H),J=Math.max(0,J+W);else{G=\"start\"===d?C-Y-z:\"end\"===d?C-S+F+P:\"nearest\"===d?r(Y,S,O,z,F+P,C,C+y,y):C-(Y+O/2)+P/2,J=\"start\"===f?R-j-q:\"center\"===f?R-(j+X/2)+K/2:\"end\"===f?R-L+A+K:r(j,L,X,q,A+K,R,R+E,E);var Z=B.scrollLeft,$=B.scrollTop;C+=$-(G=Math.max(0,Math.min($+G/U,B.scrollHeight-O/U+P))),R+=Z-(J=Math.max(0,Math.min(Z+J/Q,B.scrollWidth-X/Q+K)))}T.push({el:B,top:G,left:J})}return T};export{i as default};\n//# sourceMappingURL=index.mjs.map\n","import computeScrollIntoView from 'compute-scroll-into-view'\nimport {isPreact} from './is.macro'\n\nlet idCounter = 0\n\n/**\n * Accepts a parameter and returns it if it's a function\n * or a noop function if it's not. This allows us to\n * accept a callback, but not worry about it if it's not\n * passed.\n * @param {Function} cb the callback\n * @return {Function} a function\n */\nfunction cbToCb(cb) {\n return typeof cb === 'function' ? cb : noop\n}\n\nfunction noop() {}\n\n/**\n * Scroll node into view if necessary\n * @param {HTMLElement} node the element that should scroll into view\n * @param {HTMLElement} menuNode the menu element of the component\n */\nfunction scrollIntoView(node, menuNode) {\n if (!node) {\n return\n }\n\n const actions = computeScrollIntoView(node, {\n boundary: menuNode,\n block: 'nearest',\n scrollMode: 'if-needed',\n })\n actions.forEach(({el, top, left}) => {\n el.scrollTop = top\n el.scrollLeft = left\n })\n}\n\n/**\n * @param {HTMLElement} parent the parent node\n * @param {HTMLElement} child the child node\n * @return {Boolean} whether the parent is the child or the child is in the parent\n */\nfunction isOrContainsNode(parent, child) {\n return parent === child || (parent.contains && parent.contains(child))\n}\n\n/**\n * Simple debounce implementation. Will call the given\n * function once after the time given has passed since\n * it was last called.\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n * @return {Function} the debounced function\n */\nfunction debounce(fn, time) {\n let timeoutId\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n }\n\n function wrapper(...args) {\n cancel()\n timeoutId = setTimeout(() => {\n timeoutId = null\n fn(...args)\n }, time)\n }\n\n wrapper.cancel = cancel\n\n return wrapper\n}\n\n/**\n * This is intended to be used to compose event handlers.\n * They are executed in order until one of them sets\n * `event.preventDownshiftDefault = true`.\n * @param {...Function} fns the event handler functions\n * @return {Function} the event handler to add to an element\n */\nfunction callAllEventHandlers(...fns) {\n return (event, ...args) =>\n fns.some(fn => {\n if (fn) {\n fn(event, ...args)\n }\n return (\n event.preventDownshiftDefault ||\n (event.hasOwnProperty('nativeEvent') &&\n event.nativeEvent.preventDownshiftDefault)\n )\n })\n}\n\nfunction handleRefs(...refs) {\n return node => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n })\n }\n}\n\n/**\n * This generates a unique ID for an instance of Downshift\n * @return {String} the unique ID\n */\nfunction generateId() {\n return String(idCounter++)\n}\n\n/**\n * This is only used in tests\n * @param {Number} num the number to set the idCounter to\n */\nfunction setIdCounter(num) {\n idCounter = num\n}\n\n/**\n * Resets idCounter to 0. Used for SSR.\n */\nfunction resetIdCounter() {\n idCounter = 0\n}\n\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specift if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\nfunction getA11yStatusMessage({isOpen, resultCount, previousResultCount}) {\n if (!isOpen) {\n return ''\n }\n\n if (!resultCount) {\n return 'No results are available.'\n }\n\n if (resultCount !== previousResultCount) {\n return `${resultCount} result${\n resultCount === 1 ? ' is' : 's are'\n } available, use up and down arrow keys to navigate. Press Enter key to select.`\n }\n\n return ''\n}\n\n/**\n * Takes an argument and if it's an array, returns the first item in the array\n * otherwise returns the argument\n * @param {*} arg the maybe-array\n * @param {*} defaultValue the value if arg is falsey not defined\n * @return {*} the arg or it's first item\n */\nfunction unwrapArray(arg, defaultValue) {\n arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */ arg[0] : arg\n if (!arg && defaultValue) {\n return defaultValue\n } else {\n return arg\n }\n}\n\n/**\n * @param {Object} element (P)react element\n * @return {Boolean} whether it's a DOM element\n */\nfunction isDOMElement(element) {\n /* istanbul ignore if */\n if (isPreact) {\n // then this is preact or preact X\n return (\n typeof element.type === 'string' || typeof element.nodeName === 'string'\n )\n }\n\n // then we assume this is react\n return typeof element.type === 'string'\n}\n\n/**\n * @param {Object} element (P)react element\n * @return {Object} the props\n */\nfunction getElementProps(element) {\n // props for react, attributes for preact\n\n /* istanbul ignore if */\n if (isPreact) {\n return element.props || element.attributes\n }\n\n return element.props\n}\n\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\nfunction requiredProp(fnName, propName) {\n // eslint-disable-next-line no-console\n console.error(`The property \"${propName}\" is required in \"${fnName}\"`)\n}\n\nconst stateKeys = [\n 'highlightedIndex',\n 'inputValue',\n 'isOpen',\n 'selectedItem',\n 'type',\n]\n/**\n * @param {Object} state the state object\n * @return {Object} state that is relevant to downshift\n */\nfunction pickState(state = {}) {\n const result = {}\n stateKeys.forEach(k => {\n if (state.hasOwnProperty(k)) {\n result[k] = state[k]\n }\n })\n return result\n}\n\n/**\n * This will perform a shallow merge of the given state object\n * with the state coming from props\n * (for the controlled component scenario)\n * This is used in state updater functions so they're referencing\n * the right state regardless of where it comes from.\n *\n * @param {Object} state The state of the component/hook.\n * @param {Object} props The props that may contain controlled values.\n * @returns {Object} The merged controlled state.\n */\nfunction getState(state, props) {\n return Object.keys(state).reduce((prevState, key) => {\n prevState[key] = isControlledProp(props, key) ? props[key] : state[key]\n\n return prevState\n }, {})\n}\n\n/**\n * This determines whether a prop is a \"controlled prop\" meaning it is\n * state which is controlled by the outside of this component rather\n * than within this component.\n *\n * @param {Object} props The props that may contain controlled values.\n * @param {String} key the key to check\n * @return {Boolean} whether it is a controlled controlled prop\n */\nfunction isControlledProp(props, key) {\n return props[key] !== undefined\n}\n\n/**\n * Normalizes the 'key' property of a KeyboardEvent in IE/Edge\n * @param {Object} event a keyboardEvent object\n * @return {String} keyboard key\n */\nfunction normalizeArrowKey(event) {\n const {key, keyCode} = event\n /* istanbul ignore next (ie) */\n if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) {\n return `Arrow${key}`\n }\n return key\n}\n\n/**\n * Simple check if the value passed is object literal\n * @param {*} obj any things\n * @return {Boolean} whether it's object literal\n */\nfunction isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]'\n}\n\n/**\n * Returns the new index in the list, in a circular way. If next value is out of bonds from the total,\n * it will wrap to either 0 or itemCount - 1.\n *\n * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.\n * @param {number} baseIndex The initial position to move from.\n * @param {number} itemCount The total number of items.\n * @param {Function} getItemNodeFromIndex Used to check if item is disabled.\n * @param {boolean} circular Specify if navigation is circular. Default is true.\n * @returns {number} The new index after the move.\n */\nfunction getNextWrappingIndex(\n moveAmount,\n baseIndex,\n itemCount,\n getItemNodeFromIndex,\n circular = true,\n) {\n if (itemCount === 0) {\n return -1\n }\n\n const itemsLastIndex = itemCount - 1\n\n if (\n typeof baseIndex !== 'number' ||\n baseIndex < 0 ||\n baseIndex >= itemCount\n ) {\n baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1\n }\n\n let newIndex = baseIndex + moveAmount\n\n if (newIndex < 0) {\n newIndex = circular ? itemsLastIndex : 0\n } else if (newIndex > itemsLastIndex) {\n newIndex = circular ? 0 : itemsLastIndex\n }\n\n const nonDisabledNewIndex = getNextNonDisabledIndex(\n moveAmount,\n newIndex,\n itemCount,\n getItemNodeFromIndex,\n circular,\n )\n\n return nonDisabledNewIndex === -1 ? baseIndex : nonDisabledNewIndex\n}\n\n/**\n * Returns the next index in the list of an item that is not disabled.\n *\n * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.\n * @param {number} baseIndex The initial position to move from.\n * @param {number} itemCount The total number of items.\n * @param {Function} getItemNodeFromIndex Used to check if item is disabled.\n * @param {boolean} circular Specify if navigation is circular. Default is true.\n * @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.\n */\nfunction getNextNonDisabledIndex(\n moveAmount,\n baseIndex,\n itemCount,\n getItemNodeFromIndex,\n circular,\n) {\n const currentElementNode = getItemNodeFromIndex(baseIndex)\n if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) {\n return baseIndex\n }\n\n if (moveAmount > 0) {\n for (let index = baseIndex + 1; index < itemCount; index++) {\n if (!getItemNodeFromIndex(index).hasAttribute('disabled')) {\n return index\n }\n }\n } else {\n for (let index = baseIndex - 1; index >= 0; index--) {\n if (!getItemNodeFromIndex(index).hasAttribute('disabled')) {\n return index\n }\n }\n }\n\n if (circular) {\n return moveAmount > 0\n ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false)\n : getNextNonDisabledIndex(\n -1,\n itemCount - 1,\n itemCount,\n getItemNodeFromIndex,\n false,\n )\n }\n\n return -1\n}\n\n/**\n * Checks if event target is within the downshift elements.\n *\n * @param {EventTarget} target Target to check.\n * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc).\n * @param {Document} document The document.\n * @param {boolean} checkActiveElement Whether to also check activeElement.\n *\n * @returns {boolean} Whether or not the target is within downshift elements.\n */\nfunction targetWithinDownshift(\n target,\n downshiftElements,\n document,\n checkActiveElement = true,\n) {\n return downshiftElements.some(\n contextNode =>\n contextNode &&\n (isOrContainsNode(contextNode, target) ||\n (checkActiveElement &&\n isOrContainsNode(contextNode, document.activeElement))),\n )\n}\n\nexport function validateControlledUnchanged(state, prevProps, nextProps) {\n if (process.env.NODE_ENV === 'production') {\n return\n }\n\n const warningDescription = `This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props`\n\n Object.keys(state).forEach(propKey => {\n if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: A component has changed the controlled prop \"${propKey}\" to be uncontrolled. ${warningDescription}`,\n )\n } else if (\n prevProps[propKey] === undefined &&\n nextProps[propKey] !== undefined\n ) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: A component has changed the uncontrolled prop \"${propKey}\" to be controlled. ${warningDescription}`,\n )\n }\n })\n}\n\nexport {\n cbToCb,\n callAllEventHandlers,\n handleRefs,\n debounce,\n scrollIntoView,\n generateId,\n getA11yStatusMessage,\n unwrapArray,\n isDOMElement,\n getElementProps,\n noop,\n requiredProp,\n setIdCounter,\n resetIdCounter,\n pickState,\n isPlainObject,\n normalizeArrowKey,\n getNextWrappingIndex,\n getNextNonDisabledIndex,\n targetWithinDownshift,\n getState,\n isControlledProp,\n}\n","import {debounce} from './utils'\n\nconst cleanupStatus = debounce(() => {\n getStatusDiv().textContent = ''\n}, 500)\n\n/**\n * @param {String} status the status message\n * @param {Object} documentProp document passed by the user.\n */\nfunction setStatus(status, documentProp) {\n const div = getStatusDiv(documentProp)\n if (!status) {\n return\n }\n\n div.textContent = status\n cleanupStatus()\n}\n\n/**\n * Get the status node or create it if it does not already exist.\n * @param {Object} documentProp document passed by the user.\n * @return {HTMLElement} the status node.\n */\nfunction getStatusDiv(documentProp = document) {\n let statusDiv = documentProp.getElementById('a11y-status-message')\n if (statusDiv) {\n return statusDiv\n }\n\n statusDiv = documentProp.createElement('div')\n statusDiv.setAttribute('id', 'a11y-status-message')\n statusDiv.setAttribute('role', 'status')\n statusDiv.setAttribute('aria-live', 'polite')\n statusDiv.setAttribute('aria-relevant', 'additions text')\n Object.assign(statusDiv.style, {\n border: '0',\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: '0',\n position: 'absolute',\n width: '1px',\n })\n documentProp.body.appendChild(statusDiv)\n return statusDiv\n}\n\nexport default setStatus\n","import productionEnum from './productionEnum.macro'\n\nexport const unknown = productionEnum('__autocomplete_unknown__')\nexport const mouseUp = productionEnum('__autocomplete_mouseup__')\nexport const itemMouseEnter = productionEnum('__autocomplete_item_mouseenter__')\nexport const keyDownArrowUp = productionEnum(\n '__autocomplete_keydown_arrow_up__',\n)\nexport const keyDownArrowDown = productionEnum(\n '__autocomplete_keydown_arrow_down__',\n)\nexport const keyDownEscape = productionEnum('__autocomplete_keydown_escape__')\nexport const keyDownEnter = productionEnum('__autocomplete_keydown_enter__')\nexport const keyDownHome = productionEnum('__autocomplete_keydown_home__')\nexport const keyDownEnd = productionEnum('__autocomplete_keydown_end__')\nexport const clickItem = productionEnum('__autocomplete_click_item__')\nexport const blurInput = productionEnum('__autocomplete_blur_input__')\nexport const changeInput = productionEnum('__autocomplete_change_input__')\nexport const keyDownSpaceButton = productionEnum(\n '__autocomplete_keydown_space_button__',\n)\nexport const clickButton = productionEnum('__autocomplete_click_button__')\nexport const blurButton = productionEnum('__autocomplete_blur_button__')\nexport const controlledPropUpdatedSelectedItem = productionEnum(\n '__autocomplete_controlled_prop_updated_selected_item__',\n)\nexport const touchEnd = productionEnum('__autocomplete_touchend__')\n","/* eslint camelcase:0 */\n\nimport PropTypes from 'prop-types'\nimport {Component, cloneElement} from 'react'\nimport {isForwardRef} from 'react-is'\nimport {isPreact, isReactNative} from './is.macro'\nimport setA11yStatus from './set-a11y-status'\nimport * as stateChangeTypes from './stateChangeTypes'\nimport {\n handleRefs,\n callAllEventHandlers,\n cbToCb,\n debounce,\n generateId,\n getA11yStatusMessage,\n getElementProps,\n isDOMElement,\n targetWithinDownshift,\n isPlainObject,\n noop,\n normalizeArrowKey,\n pickState,\n requiredProp,\n scrollIntoView,\n unwrapArray,\n getNextWrappingIndex,\n getNextNonDisabledIndex,\n getState,\n isControlledProp,\n validateControlledUnchanged\n} from './utils'\n\nclass Downshift extends Component {\n static propTypes = {\n children: PropTypes.func,\n defaultHighlightedIndex: PropTypes.number,\n defaultIsOpen: PropTypes.bool,\n initialHighlightedIndex: PropTypes.number,\n initialSelectedItem: PropTypes.any,\n initialInputValue: PropTypes.string,\n initialIsOpen: PropTypes.bool,\n getA11yStatusMessage: PropTypes.func,\n itemToString: PropTypes.func,\n onChange: PropTypes.func,\n onSelect: PropTypes.func,\n onStateChange: PropTypes.func,\n onInputValueChange: PropTypes.func,\n onUserAction: PropTypes.func,\n onOuterClick: PropTypes.func,\n selectedItemChanged: PropTypes.func,\n stateReducer: PropTypes.func,\n itemCount: PropTypes.number,\n id: PropTypes.string,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n suppressRefError: PropTypes.bool,\n scrollIntoView: PropTypes.func,\n // things we keep in state for uncontrolled components\n // but can accept as props for controlled components\n /* eslint-disable react/no-unused-prop-types */\n selectedItem: PropTypes.any,\n isOpen: PropTypes.bool,\n inputValue: PropTypes.string,\n highlightedIndex: PropTypes.number,\n labelId: PropTypes.string,\n inputId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n /* eslint-enable react/no-unused-prop-types */\n }\n\n static defaultProps = {\n defaultHighlightedIndex: null,\n defaultIsOpen: false,\n getA11yStatusMessage,\n itemToString: i => {\n if (i == null) {\n return ''\n }\n if (\n process.env.NODE_ENV !== 'production' &&\n isPlainObject(i) &&\n !i.hasOwnProperty('toString')\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n 'downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.',\n 'The object that was passed:',\n i,\n )\n }\n return String(i)\n },\n onStateChange: noop,\n onInputValueChange: noop,\n onUserAction: noop,\n onChange: noop,\n onSelect: noop,\n onOuterClick: noop,\n selectedItemChanged: (prevItem, item) => prevItem !== item,\n environment:\n typeof window === 'undefined' /* istanbul ignore next (ssr) */\n ? {}\n : window,\n stateReducer: (state, stateToSet) => stateToSet,\n suppressRefError: false,\n scrollIntoView,\n }\n\n static stateChangeTypes = stateChangeTypes\n\n constructor(props) {\n super(props)\n // fancy destructuring + defaults + aliases\n // this basically says each value of state should either be set to\n // the initial value or the default value if the initial value is not provided\n const {\n defaultHighlightedIndex,\n initialHighlightedIndex: highlightedIndex = defaultHighlightedIndex,\n defaultIsOpen,\n initialIsOpen: isOpen = defaultIsOpen,\n initialInputValue: inputValue = '',\n initialSelectedItem: selectedItem = null,\n } = this.props\n const state = this.getState({\n highlightedIndex,\n isOpen,\n inputValue,\n selectedItem,\n })\n if (\n state.selectedItem != null &&\n this.props.initialInputValue === undefined\n ) {\n state.inputValue = this.props.itemToString(state.selectedItem)\n }\n this.state = state\n }\n\n id = this.props.id || `downshift-${generateId()}`\n menuId = this.props.menuId || `${this.id}-menu`\n labelId = this.props.labelId || `${this.id}-label`\n inputId = this.props.inputId || `${this.id}-input`\n getItemId = this.props.getItemId || (index => `${this.id}-item-${index}`)\n\n input = null\n items = []\n // itemCount can be changed asynchronously\n // from within downshift (so it can't come from a prop)\n // this is why we store it as an instance and use\n // getItemCount rather than just use items.length\n // (to support windowing + async)\n itemCount = null\n previousResultCount = 0\n\n timeoutIds = []\n\n /**\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n */\n internalSetTimeout = (fn, time) => {\n const id = setTimeout(() => {\n this.timeoutIds = this.timeoutIds.filter(i => i !== id)\n fn()\n }, time)\n\n this.timeoutIds.push(id)\n }\n\n /**\n * Clear all running timeouts\n */\n internalClearTimeouts() {\n this.timeoutIds.forEach(id => {\n clearTimeout(id)\n })\n\n this.timeoutIds = []\n }\n\n /**\n * Gets the state based on internal state or props\n * If a state value is passed via props, then that\n * is the value given, otherwise it's retrieved from\n * stateToMerge\n *\n * @param {Object} stateToMerge defaults to this.state\n * @return {Object} the state\n */\n getState(stateToMerge = this.state) {\n return getState(stateToMerge, this.props)\n }\n\n getItemCount() {\n // things read better this way. They're in priority order:\n // 1. `this.itemCount`\n // 2. `this.props.itemCount`\n // 3. `this.items.length`\n let itemCount = this.items.length\n if (this.itemCount != null) {\n itemCount = this.itemCount\n } else if (this.props.itemCount !== undefined) {\n itemCount = this.props.itemCount\n }\n return itemCount\n }\n\n setItemCount = count => {\n this.itemCount = count\n }\n\n unsetItemCount = () => {\n this.itemCount = null\n }\n\n getItemNodeFromIndex(index) {\n return this.props.environment.document.getElementById(this.getItemId(index))\n }\n\n setHighlightedIndex = (\n highlightedIndex = this.props.defaultHighlightedIndex,\n otherStateToSet = {},\n ) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState({highlightedIndex, ...otherStateToSet})\n }\n\n scrollHighlightedItemIntoView() {\n /* istanbul ignore else (react-native) */\n if (!isReactNative) {\n const node = this.getItemNodeFromIndex(this.getState().highlightedIndex)\n this.props.scrollIntoView(node, this._menuNode)\n }\n }\n\n moveHighlightedIndex(amount, otherStateToSet) {\n const itemCount = this.getItemCount()\n const {highlightedIndex} = this.getState()\n if (itemCount > 0) {\n const nextHighlightedIndex = getNextWrappingIndex(\n amount,\n highlightedIndex,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n )\n this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet)\n }\n }\n\n clearSelection = cb => {\n this.internalSetState(\n {\n selectedItem: null,\n inputValue: '',\n highlightedIndex: this.props.defaultHighlightedIndex,\n isOpen: this.props.defaultIsOpen,\n },\n cb,\n )\n }\n\n selectItem = (item, otherStateToSet, cb) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState(\n {\n isOpen: this.props.defaultIsOpen,\n highlightedIndex: this.props.defaultHighlightedIndex,\n selectedItem: item,\n inputValue: this.props.itemToString(item),\n ...otherStateToSet,\n },\n cb,\n )\n }\n\n selectItemAtIndex = (itemIndex, otherStateToSet, cb) => {\n const item = this.items[itemIndex]\n if (item == null) {\n return\n }\n this.selectItem(item, otherStateToSet, cb)\n }\n\n selectHighlightedItem = (otherStateToSet, cb) => {\n return this.selectItemAtIndex(\n this.getState().highlightedIndex,\n otherStateToSet,\n cb,\n )\n }\n\n // any piece of our state can live in two places:\n // 1. Uncontrolled: it's internal (this.state)\n // We will call this.setState to update that state\n // 2. Controlled: it's external (this.props)\n // We will call this.props.onStateChange to update that state\n //\n // In addition, we'll call this.props.onChange if the\n // selectedItem is changed.\n internalSetState = (stateToSet, cb) => {\n let isItemSelected, onChangeArg\n\n const onStateChangeArg = {}\n const isStateToSetFunction = typeof stateToSet === 'function'\n\n // we want to call `onInputValueChange` before the `setState` call\n // so someone controlling the `inputValue` state gets notified of\n // the input change as soon as possible. This avoids issues with\n // preserving the cursor position.\n // See https://github.com/downshift-js/downshift/issues/217 for more info.\n if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) {\n this.props.onInputValueChange(stateToSet.inputValue, {\n ...this.getStateAndHelpers(),\n ...stateToSet,\n })\n }\n return this.setState(\n state => {\n state = this.getState(state)\n let newStateToSet = isStateToSetFunction\n ? stateToSet(state)\n : stateToSet\n\n // Your own function that could modify the state that will be set.\n newStateToSet = this.props.stateReducer(state, newStateToSet)\n\n // checks if an item is selected, regardless of if it's different from\n // what was selected before\n // used to determine if onSelect and onChange callbacks should be called\n isItemSelected = newStateToSet.hasOwnProperty('selectedItem')\n // this keeps track of the object we want to call with setState\n const nextState = {}\n // this is just used to tell whether the state changed\n const nextFullState = {}\n // we need to call on change if the outside world is controlling any of our state\n // and we're trying to update that state. OR if the selection has changed and we're\n // trying to update the selection\n if (\n isItemSelected &&\n newStateToSet.selectedItem !== state.selectedItem\n ) {\n onChangeArg = newStateToSet.selectedItem\n }\n newStateToSet.type = newStateToSet.type || stateChangeTypes.unknown\n\n Object.keys(newStateToSet).forEach(key => {\n // onStateChangeArg should only have the state that is\n // actually changing\n if (state[key] !== newStateToSet[key]) {\n onStateChangeArg[key] = newStateToSet[key]\n }\n // the type is useful for the onStateChangeArg\n // but we don't actually want to set it in internal state.\n // this is an undocumented feature for now... Not all internalSetState\n // calls support it and I'm not certain we want them to yet.\n // But it enables users controlling the isOpen state to know when\n // the isOpen state changes due to mouseup events which is quite handy.\n if (key === 'type') {\n return\n }\n nextFullState[key] = newStateToSet[key]\n // if it's coming from props, then we don't care to set it internally\n if (!isControlledProp(this.props, key)) {\n nextState[key] = newStateToSet[key]\n }\n })\n\n // if stateToSet is a function, then we weren't able to call onInputValueChange\n // earlier, so we'll call it now that we know what the inputValue state will be.\n if (\n isStateToSetFunction &&\n newStateToSet.hasOwnProperty('inputValue')\n ) {\n this.props.onInputValueChange(newStateToSet.inputValue, {\n ...this.getStateAndHelpers(),\n ...newStateToSet,\n })\n }\n\n return nextState\n },\n () => {\n // call the provided callback if it's a function\n cbToCb(cb)()\n\n // only call the onStateChange and onChange callbacks if\n // we have relevant information to pass them.\n const hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1\n if (hasMoreStateThanType) {\n this.props.onStateChange(onStateChangeArg, this.getStateAndHelpers())\n }\n\n if (isItemSelected) {\n this.props.onSelect(\n stateToSet.selectedItem,\n this.getStateAndHelpers(),\n )\n }\n\n if (onChangeArg !== undefined) {\n this.props.onChange(onChangeArg, this.getStateAndHelpers())\n }\n // this is currently undocumented and therefore subject to change\n // We'll try to not break it, but just be warned.\n this.props.onUserAction(onStateChangeArg, this.getStateAndHelpers())\n },\n )\n }\n\n getStateAndHelpers() {\n const {highlightedIndex, inputValue, selectedItem, isOpen} = this.getState()\n const {itemToString} = this.props\n const {id} = this\n const {\n getRootProps,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getItemProps,\n openMenu,\n closeMenu,\n toggleMenu,\n selectItem,\n selectItemAtIndex,\n selectHighlightedItem,\n setHighlightedIndex,\n clearSelection,\n clearItems,\n reset,\n setItemCount,\n unsetItemCount,\n internalSetState: setState,\n } = this\n return {\n // prop getters\n getRootProps,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getItemProps,\n\n // actions\n reset,\n openMenu,\n closeMenu,\n toggleMenu,\n selectItem,\n selectItemAtIndex,\n selectHighlightedItem,\n setHighlightedIndex,\n clearSelection,\n clearItems,\n setItemCount,\n unsetItemCount,\n setState,\n\n // props\n itemToString,\n\n // derived\n id,\n\n // state\n highlightedIndex,\n inputValue,\n isOpen,\n selectedItem,\n }\n }\n\n //////////////////////////// ROOT\n\n rootRef = node => (this._rootNode = node)\n\n getRootProps = (\n {refKey = 'ref', ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n // this is used in the render to know whether the user has called getRootProps.\n // It uses that to know whether to apply the props automatically\n this.getRootProps.called = true\n this.getRootProps.refKey = refKey\n this.getRootProps.suppressRefError = suppressRefError\n const {isOpen} = this.getState()\n return {\n [refKey]: handleRefs(ref, this.rootRef),\n role: 'combobox',\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'listbox',\n 'aria-owns': isOpen ? this.menuId : null,\n 'aria-labelledby': this.labelId,\n ...rest,\n }\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT\n\n keyDownHandlers = {\n ArrowDown(event) {\n event.preventDefault()\n\n if (this.getState().isOpen) {\n const amount = event.shiftKey ? 5 : 1\n this.moveHighlightedIndex(amount, {\n type: stateChangeTypes.keyDownArrowDown,\n })\n } else {\n this.internalSetState(\n {\n isOpen: true,\n type: stateChangeTypes.keyDownArrowDown,\n },\n () => {\n const itemCount = this.getItemCount()\n if (itemCount > 0) {\n const {highlightedIndex} = this.getState()\n const nextHighlightedIndex = getNextWrappingIndex(\n 1,\n highlightedIndex,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n )\n\n this.setHighlightedIndex(nextHighlightedIndex, {\n type: stateChangeTypes.keyDownArrowDown,\n })\n }\n },\n )\n }\n },\n\n ArrowUp(event) {\n event.preventDefault()\n\n if (this.getState().isOpen) {\n const amount = event.shiftKey ? -5 : -1\n this.moveHighlightedIndex(amount, {\n type: stateChangeTypes.keyDownArrowUp,\n })\n } else {\n this.internalSetState(\n {\n isOpen: true,\n type: stateChangeTypes.keyDownArrowUp,\n },\n () => {\n const itemCount = this.getItemCount()\n if (itemCount > 0) {\n const {highlightedIndex} = this.getState()\n const nextHighlightedIndex = getNextWrappingIndex(\n -1,\n highlightedIndex,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n )\n\n this.setHighlightedIndex(nextHighlightedIndex, {\n type: stateChangeTypes.keyDownArrowUp,\n })\n }\n },\n )\n }\n },\n\n Enter(event) {\n if (event.which === 229) {\n return\n }\n\n const {isOpen, highlightedIndex} = this.getState()\n if (isOpen && highlightedIndex != null) {\n event.preventDefault()\n const item = this.items[highlightedIndex]\n const itemNode = this.getItemNodeFromIndex(highlightedIndex)\n if (item == null || (itemNode && itemNode.hasAttribute('disabled'))) {\n return\n }\n this.selectHighlightedItem({\n type: stateChangeTypes.keyDownEnter,\n })\n }\n },\n\n Escape(event) {\n event.preventDefault()\n this.reset({\n type: stateChangeTypes.keyDownEscape,\n selectedItem: null,\n inputValue: '',\n })\n },\n }\n\n //////////////////////////// BUTTON\n\n buttonKeyDownHandlers = {\n ...this.keyDownHandlers,\n\n ' '(event) {\n event.preventDefault()\n this.toggleMenu({type: stateChangeTypes.keyDownSpaceButton})\n },\n }\n\n inputKeyDownHandlers = {\n ...this.keyDownHandlers,\n Home(event) {\n event.preventDefault()\n\n const itemCount = this.getItemCount()\n const {isOpen} = this.getState()\n\n if (itemCount <= 0 || !isOpen) {\n return\n }\n\n // get next non-disabled starting downwards from 0 if that's disabled.\n const newHighlightedIndex = getNextNonDisabledIndex(\n 1,\n 0,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n false,\n )\n\n this.setHighlightedIndex(newHighlightedIndex, {\n type: stateChangeTypes.keyDownHome,\n })\n },\n\n End(event) {\n event.preventDefault()\n\n const itemCount = this.getItemCount()\n const {isOpen} = this.getState()\n\n if (itemCount <= 0 || !isOpen) {\n return\n }\n\n // get next non-disabled starting upwards from last index if that's disabled.\n const newHighlightedIndex = getNextNonDisabledIndex(\n -1,\n itemCount - 1,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n false,\n )\n\n this.setHighlightedIndex(newHighlightedIndex, {\n type: stateChangeTypes.keyDownEnd,\n })\n },\n }\n\n getToggleButtonProps = ({\n onClick,\n onPress,\n onKeyDown,\n onKeyUp,\n onBlur,\n ...rest\n } = {}) => {\n const {isOpen} = this.getState()\n const enabledEventHandlers = isReactNative\n ? /* istanbul ignore next (react-native) */\n {\n onPress: callAllEventHandlers(onPress, this.buttonHandleClick),\n }\n : {\n onClick: callAllEventHandlers(onClick, this.buttonHandleClick),\n onKeyDown: callAllEventHandlers(onKeyDown, this.buttonHandleKeyDown),\n onKeyUp: callAllEventHandlers(onKeyUp, this.buttonHandleKeyUp),\n onBlur: callAllEventHandlers(onBlur, this.buttonHandleBlur),\n }\n const eventHandlers = rest.disabled ? {} : enabledEventHandlers\n return {\n type: 'button',\n role: 'button',\n 'aria-label': isOpen ? 'close menu' : 'open menu',\n 'aria-haspopup': true,\n 'data-toggle': true,\n ...eventHandlers,\n ...rest,\n }\n }\n\n buttonHandleKeyUp = event => {\n // Prevent click event from emitting in Firefox\n event.preventDefault()\n }\n\n buttonHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (this.buttonKeyDownHandlers[key]) {\n this.buttonKeyDownHandlers[key].call(this, event)\n }\n }\n\n buttonHandleClick = event => {\n event.preventDefault()\n // handle odd case for Safari and Firefox which\n // don't give the button the focus properly.\n /* istanbul ignore if (can't reasonably test this) */\n if (\n !isReactNative &&\n this.props.environment.document.activeElement ===\n this.props.environment.document.body\n ) {\n event.target.focus()\n }\n // to simplify testing components that use downshift, we'll not wrap this in a setTimeout\n // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated\n // when building for production and should therefore have no impact on production code.\n if (process.env.NODE_ENV === 'test') {\n this.toggleMenu({type: stateChangeTypes.clickButton})\n } else {\n // Ensure that toggle of menu occurs after the potential blur event in iOS\n this.internalSetTimeout(() =>\n this.toggleMenu({type: stateChangeTypes.clickButton}),\n )\n }\n }\n\n buttonHandleBlur = event => {\n const blurTarget = event.target // Save blur target for comparison with activeElement later\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element\n this.internalSetTimeout(() => {\n if (\n !this.isMouseDown &&\n (this.props.environment.document.activeElement == null ||\n this.props.environment.document.activeElement.id !== this.inputId) &&\n this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS)\n ) {\n this.reset({type: stateChangeTypes.blurButton})\n }\n })\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON\n\n /////////////////////////////// LABEL\n\n getLabelProps = props => {\n return {htmlFor: this.inputId, id: this.labelId, ...props}\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL\n\n /////////////////////////////// INPUT\n\n getInputProps = ({\n onKeyDown,\n onBlur,\n onChange,\n onInput,\n onChangeText,\n ...rest\n } = {}) => {\n let onChangeKey\n let eventHandlers = {}\n\n /* istanbul ignore next (preact) */\n if (isPreact) {\n onChangeKey = 'onInput'\n } else {\n onChangeKey = 'onChange'\n }\n const {inputValue, isOpen, highlightedIndex} = this.getState()\n\n if (!rest.disabled) {\n eventHandlers = {\n [onChangeKey]: callAllEventHandlers(\n onChange,\n onInput,\n this.inputHandleChange,\n ),\n onKeyDown: callAllEventHandlers(onKeyDown, this.inputHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, this.inputHandleBlur),\n }\n }\n\n /* istanbul ignore if (react-native) */\n if (isReactNative) {\n eventHandlers = {\n onChange: callAllEventHandlers(\n onChange,\n onInput,\n this.inputHandleChange,\n ),\n onChangeText: callAllEventHandlers(onChangeText, onInput, text =>\n this.inputHandleChange({nativeEvent: {text}}),\n ),\n onBlur: callAllEventHandlers(onBlur, this.inputHandleBlur),\n }\n }\n\n return {\n 'aria-autocomplete': 'list',\n 'aria-activedescendant':\n isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0\n ? this.getItemId(highlightedIndex)\n : null,\n 'aria-controls': isOpen ? this.menuId : null,\n 'aria-labelledby': this.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete=\"nope\" is ignored on latest Chrome and Opera\n autoComplete: 'off',\n value: inputValue,\n id: this.inputId,\n ...eventHandlers,\n ...rest,\n }\n }\n\n inputHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && this.inputKeyDownHandlers[key]) {\n this.inputKeyDownHandlers[key].call(this, event)\n }\n }\n\n inputHandleChange = event => {\n this.internalSetState({\n type: stateChangeTypes.changeInput,\n isOpen: true,\n inputValue: isReactNative\n ? /* istanbul ignore next (react-native) */ event.nativeEvent.text\n : event.target.value,\n highlightedIndex: this.props.defaultHighlightedIndex,\n })\n }\n\n inputHandleBlur = () => {\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element\n this.internalSetTimeout(() => {\n const downshiftButtonIsActive =\n this.props.environment.document &&\n !!this.props.environment.document.activeElement &&\n !!this.props.environment.document.activeElement.dataset &&\n this.props.environment.document.activeElement.dataset.toggle &&\n this._rootNode &&\n this._rootNode.contains(this.props.environment.document.activeElement)\n if (!this.isMouseDown && !downshiftButtonIsActive) {\n this.reset({type: stateChangeTypes.blurInput})\n }\n })\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT\n\n /////////////////////////////// MENU\n\n menuRef = node => {\n this._menuNode = node\n }\n\n getMenuProps = (\n {refKey = 'ref', ref, ...props} = {},\n {suppressRefError = false} = {},\n ) => {\n this.getMenuProps.called = true\n this.getMenuProps.refKey = refKey\n this.getMenuProps.suppressRefError = suppressRefError\n\n return {\n [refKey]: handleRefs(ref, this.menuRef),\n role: 'listbox',\n 'aria-labelledby': props && props['aria-label'] ? null : this.labelId,\n id: this.menuId,\n ...props,\n }\n }\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU\n\n /////////////////////////////// ITEM\n getItemProps = ({\n onMouseMove,\n onMouseDown,\n onClick,\n onPress,\n index,\n item = process.env.NODE_ENV === 'production'\n ? /* istanbul ignore next */ undefined\n : requiredProp('getItemProps', 'item'),\n ...rest\n } = {}) => {\n if (index === undefined) {\n this.items.push(item)\n index = this.items.indexOf(item)\n } else {\n this.items[index] = item\n }\n\n const onSelectKey = isReactNative\n ? /* istanbul ignore next (react-native) */ 'onPress'\n : 'onClick'\n const customClickHandler = isReactNative\n ? /* istanbul ignore next (react-native) */ onPress\n : onClick\n\n const enabledEventHandlers = {\n // onMouseMove is used over onMouseEnter here. onMouseMove\n // is only triggered on actual mouse movement while onMouseEnter\n // can fire on DOM changes, interrupting keyboard navigation\n onMouseMove: callAllEventHandlers(onMouseMove, () => {\n if (index === this.getState().highlightedIndex) {\n return\n }\n this.setHighlightedIndex(index, {\n type: stateChangeTypes.itemMouseEnter,\n })\n\n // We never want to manually scroll when changing state based\n // on `onMouseMove` because we will be moving the element out\n // from under the user which is currently scrolling/moving the\n // cursor\n this.avoidScrolling = true\n this.internalSetTimeout(() => (this.avoidScrolling = false), 250)\n }),\n onMouseDown: callAllEventHandlers(onMouseDown, event => {\n // This prevents the activeElement from being changed\n // to the item so it can remain with the current activeElement\n // which is a more common use case.\n event.preventDefault()\n }),\n [onSelectKey]: callAllEventHandlers(customClickHandler, () => {\n this.selectItemAtIndex(index, {\n type: stateChangeTypes.clickItem,\n })\n }),\n }\n\n // Passing down the onMouseDown handler to prevent redirect\n // of the activeElement if clicking on disabled items\n const eventHandlers = rest.disabled\n ? {onMouseDown: enabledEventHandlers.onMouseDown}\n : enabledEventHandlers\n\n return {\n id: this.getItemId(index),\n role: 'option',\n 'aria-selected': this.getState().highlightedIndex === index,\n ...eventHandlers,\n ...rest,\n }\n }\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM\n\n clearItems = () => {\n this.items = []\n }\n\n reset = (otherStateToSet = {}, cb) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState(\n ({selectedItem}) => ({\n isOpen: this.props.defaultIsOpen,\n highlightedIndex: this.props.defaultHighlightedIndex,\n inputValue: this.props.itemToString(selectedItem),\n ...otherStateToSet,\n }),\n cb,\n )\n }\n\n toggleMenu = (otherStateToSet = {}, cb) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState(\n ({isOpen}) => {\n return {\n isOpen: !isOpen,\n ...(isOpen && {\n highlightedIndex: this.props.defaultHighlightedIndex,\n }),\n ...otherStateToSet,\n }\n },\n () => {\n const {isOpen, highlightedIndex} = this.getState()\n if (isOpen) {\n if (this.getItemCount() > 0 && typeof highlightedIndex === 'number') {\n this.setHighlightedIndex(highlightedIndex, otherStateToSet)\n }\n }\n cbToCb(cb)()\n },\n )\n }\n\n openMenu = cb => {\n this.internalSetState({isOpen: true}, cb)\n }\n\n closeMenu = cb => {\n this.internalSetState({isOpen: false}, cb)\n }\n\n updateStatus = debounce(() => {\n const state = this.getState()\n const item = this.items[state.highlightedIndex]\n const resultCount = this.getItemCount()\n const status = this.props.getA11yStatusMessage({\n itemToString: this.props.itemToString,\n previousResultCount: this.previousResultCount,\n resultCount,\n highlightedItem: item,\n ...state,\n })\n this.previousResultCount = resultCount\n\n setA11yStatus(status, this.props.environment.document)\n }, 200)\n\n componentDidMount() {\n /* istanbul ignore if (react-native) */\n if (\n process.env.NODE_ENV !== 'production' &&\n !isReactNative &&\n this.getMenuProps.called &&\n !this.getMenuProps.suppressRefError\n ) {\n validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps)\n }\n\n /* istanbul ignore if (react-native) */\n if (isReactNative) {\n this.cleanup = () => {\n this.internalClearTimeouts()\n }\n } else {\n // this.isMouseDown helps us track whether the mouse is currently held down.\n // This is useful when the user clicks on an item in the list, but holds the mouse\n // down long enough for the list to disappear (because the blur event fires on the input)\n // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should\n // trigger hiding the menu.\n const onMouseDown = () => {\n this.isMouseDown = true\n }\n const onMouseUp = event => {\n this.isMouseDown = false\n // if the target element or the activeElement is within a downshift node\n // then we don't want to reset downshift\n const contextWithinDownshift = targetWithinDownshift(\n event.target,\n [this._rootNode, this._menuNode],\n this.props.environment.document,\n )\n if (!contextWithinDownshift && this.getState().isOpen) {\n this.reset({type: stateChangeTypes.mouseUp}, () =>\n this.props.onOuterClick(this.getStateAndHelpers()),\n )\n }\n }\n // Touching an element in iOS gives focus and hover states, but touching out of\n // the element will remove hover, and persist the focus state, resulting in the\n // blur event not being triggered.\n // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen.\n // If the user taps outside of Downshift, the component should be reset,\n // but not if the user is swiping\n const onTouchStart = () => {\n this.isTouchMove = false\n }\n\n const onTouchMove = () => {\n this.isTouchMove = true\n }\n\n const onTouchEnd = event => {\n const contextWithinDownshift = targetWithinDownshift(\n event.target,\n [this._rootNode, this._menuNode],\n this.props.environment.document,\n false,\n )\n if (\n !this.isTouchMove &&\n !contextWithinDownshift &&\n this.getState().isOpen\n ) {\n this.reset({type: stateChangeTypes.touchEnd}, () =>\n this.props.onOuterClick(this.getStateAndHelpers()),\n )\n }\n }\n const {environment} = this.props\n\n environment.addEventListener('mousedown', onMouseDown)\n environment.addEventListener('mouseup', onMouseUp)\n environment.addEventListener('touchstart', onTouchStart)\n environment.addEventListener('touchmove', onTouchMove)\n environment.addEventListener('touchend', onTouchEnd)\n\n this.cleanup = () => {\n this.internalClearTimeouts()\n this.updateStatus.cancel()\n environment.removeEventListener('mousedown', onMouseDown)\n environment.removeEventListener('mouseup', onMouseUp)\n environment.removeEventListener('touchstart', onTouchStart)\n environment.removeEventListener('touchmove', onTouchMove)\n environment.removeEventListener('touchend', onTouchEnd)\n }\n }\n }\n\n shouldScroll(prevState, prevProps) {\n const {highlightedIndex: currentHighlightedIndex} =\n this.props.highlightedIndex === undefined ? this.getState() : this.props\n const {highlightedIndex: prevHighlightedIndex} =\n prevProps.highlightedIndex === undefined ? prevState : prevProps\n const scrollWhenOpen =\n currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen\n const scrollWhenNavigating =\n currentHighlightedIndex !== prevHighlightedIndex\n\n return scrollWhenOpen || scrollWhenNavigating\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (process.env.NODE_ENV !== 'production') {\n validateControlledUnchanged(this.state, prevProps, this.props)\n /* istanbul ignore if (react-native) */\n if (\n !isReactNative &&\n this.getMenuProps.called &&\n !this.getMenuProps.suppressRefError\n ) {\n validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps)\n }\n }\n\n if (\n isControlledProp(this.props, 'selectedItem') &&\n this.props.selectedItemChanged(\n prevProps.selectedItem,\n this.props.selectedItem,\n )\n ) {\n this.internalSetState({\n type: stateChangeTypes.controlledPropUpdatedSelectedItem,\n inputValue: this.props.itemToString(this.props.selectedItem),\n })\n }\n\n if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) {\n this.scrollHighlightedItemIntoView()\n }\n\n /* istanbul ignore else (react-native) */\n if (!isReactNative) {\n this.updateStatus()\n }\n }\n\n componentWillUnmount() {\n this.cleanup() // avoids memory leak\n }\n\n render() {\n const children = unwrapArray(this.props.children, noop)\n // because the items are rerendered every time we call the children\n // we clear this out each render and it will be populated again as\n // getItemProps is called.\n this.clearItems()\n // we reset this so we know whether the user calls getRootProps during\n // this render. If they do then we don't need to do anything,\n // if they don't then we need to clone the element they return and\n // apply the props for them.\n this.getRootProps.called = false\n this.getRootProps.refKey = undefined\n this.getRootProps.suppressRefError = undefined\n // we do something similar for getMenuProps\n this.getMenuProps.called = false\n this.getMenuProps.refKey = undefined\n this.getMenuProps.suppressRefError = undefined\n // we do something similar for getLabelProps\n this.getLabelProps.called = false\n // and something similar for getInputProps\n this.getInputProps.called = false\n const element = unwrapArray(children(this.getStateAndHelpers()))\n if (!element) {\n return null\n }\n\n if (this.getRootProps.called || this.props.suppressRefError) {\n if (\n process.env.NODE_ENV !== 'production' &&\n !this.getRootProps.suppressRefError &&\n !this.props.suppressRefError\n ) {\n validateGetRootPropsCalledCorrectly(element, this.getRootProps)\n }\n return element\n } else if (isDOMElement(element)) {\n // they didn't apply the root props, but we can clone\n // this and apply the props ourselves\n return cloneElement(element, this.getRootProps(getElementProps(element)))\n }\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n // they didn't apply the root props, but they need to\n // otherwise we can't query around the autocomplete\n\n throw new Error(\n 'downshift: If you return a non-DOM element, you must apply the getRootProps function',\n )\n }\n\n /* istanbul ignore next */\n return undefined\n }\n}\n\nexport default Downshift\n\nfunction validateGetMenuPropsCalledCorrectly(node, {refKey}) {\n if (!node) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: The ref prop \"${refKey}\" from getMenuProps was not applied correctly on your menu element.`,\n )\n }\n}\n\nfunction validateGetRootPropsCalledCorrectly(element, {refKey}) {\n const refKeySpecified = refKey !== 'ref'\n const isComposite = !isDOMElement(element)\n if (isComposite && !refKeySpecified && !isForwardRef(element)) {\n // eslint-disable-next-line no-console\n console.error(\n 'downshift: You returned a non-DOM element. You must specify a refKey in getRootProps',\n )\n } else if (!isComposite && refKeySpecified) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \"${refKey}\"`,\n )\n }\n if (!isForwardRef(element) && !getElementProps(element)[refKey]) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: You must apply the ref prop \"${refKey}\" from getRootProps onto your root element.`,\n )\n }\n}\n","import PropTypes from 'prop-types'\nimport {useRef, useCallback, useReducer, useEffect} from 'react'\nimport {\n scrollIntoView,\n getNextWrappingIndex,\n getState,\n generateId,\n debounce,\n targetWithinDownshift,\n} from '../utils'\nimport setStatus from '../set-a11y-status'\n\nconst dropdownDefaultStateValues = {\n highlightedIndex: -1,\n isOpen: false,\n selectedItem: null,\n inputValue: '',\n}\n\nfunction callOnChangeProps(action, state, newState) {\n const {props, type} = action\n const changes = {}\n\n Object.keys(state).forEach(key => {\n invokeOnChangeHandler(key, props, state, newState)\n\n if (newState[key] !== state[key]) {\n changes[key] = newState[key]\n }\n })\n\n if (props.onStateChange && Object.keys(changes).length) {\n props.onStateChange({type, ...changes})\n }\n}\n\nfunction invokeOnChangeHandler(key, props, state, newState) {\n const handler = `on${capitalizeString(key)}Change`\n if (\n props[handler] &&\n newState[key] !== undefined &&\n newState[key] !== state[key]\n ) {\n props[handler](newState)\n }\n}\n\n/**\n * Default state reducer that returns the changes.\n *\n * @param {Object} s state.\n * @param {Object} a action with changes.\n * @returns {Object} changes.\n */\nfunction stateReducer(s, a) {\n return a.changes\n}\n\n/**\n * Returns a message to be added to aria-live region when item is selected.\n *\n * @param {Object} selectionParameters Parameters required to build the message.\n * @returns {string} The a11y message.\n */\nfunction getA11ySelectionMessage(selectionParameters) {\n const {selectedItem, itemToString: itemToStringLocal} = selectionParameters\n\n return selectedItem\n ? `${itemToStringLocal(selectedItem)} has been selected.`\n : ''\n}\n\n/**\n * Debounced call for updating the a11y message.\n */\nexport const updateA11yStatus = debounce((getA11yMessage, document) => {\n setStatus(getA11yMessage(), document)\n}, 200)\n\nexport function getElementIds({\n id,\n labelId,\n menuId,\n getItemId,\n toggleButtonId,\n}) {\n const uniqueId = id === undefined ? `downshift-${generateId()}` : id\n\n return {\n labelId: labelId || `${uniqueId}-label`,\n menuId: menuId || `${uniqueId}-menu`,\n getItemId: getItemId || (index => `${uniqueId}-item-${index}`),\n toggleButtonId: toggleButtonId || `${uniqueId}-toggle-button`,\n }\n}\n\nexport function getItemIndex(index, item, items) {\n if (index !== undefined) {\n return index\n }\n if (items.length === 0) {\n return -1\n }\n return items.indexOf(item)\n}\n\nfunction itemToString(item) {\n return item ? String(item) : ''\n}\n\nexport function getPropTypesValidator(caller, propTypes) {\n // istanbul ignore next\n return function validate(options = {}) {\n Object.keys(propTypes).forEach(key => {\n PropTypes.checkPropTypes(propTypes, options, key, caller.name)\n })\n }\n}\n\nexport function isAcceptedCharacterKey(key) {\n return /^\\S{1}$/.test(key)\n}\n\nexport function capitalizeString(string) {\n return `${string.slice(0, 1).toUpperCase()}${string.slice(1)}`\n}\n\nexport function useLatestRef(val) {\n const ref = useRef(val)\n // technically this is not \"concurrent mode safe\" because we're manipulating\n // the value during render (so it's not idempotent). However, the places this\n // hook is used is to support memoizing callbacks which will be called\n // *during* render, so we need the latest values *during* render.\n // If not for this, then we'd probably want to use useLayoutEffect instead.\n ref.current = val\n return ref\n}\n\n/**\n * Computes the controlled state using a the previous state, props,\n * two reducers, one from downshift and an optional one from the user.\n * Also calls the onChange handlers for state values that have changed.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nexport function useEnhancedReducer(reducer, initialState, props, isStateEqual) {\n const prevStateRef = useRef()\n const actionRef = useRef()\n const enhancedReducer = useCallback(\n (state, action) => {\n actionRef.current = action\n state = getState(state, action.props)\n\n const changes = reducer(state, action)\n const newState = action.props.stateReducer(state, {...action, changes})\n\n return newState\n },\n [reducer],\n )\n const [state, dispatch] = useReducer(enhancedReducer, initialState)\n const propsRef = useLatestRef(props)\n const dispatchWithProps = useCallback(\n action => dispatch({props: propsRef.current, ...action}),\n [propsRef],\n )\n const action = actionRef.current\n\n useEffect(() => {\n const shouldCallOnChangeProps =\n action &&\n prevStateRef.current &&\n !isStateEqual(prevStateRef.current, state)\n\n if (shouldCallOnChangeProps) {\n callOnChangeProps(\n action,\n getState(prevStateRef.current, action.props),\n state,\n )\n }\n\n prevStateRef.current = state\n }, [state, action, isStateEqual])\n\n return [state, dispatchWithProps]\n}\n\n/**\n * Wraps the useEnhancedReducer and applies the controlled prop values before\n * returning the new state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nexport function useControlledReducer(reducer, initialState, props, isStateEqual) {\n const [state, dispatch] = useEnhancedReducer(reducer, initialState, props, isStateEqual)\n\n return [getState(state, props), dispatch]\n}\n\nexport const defaultProps = {\n itemToString,\n stateReducer,\n getA11ySelectionMessage,\n scrollIntoView,\n circularNavigation: false,\n environment:\n typeof window === 'undefined' /* istanbul ignore next (ssr) */\n ? {}\n : window,\n}\n\nexport function getDefaultValue(\n props,\n propKey,\n defaultStateValues = dropdownDefaultStateValues,\n) {\n const defaultPropKey = `default${capitalizeString(propKey)}`\n\n if (defaultPropKey in props) {\n return props[defaultPropKey]\n }\n\n return defaultStateValues[propKey]\n}\n\nexport function getInitialValue(\n props,\n propKey,\n defaultStateValues = dropdownDefaultStateValues,\n) {\n if (propKey in props) {\n return props[propKey]\n }\n\n const initialPropKey = `initial${capitalizeString(propKey)}`\n\n if (initialPropKey in props) {\n return props[initialPropKey]\n }\n return getDefaultValue(props, propKey, defaultStateValues)\n}\n\nexport function getInitialState(props) {\n const selectedItem = getInitialValue(props, 'selectedItem')\n const isOpen = getInitialValue(props, 'isOpen')\n const highlightedIndex = getInitialValue(props, 'highlightedIndex')\n const inputValue = getInitialValue(props, 'inputValue')\n\n return {\n highlightedIndex:\n highlightedIndex < 0 && selectedItem\n ? props.items.indexOf(selectedItem)\n : highlightedIndex,\n isOpen,\n selectedItem,\n inputValue,\n }\n}\n\nexport function getHighlightedIndexOnOpen(\n props,\n state,\n offset,\n getItemNodeFromIndex,\n) {\n const {items, initialHighlightedIndex, defaultHighlightedIndex} = props\n const {selectedItem, highlightedIndex} = state\n\n if (items.length === 0) {\n return -1\n }\n\n // initialHighlightedIndex will give value to highlightedIndex on initial state only.\n if (\n initialHighlightedIndex !== undefined &&\n highlightedIndex === initialHighlightedIndex\n ) {\n return initialHighlightedIndex\n }\n if (defaultHighlightedIndex !== undefined) {\n return defaultHighlightedIndex\n }\n if (selectedItem) {\n if (offset === 0) {\n return items.indexOf(selectedItem)\n }\n return getNextWrappingIndex(\n offset,\n items.indexOf(selectedItem),\n items.length,\n getItemNodeFromIndex,\n false,\n )\n }\n if (offset === 0) {\n return -1\n }\n return offset < 0 ? items.length - 1 : 0\n}\n\n/**\n * Reuse the movement tracking of mouse and touch events.\n *\n * @param {boolean} isOpen Whether the dropdown is open or not.\n * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.)\n * @param {Object} environment Environment where component/hook exists.\n * @param {Function} handleBlur Handler on blur from mouse or touch.\n * @returns {Object} Ref containing whether mouseDown or touchMove event is happening\n */\nexport function useMouseAndTouchTracker(\n isOpen,\n downshiftElementRefs,\n environment,\n handleBlur,\n) {\n const mouseAndTouchTrackersRef = useRef({\n isMouseDown: false,\n isTouchMove: false,\n })\n\n useEffect(() => {\n // The same strategy for checking if a click occurred inside or outside downsift\n // as in downshift.js.\n const onMouseDown = () => {\n mouseAndTouchTrackersRef.current.isMouseDown = true\n }\n const onMouseUp = event => {\n mouseAndTouchTrackersRef.current.isMouseDown = false\n if (\n isOpen &&\n !targetWithinDownshift(\n event.target,\n downshiftElementRefs.map(ref => ref.current),\n environment.document,\n )\n ) {\n handleBlur()\n }\n }\n const onTouchStart = () => {\n mouseAndTouchTrackersRef.current.isTouchMove = false\n }\n const onTouchMove = () => {\n mouseAndTouchTrackersRef.current.isTouchMove = true\n }\n const onTouchEnd = event => {\n if (\n isOpen &&\n !mouseAndTouchTrackersRef.current.isTouchMove &&\n !targetWithinDownshift(\n event.target,\n downshiftElementRefs.map(ref => ref.current),\n environment.document,\n false,\n )\n ) {\n handleBlur()\n }\n }\n\n environment.addEventListener('mousedown', onMouseDown)\n environment.addEventListener('mouseup', onMouseUp)\n environment.addEventListener('touchstart', onTouchStart)\n environment.addEventListener('touchmove', onTouchMove)\n environment.addEventListener('touchend', onTouchEnd)\n\n return function cleanup() {\n environment.removeEventListener('mousedown', onMouseDown)\n environment.removeEventListener('mouseup', onMouseUp)\n environment.removeEventListener('touchstart', onTouchStart)\n environment.removeEventListener('touchmove', onTouchMove)\n environment.removeEventListener('touchend', onTouchEnd)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, environment])\n\n return mouseAndTouchTrackersRef\n}\n\n/**\n * Custom hook that checks if getter props are called correctly.\n *\n * @param {...any} propKeys Getter prop names to be handled.\n * @returns {Function} Setter function called inside getter props to set call information.\n */\nexport function useGetterPropsCalledChecker(...propKeys) {\n const getterPropsCalledRef = useRef(\n propKeys.reduce((acc, propKey) => {\n acc[propKey] = {}\n return acc\n }, {}),\n )\n\n if (process.env.NODE_ENV !== 'production') {\n Object.keys(getterPropsCalledRef.current).forEach(propKey => {\n getterPropsCalledRef.current[propKey] = null\n })\n }\n\n useEffect(() => {\n if (process.env.NODE_ENV !== 'production') {\n Object.keys(getterPropsCalledRef.current).forEach(propKey => {\n if (!getterPropsCalledRef.current[propKey]) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: You forgot to call the ${propKey} getter function on your component / element.`,\n )\n return\n }\n\n const {\n suppressRefError,\n refKey,\n elementRef,\n } = getterPropsCalledRef.current[propKey]\n\n if ((!elementRef || !elementRef.current) && !suppressRefError) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: The ref prop \"${refKey}\" from ${propKey} was not applied correctly on your element.`,\n )\n }\n })\n }\n })\n\n const setGetterPropCallInfo = useCallback(\n (propKey, suppressRefError, refKey, elementRef) => {\n if (process.env.NODE_ENV !== 'production') {\n getterPropsCalledRef.current[propKey] = {\n suppressRefError,\n refKey,\n elementRef,\n }\n }\n },\n [],\n )\n\n return setGetterPropCallInfo\n}\n\n/**\n * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item.\n * Used by useSelect and useCombobox.\n *\n * @param {Object} prevState\n * @param {Object} newState\n * @returns {boolean} Wheather the states are deeply equal.\n */\n export function isDropdownsStateEqual(prevState, newState) {\n return (\n prevState.isOpen === newState.isOpen &&\n prevState.inputValue === newState.inputValue &&\n prevState.highlightedIndex === newState.highlightedIndex &&\n prevState.selectedItem === newState.selectedItem\n )\n}\n","import PropTypes from 'prop-types'\nimport {defaultProps as commonDefaultProps} from '../utils'\n\nfunction getItemIndexByCharacterKey(\n keysSoFar,\n highlightedIndex,\n items,\n itemToStringParam,\n getItemNodeFromIndex,\n) {\n const lowerCasedItemStrings = items.map(item =>\n itemToStringParam(item).toLowerCase(),\n )\n const lowerCasedKeysSoFar = keysSoFar.toLowerCase()\n const isValid = (itemString, index) => {\n const element = getItemNodeFromIndex(index)\n\n return (\n itemString.startsWith(lowerCasedKeysSoFar) &&\n !(element && element.hasAttribute('disabled'))\n )\n }\n\n for (\n let index = highlightedIndex + 1;\n index < lowerCasedItemStrings.length;\n index++\n ) {\n const itemString = lowerCasedItemStrings[index]\n\n if (isValid(itemString, index)) {\n return index\n }\n }\n\n for (let index = 0; index < highlightedIndex; index++) {\n const itemString = lowerCasedItemStrings[index]\n\n if (isValid(itemString, index)) {\n return index\n }\n }\n\n return highlightedIndex\n}\n\nconst propTypes = {\n items: PropTypes.array.isRequired,\n itemToString: PropTypes.func,\n getA11yStatusMessage: PropTypes.func,\n getA11ySelectionMessage: PropTypes.func,\n circularNavigation: PropTypes.bool,\n highlightedIndex: PropTypes.number,\n defaultHighlightedIndex: PropTypes.number,\n initialHighlightedIndex: PropTypes.number,\n isOpen: PropTypes.bool,\n defaultIsOpen: PropTypes.bool,\n initialIsOpen: PropTypes.bool,\n selectedItem: PropTypes.any,\n initialSelectedItem: PropTypes.any,\n defaultSelectedItem: PropTypes.any,\n id: PropTypes.string,\n labelId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n toggleButtonId: PropTypes.string,\n stateReducer: PropTypes.func,\n onSelectedItemChange: PropTypes.func,\n onHighlightedIndexChange: PropTypes.func,\n onStateChange: PropTypes.func,\n onIsOpenChange: PropTypes.func,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n}\n\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specift if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\nfunction getA11yStatusMessage({isOpen, resultCount, previousResultCount}) {\n if (!isOpen) {\n return ''\n }\n\n if (!resultCount) {\n return 'No results are available.'\n }\n\n if (resultCount !== previousResultCount) {\n return `${resultCount} result${\n resultCount === 1 ? ' is' : 's are'\n } available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select.`\n }\n \n return ''\n}\n\nconst defaultProps = {\n ...commonDefaultProps,\n getA11yStatusMessage,\n}\n\nexport {propTypes, getItemIndexByCharacterKey, defaultProps}\n","import productionEnum from '../../productionEnum.macro'\n\nexport const MenuKeyDownArrowDown = productionEnum(\n '__menu_keydown_arrow_down__',\n)\nexport const MenuKeyDownArrowUp = productionEnum('__menu_keydown_arrow_up__')\nexport const MenuKeyDownEscape = productionEnum('__menu_keydown_escape__')\nexport const MenuKeyDownHome = productionEnum('__menu_keydown_home__')\nexport const MenuKeyDownEnd = productionEnum('__menu_keydown_end__')\nexport const MenuKeyDownEnter = productionEnum('__menu_keydown_enter__')\nexport const MenuKeyDownSpaceButton = productionEnum(\n '__menu_keydown_space_button__',\n)\nexport const MenuKeyDownCharacter = productionEnum('__menu_keydown_character__')\nexport const MenuBlur = productionEnum('__menu_blur__')\nexport const MenuMouseLeave = productionEnum('__menu_mouse_leave__')\n\nexport const ItemMouseMove = productionEnum('__item_mouse_move__')\nexport const ItemClick = productionEnum('__item_click__')\n\nexport const ToggleButtonClick = productionEnum('__togglebutton_click__')\nexport const ToggleButtonKeyDownArrowDown = productionEnum(\n '__togglebutton_keydown_arrow_down__',\n)\nexport const ToggleButtonKeyDownArrowUp = productionEnum(\n '__togglebutton_keydown_arrow_up__',\n)\nexport const ToggleButtonKeyDownCharacter = productionEnum(\n '__togglebutton_keydown_character__',\n)\n\nexport const FunctionToggleMenu = productionEnum('__function_toggle_menu__')\nexport const FunctionOpenMenu = productionEnum('__function_open_menu__')\nexport const FunctionCloseMenu = productionEnum('__function_close_menu__')\nexport const FunctionSetHighlightedIndex = productionEnum(\n '__function_set_highlighted_index__',\n)\nexport const FunctionSelectItem = productionEnum('__function_select_item__')\nexport const FunctionSetInputValue = productionEnum(\n '__function_set_input_value__',\n)\nexport const FunctionReset = productionEnum('__function_reset__')\n","import {getNextWrappingIndex, getNextNonDisabledIndex} from '../../utils'\nimport {getHighlightedIndexOnOpen, getDefaultValue} from '../utils'\nimport {getItemIndexByCharacterKey} from './utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\n/* eslint-disable complexity */\nexport default function downshiftSelectReducer(state, action) {\n const {type, props, shiftKey} = action\n let changes\n\n switch (type) {\n case stateChangeTypes.ItemMouseMove:\n changes = {\n highlightedIndex: action.index,\n }\n\n break\n case stateChangeTypes.ItemClick:\n changes = {\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n selectedItem: props.items[action.index],\n }\n\n break\n case stateChangeTypes.ToggleButtonKeyDownCharacter:\n {\n const lowercasedKey = action.key\n const inputValue = `${state.inputValue}${lowercasedKey}`\n const itemIndex = getItemIndexByCharacterKey(\n inputValue,\n state.selectedItem ? props.items.indexOf(state.selectedItem) : -1,\n props.items,\n props.itemToString,\n action.getItemNodeFromIndex,\n )\n\n changes = {\n inputValue,\n ...(itemIndex >= 0 && {\n selectedItem: props.items[itemIndex],\n }),\n }\n }\n\n break\n case stateChangeTypes.ToggleButtonKeyDownArrowDown:\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n 1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n\n break\n case stateChangeTypes.ToggleButtonKeyDownArrowUp:\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n -1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n\n break\n case stateChangeTypes.MenuKeyDownEnter:\n case stateChangeTypes.MenuKeyDownSpaceButton:\n changes = {\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n ...(state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n }),\n }\n\n break\n case stateChangeTypes.MenuKeyDownHome:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n 1,\n 0,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n\n break\n case stateChangeTypes.MenuKeyDownEnd:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n -1,\n props.items.length - 1,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n\n break\n case stateChangeTypes.MenuKeyDownEscape:\n changes = {\n isOpen: false,\n highlightedIndex: -1,\n }\n\n break\n case stateChangeTypes.MenuBlur:\n changes = {\n isOpen: false,\n highlightedIndex: -1,\n }\n\n break\n case stateChangeTypes.MenuKeyDownCharacter:\n {\n const lowercasedKey = action.key\n const inputValue = `${state.inputValue}${lowercasedKey}`\n const highlightedIndex = getItemIndexByCharacterKey(\n inputValue,\n state.highlightedIndex,\n props.items,\n props.itemToString,\n action.getItemNodeFromIndex,\n )\n\n changes = {\n inputValue,\n ...(highlightedIndex >= 0 && {\n highlightedIndex,\n }),\n }\n }\n break\n case stateChangeTypes.MenuKeyDownArrowDown:\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? 5 : 1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n\n break\n case stateChangeTypes.MenuKeyDownArrowUp:\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? -5 : -1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n\n break\n case stateChangeTypes.MenuMouseLeave:\n changes = {\n highlightedIndex: -1,\n }\n\n break\n case stateChangeTypes.ToggleButtonClick:\n case stateChangeTypes.FunctionToggleMenu:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen\n ? -1\n : getHighlightedIndexOnOpen(props, state, 0),\n }\n\n break\n case stateChangeTypes.FunctionOpenMenu:\n changes = {\n isOpen: true,\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 0),\n }\n\n break\n case stateChangeTypes.FunctionCloseMenu:\n changes = {\n isOpen: false,\n }\n\n break\n case stateChangeTypes.FunctionSetHighlightedIndex:\n changes = {\n highlightedIndex: action.highlightedIndex,\n }\n\n break\n case stateChangeTypes.FunctionSelectItem:\n changes = {\n selectedItem: action.selectedItem,\n }\n\n break\n case stateChangeTypes.FunctionSetInputValue:\n changes = {\n inputValue: action.inputValue,\n }\n\n break\n case stateChangeTypes.FunctionReset:\n changes = {\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n isOpen: getDefaultValue(props, 'isOpen'),\n selectedItem: getDefaultValue(props, 'selectedItem'),\n inputValue: getDefaultValue(props, 'inputValue'),\n }\n\n break\n default:\n throw new Error('Reducer called without proper action type.')\n }\n\n return {\n ...state,\n ...changes,\n }\n}\n/* eslint-enable complexity */\n","/* eslint-disable max-statements */\nimport {useRef, useEffect, useCallback, useMemo} from 'react'\nimport {\n getElementIds,\n getItemIndex,\n getPropTypesValidator,\n isAcceptedCharacterKey,\n useControlledReducer,\n getInitialState,\n updateA11yStatus,\n useMouseAndTouchTracker,\n useGetterPropsCalledChecker,\n useLatestRef,\n isDropdownsStateEqual\n} from '../utils'\nimport {\n callAllEventHandlers,\n handleRefs,\n debounce,\n normalizeArrowKey,\n validateControlledUnchanged,\n} from '../../utils'\nimport downshiftSelectReducer from './reducer'\nimport {propTypes, defaultProps} from './utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\nconst validatePropTypes =\n process.env.NODE_ENV === 'production'\n ? /* istanbul ignore next */ null\n : getPropTypesValidator(useSelect, propTypes)\n\nuseSelect.stateChangeTypes = stateChangeTypes\n\nfunction useSelect(userProps = {}) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n validatePropTypes(userProps)\n }\n // Props defaults and destructuring.\n const props = {\n ...defaultProps,\n ...userProps,\n }\n const {\n items,\n scrollIntoView,\n environment,\n initialIsOpen,\n defaultIsOpen,\n itemToString,\n getA11ySelectionMessage,\n getA11yStatusMessage,\n } = props\n // Initial state depending on controlled props.\n const initialState = getInitialState(props)\n const [state, dispatch] = useControlledReducer(\n downshiftSelectReducer,\n initialState,\n props,\n isDropdownsStateEqual\n )\n const {isOpen, highlightedIndex, selectedItem, inputValue} = state\n\n // Element efs.\n const toggleButtonRef = useRef(null)\n const menuRef = useRef(null)\n const itemRefs = useRef()\n itemRefs.current = {}\n // used not to scroll when highlight by mouse.\n const shouldScrollRef = useRef(true)\n // used not to trigger menu blur action in some scenarios.\n const shouldBlurRef = useRef(true)\n // used to keep the inputValue clearTimeout object between renders.\n const clearTimeoutRef = useRef(null)\n // prevent id re-generation between renders.\n const elementIdsRef = useRef(getElementIds(props))\n // used to keep track of how many items we had on previous cycle.\n const previousResultCountRef = useRef()\n const isInitialMountRef = useRef(true)\n // used for checking when props are moving from controlled to uncontrolled.\n const prevPropsRef = useRef(props)\n // utility callback to get item element.\n const latest = useLatestRef({\n state,\n props,\n })\n\n // Some utils.\n const getItemNodeFromIndex = index =>\n itemRefs.current[elementIdsRef.current.getItemId(index)]\n\n // Effects.\n // Sets a11y status message on changes in state.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11yStatusMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, highlightedIndex, inputValue, items])\n // Sets a11y status message on changes in selectedItem.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11ySelectionMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItem])\n // Sets cleanup for the keysSoFar after 500ms.\n useEffect(() => {\n // init the clean function here as we need access to dispatch.\n if (isInitialMountRef.current) {\n clearTimeoutRef.current = debounce(outerDispatch => {\n outerDispatch({\n type: stateChangeTypes.FunctionSetInputValue,\n inputValue: '',\n })\n }, 500)\n }\n\n if (!inputValue) {\n return\n }\n clearTimeoutRef.current(dispatch)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [inputValue])\n /* Controls the focus on the menu or the toggle button. */\n useEffect(() => {\n // Don't focus menu on first render.\n if (isInitialMountRef.current) {\n // Unless it was initialised as open.\n if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) {\n menuRef.current.focus()\n }\n return\n }\n // Focus menu on open.\n if (isOpen) {\n // istanbul ignore else\n if (menuRef.current) {\n menuRef.current.focus()\n }\n return\n }\n // Focus toggleButton on close, but not if it was closed with (Shift+)Tab.\n if (environment.document.activeElement === menuRef.current) {\n // istanbul ignore else\n if (toggleButtonRef.current) {\n shouldBlurRef.current = false\n toggleButtonRef.current.focus()\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen])\n // Scroll on highlighted item if change comes from keyboard.\n useEffect(() => {\n if (\n highlightedIndex < 0 ||\n !isOpen ||\n !Object.keys(itemRefs.current).length\n ) {\n return\n }\n if (shouldScrollRef.current === false) {\n shouldScrollRef.current = true\n } else {\n scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex])\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n previousResultCountRef.current = items.length\n })\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n validateControlledUnchanged(state, prevPropsRef.current, props)\n prevPropsRef.current = props\n }, [state, props])\n // Add mouse/touch events to document.\n const mouseAndTouchTrackersRef = useMouseAndTouchTracker(\n isOpen,\n [menuRef, toggleButtonRef],\n environment,\n () => {\n dispatch({\n type: stateChangeTypes.MenuBlur,\n })\n },\n )\n const setGetterPropCallInfo = useGetterPropsCalledChecker(\n 'getMenuProps',\n 'getToggleButtonProps',\n )\n // Make initial ref false.\n useEffect(() => {\n isInitialMountRef.current = false\n }, [])\n\n // Event handler functions.\n const toggleButtonKeyDownHandlers = useMemo(\n () => ({\n ArrowDown(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.ToggleButtonKeyDownArrowDown,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n ArrowUp(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.ToggleButtonKeyDownArrowUp,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n }),\n [dispatch],\n )\n const menuKeyDownHandlers = useMemo(\n () => ({\n ArrowDown(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownArrowDown,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n ArrowUp(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownArrowUp,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n Home(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownHome,\n getItemNodeFromIndex,\n })\n },\n End(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownEnd,\n getItemNodeFromIndex,\n })\n },\n Escape() {\n dispatch({\n type: stateChangeTypes.MenuKeyDownEscape,\n })\n },\n Enter(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownEnter,\n })\n },\n ' '(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownSpaceButton,\n })\n },\n }),\n [dispatch],\n )\n\n // Action functions.\n const toggleMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionToggleMenu,\n })\n }, [dispatch])\n const closeMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionCloseMenu,\n })\n }, [dispatch])\n const openMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionOpenMenu,\n })\n }, [dispatch])\n const setHighlightedIndex = useCallback(\n newHighlightedIndex => {\n dispatch({\n type: stateChangeTypes.FunctionSetHighlightedIndex,\n highlightedIndex: newHighlightedIndex,\n })\n },\n [dispatch],\n )\n const selectItem = useCallback(\n newSelectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionSelectItem,\n selectedItem: newSelectedItem,\n })\n },\n [dispatch],\n )\n const reset = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionReset,\n })\n }, [dispatch])\n const setInputValue = useCallback(\n newInputValue => {\n dispatch({\n type: stateChangeTypes.FunctionSetInputValue,\n inputValue: newInputValue,\n })\n },\n [dispatch],\n )\n // Getter functions.\n const getLabelProps = useCallback(\n labelProps => ({\n id: elementIdsRef.current.labelId,\n htmlFor: elementIdsRef.current.toggleButtonId,\n ...labelProps,\n }),\n [],\n )\n const getMenuProps = useCallback(\n (\n {onMouseLeave, refKey = 'ref', onKeyDown, onBlur, ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n const latestState = latest.current.state\n const menuHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && menuKeyDownHandlers[key]) {\n menuKeyDownHandlers[key](event)\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: stateChangeTypes.MenuKeyDownCharacter,\n key,\n getItemNodeFromIndex,\n })\n }\n }\n const menuHandleBlur = () => {\n // if the blur was a result of selection, we don't trigger this action.\n if (shouldBlurRef.current === false) {\n shouldBlurRef.current = true\n return\n }\n\n const shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown\n /* istanbul ignore else */\n if (shouldBlur) {\n dispatch({type: stateChangeTypes.MenuBlur})\n }\n }\n const menuHandleMouseLeave = () => {\n dispatch({\n type: stateChangeTypes.MenuMouseLeave,\n })\n }\n\n setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef)\n\n return {\n [refKey]: handleRefs(ref, menuNode => {\n menuRef.current = menuNode\n }),\n id: elementIdsRef.current.menuId,\n role: 'listbox',\n 'aria-labelledby': elementIdsRef.current.labelId,\n tabIndex: -1,\n ...(latestState.isOpen &&\n latestState.highlightedIndex > -1 && {\n 'aria-activedescendant': elementIdsRef.current.getItemId(\n latestState.highlightedIndex,\n ),\n }),\n onMouseLeave: callAllEventHandlers(onMouseLeave, menuHandleMouseLeave),\n onKeyDown: callAllEventHandlers(onKeyDown, menuHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, menuHandleBlur),\n ...rest,\n }\n },\n [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo],\n )\n const getToggleButtonProps = useCallback(\n (\n {onClick, onKeyDown, refKey = 'ref', ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n const toggleButtonHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ToggleButtonClick,\n })\n }\n const toggleButtonHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && toggleButtonKeyDownHandlers[key]) {\n toggleButtonKeyDownHandlers[key](event)\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: stateChangeTypes.ToggleButtonKeyDownCharacter,\n key,\n getItemNodeFromIndex,\n })\n }\n }\n const toggleProps = {\n [refKey]: handleRefs(ref, toggleButtonNode => {\n toggleButtonRef.current = toggleButtonNode\n }),\n id: elementIdsRef.current.toggleButtonId,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': latest.current.state.isOpen,\n 'aria-labelledby': `${elementIdsRef.current.labelId} ${elementIdsRef.current.toggleButtonId}`,\n ...rest,\n }\n\n if (!rest.disabled) {\n toggleProps.onClick = callAllEventHandlers(\n onClick,\n toggleButtonHandleClick,\n )\n toggleProps.onKeyDown = callAllEventHandlers(\n onKeyDown,\n toggleButtonHandleKeyDown,\n )\n }\n\n setGetterPropCallInfo(\n 'getToggleButtonProps',\n suppressRefError,\n refKey,\n toggleButtonRef,\n )\n\n return toggleProps\n },\n [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo],\n )\n const getItemProps = useCallback(\n ({\n item,\n index,\n onMouseMove,\n onClick,\n refKey = 'ref',\n ref,\n ...rest\n } = {}) => {\n const {state: latestState, props: latestProps} = latest.current\n const itemHandleMouseMove = () => {\n if (index === latestState.highlightedIndex) {\n return\n }\n shouldScrollRef.current = false\n dispatch({\n type: stateChangeTypes.ItemMouseMove,\n index,\n })\n }\n const itemHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ItemClick,\n index,\n })\n }\n\n const itemIndex = getItemIndex(index, item, latestProps.items)\n if (itemIndex < 0) {\n throw new Error('Pass either item or item index in getItemProps!')\n }\n const itemProps = {\n role: 'option',\n 'aria-selected': `${itemIndex === latestState.highlightedIndex}`,\n id: elementIdsRef.current.getItemId(itemIndex),\n [refKey]: handleRefs(ref, itemNode => {\n if (itemNode) {\n itemRefs.current[\n elementIdsRef.current.getItemId(itemIndex)\n ] = itemNode\n }\n }),\n ...rest,\n }\n\n if (!rest.disabled) {\n itemProps.onMouseMove = callAllEventHandlers(\n onMouseMove,\n itemHandleMouseMove,\n )\n itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick)\n }\n\n return itemProps\n },\n [dispatch, latest],\n )\n\n return {\n // prop getters.\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getItemProps,\n // actions.\n toggleMenu,\n openMenu,\n closeMenu,\n setHighlightedIndex,\n selectItem,\n reset,\n setInputValue,\n // state.\n highlightedIndex,\n isOpen,\n selectedItem,\n inputValue,\n }\n}\n\nexport default useSelect\n","import productionEnum from '../../productionEnum.macro'\n\nexport const InputKeyDownArrowDown = productionEnum(\n '__input_keydown_arrow_down__',\n)\nexport const InputKeyDownArrowUp = productionEnum('__input_keydown_arrow_up__')\nexport const InputKeyDownEscape = productionEnum('__input_keydown_escape__')\nexport const InputKeyDownHome = productionEnum('__input_keydown_home__')\nexport const InputKeyDownEnd = productionEnum('__input_keydown_end__')\nexport const InputKeyDownEnter = productionEnum('__input_keydown_enter__')\nexport const InputChange = productionEnum('__input_change__')\nexport const InputBlur = productionEnum('__input_blur__')\n\nexport const MenuMouseLeave = productionEnum('__menu_mouse_leave__')\n\nexport const ItemMouseMove = productionEnum('__item_mouse_move__')\nexport const ItemClick = productionEnum('__item_click__')\n\nexport const ToggleButtonClick = productionEnum('__togglebutton_click__')\n\nexport const FunctionToggleMenu = productionEnum('__function_toggle_menu__')\nexport const FunctionOpenMenu = productionEnum('__function_open_menu__')\nexport const FunctionCloseMenu = productionEnum('__function_close_menu__')\nexport const FunctionSetHighlightedIndex = productionEnum(\n '__function_set_highlighted_index__',\n)\nexport const FunctionSelectItem = productionEnum('__function_select_item__')\nexport const FunctionSetInputValue = productionEnum(\n '__function_set_input_value__',\n)\nexport const FunctionReset = productionEnum('__function_reset__')\nexport const ControlledPropUpdatedSelectedItem = productionEnum(\n '__controlled_prop_updated_selected_item__',\n)\n","import {useRef} from 'react'\nimport PropTypes from 'prop-types'\nimport {\n generateId,\n getA11yStatusMessage,\n isControlledProp,\n getState,\n} from '../../utils'\nimport {\n getElementIds as getElementIdsCommon,\n defaultProps as defaultPropsCommon,\n getInitialState as getInitialStateCommon,\n useEnhancedReducer,\n} from '../utils'\nimport {ControlledPropUpdatedSelectedItem} from './stateChangeTypes'\n\nexport function getElementIds({id, inputId, ...rest}) {\n const uniqueId = id === undefined ? `downshift-${generateId()}` : id\n\n return {\n inputId: inputId || `${uniqueId}-input`,\n ...getElementIdsCommon({id, ...rest}),\n }\n}\n\nexport function getInitialState(props) {\n const initialState = getInitialStateCommon(props)\n const {selectedItem} = initialState\n let {inputValue} = initialState\n\n if (\n inputValue === '' &&\n selectedItem &&\n props.defaultInputValue === undefined &&\n props.initialInputValue === undefined &&\n props.inputValue === undefined\n ) {\n inputValue = props.itemToString(selectedItem)\n }\n\n return {\n ...initialState,\n inputValue,\n }\n}\n\nexport const propTypes = {\n items: PropTypes.array.isRequired,\n itemToString: PropTypes.func,\n getA11yStatusMessage: PropTypes.func,\n getA11ySelectionMessage: PropTypes.func,\n circularNavigation: PropTypes.bool,\n highlightedIndex: PropTypes.number,\n defaultHighlightedIndex: PropTypes.number,\n initialHighlightedIndex: PropTypes.number,\n isOpen: PropTypes.bool,\n defaultIsOpen: PropTypes.bool,\n initialIsOpen: PropTypes.bool,\n selectedItem: PropTypes.any,\n initialSelectedItem: PropTypes.any,\n defaultSelectedItem: PropTypes.any,\n inputValue: PropTypes.string,\n defaultInputValue: PropTypes.string,\n initialInputValue: PropTypes.string,\n id: PropTypes.string,\n labelId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n inputId: PropTypes.string,\n toggleButtonId: PropTypes.string,\n stateReducer: PropTypes.func,\n onSelectedItemChange: PropTypes.func,\n onHighlightedIndexChange: PropTypes.func,\n onStateChange: PropTypes.func,\n onIsOpenChange: PropTypes.func,\n onInputValueChange: PropTypes.func,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n}\n\n/**\n * The useCombobox version of useControlledReducer, which also\n * checks if the controlled prop selectedItem changed between\n * renders. If so, it will also update inputValue with its\n * string equivalent. It uses the common useEnhancedReducer to\n * compute the rest of the state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nexport function useControlledReducer(reducer, initialState, props) {\n const previousSelectedItemRef = useRef()\n const [state, dispatch] = useEnhancedReducer(reducer, initialState, props)\n\n // ToDo: if needed, make same approach as selectedItemChanged from Downshift.\n if (isControlledProp(props, 'selectedItem')) {\n if (previousSelectedItemRef.current !== props.selectedItem) {\n dispatch({\n type: ControlledPropUpdatedSelectedItem,\n inputValue: props.itemToString(props.selectedItem),\n })\n }\n\n previousSelectedItemRef.current =\n state.selectedItem === previousSelectedItemRef.current\n ? props.selectedItem\n : state.selectedItem\n }\n\n return [getState(state, props), dispatch]\n}\n\nexport const defaultProps = {\n ...defaultPropsCommon,\n getA11yStatusMessage,\n circularNavigation: true,\n}\n","import {getHighlightedIndexOnOpen, getDefaultValue} from '../utils'\nimport {getNextWrappingIndex, getNextNonDisabledIndex} from '../../utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\n/* eslint-disable complexity */\nexport default function downshiftUseComboboxReducer(state, action) {\n const {type, props, shiftKey} = action\n let changes\n\n switch (type) {\n case stateChangeTypes.ItemMouseMove:\n changes = {\n highlightedIndex: action.index,\n }\n break\n case stateChangeTypes.ItemClick:\n changes = {\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n selectedItem: props.items[action.index],\n inputValue: props.itemToString(props.items[action.index]),\n }\n break\n case stateChangeTypes.InputKeyDownArrowDown:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? 5 : 1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n 1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n }\n break\n case stateChangeTypes.InputKeyDownArrowUp:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? -5 : -1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n -1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n }\n break\n case stateChangeTypes.InputKeyDownEnter:\n changes = {\n ...(state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n inputValue: props.itemToString(props.items[state.highlightedIndex]),\n }),\n }\n break\n case stateChangeTypes.InputKeyDownEscape:\n changes = {\n isOpen: false,\n selectedItem: null,\n highlightedIndex: -1,\n inputValue: '',\n }\n break\n case stateChangeTypes.InputKeyDownHome:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n 1,\n 0,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n break\n case stateChangeTypes.InputKeyDownEnd:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n -1,\n props.items.length - 1,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n break\n case stateChangeTypes.InputBlur:\n changes = {\n isOpen: false,\n ...(state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n inputValue: props.itemToString(props.items[state.highlightedIndex]),\n highlightedIndex: -1,\n }),\n }\n break\n case stateChangeTypes.InputChange:\n changes = {\n isOpen: true,\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n inputValue: action.inputValue,\n }\n break\n case stateChangeTypes.MenuMouseLeave:\n changes = {\n highlightedIndex: -1,\n }\n break\n case stateChangeTypes.ToggleButtonClick:\n case stateChangeTypes.FunctionToggleMenu:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen\n ? -1\n : getHighlightedIndexOnOpen(props, state, 0),\n }\n break\n case stateChangeTypes.FunctionOpenMenu:\n changes = {\n isOpen: true,\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 0),\n }\n break\n case stateChangeTypes.FunctionCloseMenu:\n changes = {\n isOpen: false,\n }\n break\n case stateChangeTypes.FunctionSetHighlightedIndex:\n changes = {\n highlightedIndex: action.highlightedIndex,\n }\n break\n case stateChangeTypes.FunctionSelectItem:\n changes = {\n selectedItem: action.selectedItem,\n inputValue: props.itemToString(action.selectedItem)\n }\n break\n case stateChangeTypes.ControlledPropUpdatedSelectedItem:\n case stateChangeTypes.FunctionSetInputValue:\n changes = {\n inputValue: action.inputValue,\n }\n break\n case stateChangeTypes.FunctionReset:\n changes = {\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n isOpen: getDefaultValue(props, 'isOpen'),\n selectedItem: getDefaultValue(props, 'selectedItem'),\n inputValue: getDefaultValue(props, 'inputValue'),\n }\n break\n default:\n throw new Error('Reducer called without proper action type.')\n }\n\n return {\n ...state,\n ...changes,\n }\n}\n/* eslint-enable complexity */\n","/* eslint-disable max-statements */\nimport {useRef, useEffect, useCallback, useMemo} from 'react'\nimport {isPreact, isReactNative} from '../../is.macro'\nimport {\n handleRefs,\n normalizeArrowKey,\n callAllEventHandlers,\n validateControlledUnchanged,\n} from '../../utils'\nimport {\n getItemIndex,\n getPropTypesValidator,\n updateA11yStatus,\n useMouseAndTouchTracker,\n useGetterPropsCalledChecker,\n useLatestRef,\n} from '../utils'\nimport {\n getInitialState,\n propTypes,\n defaultProps,\n getElementIds,\n useControlledReducer,\n} from './utils'\nimport downshiftUseComboboxReducer from './reducer'\nimport * as stateChangeTypes from './stateChangeTypes'\n\nconst validatePropTypes =\n process.env.NODE_ENV === 'production'\n ? /* istanbul ignore next */ null\n : getPropTypesValidator(useCombobox, propTypes)\n\nuseCombobox.stateChangeTypes = stateChangeTypes\n\nfunction useCombobox(userProps = {}) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n validatePropTypes(userProps)\n }\n // Props defaults and destructuring.\n const props = {\n ...defaultProps,\n ...userProps,\n }\n const {\n initialIsOpen,\n defaultIsOpen,\n items,\n scrollIntoView,\n environment,\n getA11yStatusMessage,\n getA11ySelectionMessage,\n itemToString,\n } = props\n // Initial state depending on controlled props.\n const initialState = getInitialState(props)\n const [state, dispatch] = useControlledReducer(\n downshiftUseComboboxReducer,\n initialState,\n props,\n )\n const {isOpen, highlightedIndex, selectedItem, inputValue} = state\n\n // Element refs.\n const menuRef = useRef(null)\n const itemRefs = useRef()\n const inputRef = useRef(null)\n const toggleButtonRef = useRef(null)\n const comboboxRef = useRef(null)\n itemRefs.current = {}\n // used not to scroll on highlight by mouse.\n const shouldScrollRef = useRef(true)\n const isInitialMountRef = useRef(true)\n // prevent id re-generation between renders.\n const elementIdsRef = useRef(getElementIds(props))\n // used to keep track of how many items we had on previous cycle.\n const previousResultCountRef = useRef()\n // used for checking when props are moving from controlled to uncontrolled.\n const prevPropsRef = useRef(props)\n // used to store information about getter props being called on render.\n // utility callback to get item element.\n const latest = useLatestRef({state, props})\n\n const getItemNodeFromIndex = index =>\n itemRefs.current[elementIdsRef.current.getItemId(index)]\n\n // Effects.\n // Sets a11y status message on changes in state.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11yStatusMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, highlightedIndex, inputValue, items])\n // Sets a11y status message on changes in selectedItem.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11ySelectionMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItem])\n // Scroll on highlighted item if change comes from keyboard.\n useEffect(() => {\n if (\n highlightedIndex < 0 ||\n !isOpen ||\n !Object.keys(itemRefs.current).length\n ) {\n return\n }\n\n if (shouldScrollRef.current === false) {\n shouldScrollRef.current = true\n } else {\n scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex])\n // Controls the focus on the menu or the toggle button.\n useEffect(() => {\n // Don't focus menu on first render.\n if (isInitialMountRef.current) {\n // Unless it was initialised as open.\n if (initialIsOpen || defaultIsOpen || isOpen) {\n if (inputRef.current) {\n inputRef.current.focus()\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen])\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n previousResultCountRef.current = items.length\n })\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n validateControlledUnchanged(state, prevPropsRef.current, props)\n prevPropsRef.current = props\n }, [state, props])\n // Add mouse/touch events to document.\n const mouseAndTouchTrackersRef = useMouseAndTouchTracker(\n isOpen,\n [comboboxRef, menuRef, toggleButtonRef],\n environment,\n () => {\n dispatch({\n type: stateChangeTypes.InputBlur,\n })\n },\n )\n const setGetterPropCallInfo = useGetterPropsCalledChecker(\n 'getInputProps',\n 'getComboboxProps',\n 'getMenuProps',\n )\n // Make initial ref false.\n useEffect(() => {\n isInitialMountRef.current = false\n }, [])\n\n /* Event handler functions */\n const inputKeyDownHandlers = useMemo(\n () => ({\n ArrowDown(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownArrowDown,\n shiftKey: event.shiftKey,\n getItemNodeFromIndex,\n })\n },\n ArrowUp(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownArrowUp,\n shiftKey: event.shiftKey,\n getItemNodeFromIndex,\n })\n },\n Home(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownHome,\n getItemNodeFromIndex,\n })\n },\n End(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownEnd,\n getItemNodeFromIndex,\n })\n },\n Escape() {\n dispatch({\n type: stateChangeTypes.InputKeyDownEscape,\n })\n },\n Enter(event) {\n // if IME composing, wait for next Enter keydown event.\n if (event.which === 229) {\n return\n }\n const latestState = latest.current.state\n\n if (latestState.isOpen && latestState.highlightedIndex > -1) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownEnter,\n getItemNodeFromIndex,\n })\n }\n },\n }),\n [dispatch, latest],\n )\n\n // Getter props.\n const getLabelProps = useCallback(\n labelProps => ({\n id: elementIdsRef.current.labelId,\n htmlFor: elementIdsRef.current.inputId,\n ...labelProps,\n }),\n [],\n )\n const getMenuProps = useCallback(\n (\n {onMouseLeave, refKey = 'ref', ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef)\n return {\n [refKey]: handleRefs(ref, menuNode => {\n menuRef.current = menuNode\n }),\n id: elementIdsRef.current.menuId,\n role: 'listbox',\n 'aria-labelledby': elementIdsRef.current.labelId,\n onMouseLeave: callAllEventHandlers(onMouseLeave, () => {\n dispatch({\n type: stateChangeTypes.MenuMouseLeave,\n })\n }),\n ...rest,\n }\n },\n [dispatch, setGetterPropCallInfo],\n )\n\n const getItemProps = useCallback(\n ({\n item,\n index,\n refKey = 'ref',\n ref,\n onMouseMove,\n onClick,\n onPress,\n ...rest\n } = {}) => {\n const {props: latestProps, state: latestState} = latest.current\n const itemIndex = getItemIndex(index, item, latestProps.items)\n if (itemIndex < 0) {\n throw new Error('Pass either item or item index in getItemProps!')\n }\n\n const onSelectKey = isReactNative\n ? /* istanbul ignore next (react-native) */ 'onPress'\n : 'onClick'\n const customClickHandler = isReactNative\n ? /* istanbul ignore next (react-native) */ onPress\n : onClick\n\n const itemHandleMouseMove = () => {\n if (index === latestState.highlightedIndex) {\n return\n }\n shouldScrollRef.current = false\n dispatch({\n type: stateChangeTypes.ItemMouseMove,\n index,\n })\n }\n const itemHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ItemClick,\n index,\n })\n }\n\n return {\n [refKey]: handleRefs(ref, itemNode => {\n if (itemNode) {\n itemRefs.current[\n elementIdsRef.current.getItemId(itemIndex)\n ] = itemNode\n }\n }),\n role: 'option',\n 'aria-selected': `${itemIndex === latestState.highlightedIndex}`,\n id: elementIdsRef.current.getItemId(itemIndex),\n ...(!rest.disabled && {\n onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),\n [onSelectKey]: callAllEventHandlers(\n customClickHandler,\n itemHandleClick,\n ),\n }),\n ...rest,\n }\n },\n [dispatch, latest],\n )\n\n const getToggleButtonProps = useCallback(\n ({onClick, onPress, refKey = 'ref', ref, ...rest} = {}) => {\n const toggleButtonHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ToggleButtonClick,\n })\n\n if (!latest.current.state.isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }\n\n return {\n [refKey]: handleRefs(ref, toggleButtonNode => {\n toggleButtonRef.current = toggleButtonNode\n }),\n id: elementIdsRef.current.toggleButtonId,\n tabIndex: -1,\n ...(!rest.disabled && {\n ...(isReactNative\n ? /* istanbul ignore next (react-native) */ {\n onPress: callAllEventHandlers(onPress, toggleButtonHandleClick),\n }\n : {\n onClick: callAllEventHandlers(onClick, toggleButtonHandleClick),\n }),\n }),\n ...rest,\n }\n },\n [dispatch, latest],\n )\n const getInputProps = useCallback(\n (\n {\n onKeyDown,\n onChange,\n onInput,\n onBlur,\n onChangeText,\n refKey = 'ref',\n ref,\n ...rest\n } = {},\n {suppressRefError = false} = {},\n ) => {\n setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef)\n\n const latestState = latest.current.state\n const inputHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && inputKeyDownHandlers[key]) {\n inputKeyDownHandlers[key](event)\n }\n }\n const inputHandleChange = event => {\n dispatch({\n type: stateChangeTypes.InputChange,\n inputValue: isReactNative\n ? /* istanbul ignore next (react-native) */ event.nativeEvent.text\n : event.target.value,\n })\n }\n const inputHandleBlur = () => {\n /* istanbul ignore else */\n if (!mouseAndTouchTrackersRef.current.isMouseDown) {\n dispatch({\n type: stateChangeTypes.InputBlur,\n })\n }\n }\n\n /* istanbul ignore next (preact) */\n const onChangeKey = isPreact ? 'onInput' : 'onChange'\n let eventHandlers = {}\n\n if (!rest.disabled) {\n eventHandlers = {\n [onChangeKey]: callAllEventHandlers(\n onChange,\n onInput,\n inputHandleChange,\n ),\n onKeyDown: callAllEventHandlers(onKeyDown, inputHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, inputHandleBlur),\n }\n }\n\n /* istanbul ignore if (react-native) */\n if (isReactNative) {\n eventHandlers.onChange = callAllEventHandlers(\n onChange,\n onInput,\n inputHandleChange,\n )\n eventHandlers.onChangeText = callAllEventHandlers(\n onChangeText,\n onInput,\n text => {\n inputHandleChange({nativeEvent: {text}})\n },\n )\n }\n\n return {\n [refKey]: handleRefs(ref, inputNode => {\n inputRef.current = inputNode\n }),\n id: elementIdsRef.current.inputId,\n 'aria-autocomplete': 'list',\n 'aria-controls': elementIdsRef.current.menuId,\n ...(latestState.isOpen &&\n latestState.highlightedIndex > -1 && {\n 'aria-activedescendant': elementIdsRef.current.getItemId(\n latestState.highlightedIndex,\n ),\n }),\n 'aria-labelledby': elementIdsRef.current.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete=\"nope\" is ignored on latest Chrome and Opera\n autoComplete: 'off',\n value: latestState.inputValue,\n ...eventHandlers,\n ...rest,\n }\n },\n [\n dispatch,\n inputKeyDownHandlers,\n latest,\n mouseAndTouchTrackersRef,\n setGetterPropCallInfo,\n ],\n )\n const getComboboxProps = useCallback(\n ({refKey = 'ref', ref, ...rest} = {}, {suppressRefError = false} = {}) => {\n setGetterPropCallInfo(\n 'getComboboxProps',\n suppressRefError,\n refKey,\n comboboxRef,\n )\n\n return {\n [refKey]: handleRefs(ref, comboboxNode => {\n comboboxRef.current = comboboxNode\n }),\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-owns': elementIdsRef.current.menuId,\n 'aria-expanded': latest.current.state.isOpen,\n ...rest,\n }\n },\n [latest, setGetterPropCallInfo],\n )\n\n // returns\n const toggleMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionToggleMenu,\n })\n }, [dispatch])\n const closeMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionCloseMenu,\n })\n }, [dispatch])\n const openMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionOpenMenu,\n })\n }, [dispatch])\n const setHighlightedIndex = useCallback(\n newHighlightedIndex => {\n dispatch({\n type: stateChangeTypes.FunctionSetHighlightedIndex,\n highlightedIndex: newHighlightedIndex,\n })\n },\n [dispatch],\n )\n const selectItem = useCallback(\n newSelectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionSelectItem,\n selectedItem: newSelectedItem,\n })\n },\n [dispatch],\n )\n const setInputValue = useCallback(\n newInputValue => {\n dispatch({\n type: stateChangeTypes.FunctionSetInputValue,\n inputValue: newInputValue,\n })\n },\n [dispatch],\n )\n const reset = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionReset,\n })\n }, [dispatch])\n\n return {\n // prop getters.\n getItemProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getComboboxProps,\n getToggleButtonProps,\n // actions.\n toggleMenu,\n openMenu,\n closeMenu,\n setHighlightedIndex,\n setInputValue,\n selectItem,\n reset,\n // state.\n highlightedIndex,\n isOpen,\n selectedItem,\n inputValue,\n }\n}\n\nexport default useCombobox\n","import PropTypes from 'prop-types'\nimport {\n getInitialValue as getInitialValueCommon,\n getDefaultValue as getDefaultValueCommon,\n defaultProps as defaultPropsCommon,\n} from '../utils'\n\nconst defaultStateValues = {\n activeIndex: -1,\n selectedItems: [],\n}\n\n/**\n * Returns the initial value for a state key in the following order:\n * 1. controlled prop, 2. initial prop, 3. default prop, 4. default\n * value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\nfunction getInitialValue(props, propKey) {\n return getInitialValueCommon(props, propKey, defaultStateValues)\n}\n\n/**\n * Returns the default value for a state key in the following order:\n * 1. controlled prop, 2. default prop, 3. default value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\nexport function getDefaultValue(props, propKey) {\n return getDefaultValueCommon(props, propKey, defaultStateValues)\n}\n\n/**\n * Gets the initial state based on the provided props. It uses initial, default\n * and controlled props related to state in order to compute the initial value.\n *\n * @param {Object} props Props passed to the hook.\n * @returns {Object} The initial state.\n */\nexport function getInitialState(props) {\n const activeIndex = getInitialValue(props, 'activeIndex')\n const selectedItems = getInitialValue(props, 'selectedItems')\n\n return {\n activeIndex,\n selectedItems,\n }\n}\n\n/**\n * Returns true if dropdown keydown operation is permitted. Should not be\n * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on\n * input element with text content that is either highlighted or selection\n * cursor is not at the starting position.\n *\n * @param {KeyboardEvent} event The event from keydown.\n * @returns {boolean} Whether the operation is allowed.\n */\nexport function isKeyDownOperationPermitted(event) {\n if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n return false\n }\n\n const element = event.target\n\n if (\n element instanceof HTMLInputElement && // if element is a text input\n element.value !== '' && // and we have text in it\n // and cursor is either not at the start or is currently highlighting text.\n (element.selectionStart !== 0 || element.selectionEnd !== 0)\n ) {\n return false\n }\n\n return true\n}\n\n/**\n * Returns a message to be added to aria-live region when item is removed.\n *\n * @param {Object} selectionParameters Parameters required to build the message.\n * @returns {string} The a11y message.\n */\nfunction getA11yRemovalMessage(selectionParameters) {\n const {\n removedSelectedItem,\n itemToString: itemToStringLocal,\n } = selectionParameters\n\n return `${itemToStringLocal(removedSelectedItem)} has been removed.`\n}\n\nexport const propTypes = {\n selectedItems: PropTypes.array,\n initialSelectedItems: PropTypes.array,\n defaultSelectedItems: PropTypes.array,\n itemToString: PropTypes.func,\n getA11yRemovalMessage: PropTypes.func,\n stateReducer: PropTypes.func,\n activeIndex: PropTypes.number,\n initialActiveIndex: PropTypes.number,\n defaultActiveIndex: PropTypes.number,\n onActiveIndexChange: PropTypes.func,\n onSelectedItemsChange: PropTypes.func,\n keyNavigationNext: PropTypes.string,\n keyNavigationPrevious: PropTypes.string,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n}\n\nexport const defaultProps = {\n itemToString: defaultPropsCommon.itemToString,\n stateReducer: defaultPropsCommon.stateReducer,\n environment: defaultPropsCommon.environment,\n getA11yRemovalMessage,\n keyNavigationNext: 'ArrowRight',\n keyNavigationPrevious: 'ArrowLeft',\n}\n","import productionEnum from '../../productionEnum.macro'\n\nexport const SelectedItemClick = productionEnum('__selected_item_click__')\nexport const SelectedItemKeyDownDelete = productionEnum(\n '__selected_item_keydown_delete__',\n)\nexport const SelectedItemKeyDownBackspace = productionEnum(\n '__selected_item_keydown_backspace__',\n)\nexport const SelectedItemKeyDownNavigationNext = productionEnum(\n '__selected_item_keydown_navigation_next__',\n)\nexport const SelectedItemKeyDownNavigationPrevious = productionEnum(\n '__selected_item_keydown_navigation_previous__',\n)\n\nexport const DropdownKeyDownNavigationPrevious = productionEnum(\n '__dropdown_keydown_navigation_previous__',\n)\nexport const DropdownKeyDownBackspace = productionEnum(\n '__dropdown_keydown_backspace__',\n)\nexport const DropdownClick = productionEnum('__dropdown_click__')\n\nexport const FunctionAddSelectedItem = productionEnum(\n '__function_add_selected_item__',\n)\nexport const FunctionRemoveSelectedItem = productionEnum(\n '__function_remove_selected_item__',\n)\nexport const FunctionSetSelectedItems = productionEnum(\n '__function_set_selected_items__',\n)\nexport const FunctionSetActiveIndex = productionEnum(\n '__function_set_active_index__',\n)\nexport const FunctionReset = productionEnum('__function_reset__')\n","import {getDefaultValue} from './utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\n/* eslint-disable complexity */\nexport default function downshiftMultipleSelectionReducer(state, action) {\n const {type, index, props, selectedItem} = action\n const {activeIndex, selectedItems} = state\n let changes\n\n switch (type) {\n case stateChangeTypes.SelectedItemClick:\n changes = {\n activeIndex: index,\n }\n\n break\n case stateChangeTypes.SelectedItemKeyDownNavigationPrevious:\n changes = {\n activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1,\n }\n\n break\n case stateChangeTypes.SelectedItemKeyDownNavigationNext:\n changes = {\n activeIndex:\n activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1,\n }\n\n break\n case stateChangeTypes.SelectedItemKeyDownBackspace:\n case stateChangeTypes.SelectedItemKeyDownDelete: {\n let newActiveIndex = activeIndex\n\n if (selectedItems.length === 1) {\n newActiveIndex = -1\n } else if (activeIndex === selectedItems.length - 1) {\n newActiveIndex = selectedItems.length - 2\n }\n\n changes = {\n selectedItems: [\n ...selectedItems.slice(0, activeIndex),\n ...selectedItems.slice(activeIndex + 1),\n ],\n ...{activeIndex: newActiveIndex},\n }\n\n break\n }\n case stateChangeTypes.DropdownKeyDownNavigationPrevious:\n changes = {\n activeIndex: selectedItems.length - 1,\n }\n break\n case stateChangeTypes.DropdownKeyDownBackspace:\n changes = {\n selectedItems: selectedItems.slice(0, selectedItems.length - 1),\n }\n break\n case stateChangeTypes.FunctionAddSelectedItem:\n changes = {\n selectedItems: [...selectedItems, selectedItem],\n }\n break\n case stateChangeTypes.DropdownClick:\n changes = {\n activeIndex: -1,\n }\n break\n case stateChangeTypes.FunctionRemoveSelectedItem: {\n let newActiveIndex = activeIndex\n const selectedItemIndex = selectedItems.indexOf(selectedItem)\n\n if (selectedItems.length === 1) {\n newActiveIndex = -1\n } else if (selectedItemIndex === selectedItems.length - 1) {\n newActiveIndex = selectedItems.length - 2\n }\n\n changes = {\n selectedItems: [\n ...selectedItems.slice(0, selectedItemIndex),\n ...selectedItems.slice(selectedItemIndex + 1),\n ],\n ...{activeIndex: newActiveIndex},\n }\n break\n }\n case stateChangeTypes.FunctionSetSelectedItems: {\n const {selectedItems: newSelectedItems} = action\n changes = {\n selectedItems: newSelectedItems,\n }\n break\n }\n case stateChangeTypes.FunctionSetActiveIndex: {\n const {activeIndex: newActiveIndex} = action\n changes = {\n activeIndex: newActiveIndex,\n }\n break\n }\n case stateChangeTypes.FunctionReset:\n changes = {\n activeIndex: getDefaultValue(props, 'activeIndex'),\n selectedItems: getDefaultValue(props, 'selectedItems'),\n }\n break\n default:\n throw new Error('Reducer called without proper action type.')\n }\n\n return {\n ...state,\n ...changes,\n }\n}\n","import {useRef, useEffect, useCallback, useMemo} from 'react'\nimport setStatus from '../../set-a11y-status'\nimport {\n handleRefs,\n callAllEventHandlers,\n normalizeArrowKey,\n validateControlledUnchanged,\n} from '../../utils'\nimport {\n useControlledReducer,\n getItemIndex,\n useGetterPropsCalledChecker,\n useLatestRef,\n} from '../utils'\nimport {\n getInitialState,\n defaultProps,\n isKeyDownOperationPermitted,\n} from './utils'\nimport downshiftMultipleSelectionReducer from './reducer'\nimport * as stateChangeTypes from './stateChangeTypes'\n\nuseMultipleSelection.stateChangeTypes = stateChangeTypes\n\nfunction useMultipleSelection(userProps = {}) {\n // Props defaults and destructuring.\n const props = {\n ...defaultProps,\n ...userProps,\n }\n const {\n getA11yRemovalMessage,\n itemToString,\n environment,\n keyNavigationNext,\n keyNavigationPrevious,\n } = props\n\n // Reducer init.\n const [state, dispatch] = useControlledReducer(\n downshiftMultipleSelectionReducer,\n getInitialState(props),\n props,\n )\n const {activeIndex, selectedItems} = state\n\n // Refs.\n const isInitialMountRef = useRef(true)\n const dropdownRef = useRef(null)\n const previousSelectedItemsRef = useRef(selectedItems)\n const selectedItemRefs = useRef()\n selectedItemRefs.current = []\n // used for checking when props are moving from controlled to uncontrolled.\n const prevPropsRef = useRef(props)\n const latest = useLatestRef({state, props})\n\n // Effects.\n /* Sets a11y status message on changes in selectedItem. */\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n if (selectedItems.length < previousSelectedItemsRef.current.length) {\n const removedSelectedItem = previousSelectedItemsRef.current.find(\n item => selectedItems.indexOf(item) < 0,\n )\n\n setStatus(\n getA11yRemovalMessage({\n itemToString,\n resultCount: selectedItems.length,\n removedSelectedItem,\n activeIndex,\n activeSelectedItem: selectedItems[activeIndex],\n }),\n environment.document,\n )\n }\n\n previousSelectedItemsRef.current = selectedItems\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItems.length])\n // Sets focus on active item.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n if (activeIndex === -1 && dropdownRef.current) {\n dropdownRef.current.focus()\n } else if (selectedItemRefs.current[activeIndex]) {\n selectedItemRefs.current[activeIndex].focus()\n }\n }, [activeIndex])\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n validateControlledUnchanged(state, prevPropsRef.current, props)\n prevPropsRef.current = props\n }, [state, props])\n const setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps')\n // Make initial ref false.\n useEffect(() => {\n isInitialMountRef.current = false\n }, [])\n\n // Event handler functions.\n const selectedItemKeyDownHandlers = useMemo(\n () => ({\n [keyNavigationPrevious]() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownNavigationPrevious,\n })\n },\n [keyNavigationNext]() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownNavigationNext,\n })\n },\n Delete() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownDelete,\n })\n },\n Backspace() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownBackspace,\n })\n },\n }),\n [dispatch, keyNavigationNext, keyNavigationPrevious],\n )\n const dropdownKeyDownHandlers = useMemo(\n () => ({\n [keyNavigationPrevious](event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: stateChangeTypes.DropdownKeyDownNavigationPrevious,\n })\n }\n },\n Backspace(event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: stateChangeTypes.DropdownKeyDownBackspace,\n })\n }\n },\n }),\n [dispatch, keyNavigationPrevious],\n )\n\n // Getter props.\n const getSelectedItemProps = useCallback(\n ({\n refKey = 'ref',\n ref,\n onClick,\n onKeyDown,\n selectedItem,\n index,\n ...rest\n } = {}) => {\n const {state: latestState} = latest.current\n const itemIndex = getItemIndex(\n index,\n selectedItem,\n latestState.selectedItems,\n )\n if (itemIndex < 0) {\n throw new Error(\n 'Pass either selectedItem or index in getSelectedItemProps!',\n )\n }\n\n const selectedItemHandleClick = () => {\n dispatch({\n type: stateChangeTypes.SelectedItemClick,\n index,\n })\n }\n const selectedItemHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && selectedItemKeyDownHandlers[key]) {\n selectedItemKeyDownHandlers[key](event)\n }\n }\n\n return {\n [refKey]: handleRefs(ref, selectedItemNode => {\n if (selectedItemNode) {\n selectedItemRefs.current.push(selectedItemNode)\n }\n }),\n tabIndex: index === latestState.activeIndex ? 0 : -1,\n onClick: callAllEventHandlers(onClick, selectedItemHandleClick),\n onKeyDown: callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown),\n ...rest,\n }\n },\n [dispatch, latest, selectedItemKeyDownHandlers],\n )\n const getDropdownProps = useCallback(\n (\n {\n refKey = 'ref',\n ref,\n onKeyDown,\n onClick,\n preventKeyAction = false,\n ...rest\n } = {},\n {suppressRefError = false} = {},\n ) => {\n setGetterPropCallInfo(\n 'getDropdownProps',\n suppressRefError,\n refKey,\n dropdownRef,\n )\n\n const dropdownHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && dropdownKeyDownHandlers[key]) {\n dropdownKeyDownHandlers[key](event)\n }\n }\n const dropdownHandleClick = () => {\n dispatch({\n type: stateChangeTypes.DropdownClick,\n })\n }\n\n return {\n [refKey]: handleRefs(ref, dropdownNode => {\n if (dropdownNode) {\n dropdownRef.current = dropdownNode\n }\n }),\n ...(!preventKeyAction && {\n onKeyDown: callAllEventHandlers(onKeyDown, dropdownHandleKeyDown),\n onClick: callAllEventHandlers(onClick, dropdownHandleClick),\n }),\n ...rest,\n }\n },\n [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo],\n )\n\n // returns\n const addSelectedItem = useCallback(\n selectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionAddSelectedItem,\n selectedItem,\n })\n },\n [dispatch],\n )\n const removeSelectedItem = useCallback(\n selectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionRemoveSelectedItem,\n selectedItem,\n })\n },\n [dispatch],\n )\n const setSelectedItems = useCallback(\n newSelectedItems => {\n dispatch({\n type: stateChangeTypes.FunctionSetSelectedItems,\n selectedItems: newSelectedItems,\n })\n },\n [dispatch],\n )\n const setActiveIndex = useCallback(\n newActiveIndex => {\n dispatch({\n type: stateChangeTypes.FunctionSetActiveIndex,\n activeIndex: newActiveIndex,\n })\n },\n [dispatch],\n )\n const reset = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionReset,\n })\n }, [dispatch])\n\n return {\n getSelectedItemProps,\n getDropdownProps,\n addSelectedItem,\n removeSelectedItem,\n setSelectedItems,\n setActiveIndex,\n reset,\n selectedItems,\n activeIndex,\n }\n}\n\nexport default useMultipleSelection\n"],"names":["_objectWithoutPropertiesLoose","source","excluded","target","sourceKeys","Object","keys","key","i","length","indexOf","_extends","assign","bind","arguments","prototype","hasOwnProperty","call","apply","_assertThisInitialized","self","ReferenceError","_setPrototypeOf","o","p","setPrototypeOf","__proto__","_inheritsLoose","subClass","superClass","create","constructor","hasSymbol","Symbol","for","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_ASYNC_MODE_TYPE","REACT_CONCURRENT_MODE_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_BLOCK_TYPE","REACT_FUNDAMENTAL_TYPE","REACT_RESPONDER_TYPE","REACT_SCOPE_TYPE","isValidElementType","type","$$typeof","typeOf","object","$$typeofType","undefined","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Fragment","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","hasWarnedAboutDeprecatedIsAsyncMode","isAsyncMode","console","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","exports","module","require$$1","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","toObject","val","TypeError","shouldUseNative","test1","String","getOwnPropertyNames","test2","fromCharCode","order2","map","n","join","test3","split","forEach","letter","err","objectAssign","from","to","symbols","s","ReactPropTypesSecret","ReactPropTypesSecret_1","has","Function","printWarning","require$$0","loggedTypeFailures","text","message","error","Error","x","checkPropTypes","typeSpecs","values","location","componentName","getStack","typeSpecName","name","ex","stack","resetWarningCache","checkPropTypes_1","emptyFunctionThatReturnsNull","factoryWithTypeCheckers","isValidElement","throwOnDirectAccess","ITERATOR_SYMBOL","iterator","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","iteratorFn","ANONYMOUS","ReactPropTypes","array","createPrimitiveTypeChecker","bigint","bool","func","number","string","symbol","any","createAnyTypeChecker","arrayOf","createArrayOfTypeChecker","element","createElementTypeChecker","elementType","createElementTypeTypeChecker","instanceOf","createInstanceTypeChecker","node","createNodeChecker","objectOf","createObjectOfTypeChecker","oneOf","createEnumTypeChecker","oneOfType","createUnionTypeChecker","shape","createShapeTypeChecker","exact","createStrictShapeTypeChecker","is","y","PropTypeError","data","createChainableTypeChecker","validate","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","isRequired","props","propName","propFullName","secret","cacheKey","chainedCheckType","expectedType","propValue","propType","getPropType","preciseType","getPreciseType","typeChecker","Array","isArray","ReactIs","expectedClass","expectedClassName","actualClassName","getClassName","expectedValues","valuesString","JSON","stringify","replacer","value","arrayOfTypeCheckers","process","checker","getPostfixForTypeWarning","expectedTypes","checkerResult","push","expectedTypesMessage","isNode","invalidValidatorError","shapeTypes","allKeys","every","step","entries","next","done","entry","isSymbol","RegExp","Date","PropTypes","t","nodeType","e","clientHeight","scrollHeight","clientWidth","scrollWidth","r","getComputedStyle","overflowY","overflowX","ownerDocument","defaultView","frameElement","l","d","window","scrollMode","block","f","inline","h","boundary","u","skipOverflowHiddenElements","a","c","g","document","scrollingElement","documentElement","m","parentElement","getRootNode","host","body","w","visualViewport","width","innerWidth","v","height","innerHeight","W","scrollX","pageXOffset","H","scrollY","pageYOffset","b","getBoundingClientRect","E","M","top","V","right","bottom","I","left","C","R","T","k","B","D","O","X","Y","L","S","j","N","q","parseInt","borderLeftWidth","z","borderTopWidth","A","borderRightWidth","F","borderBottomWidth","G","J","K","offsetWidth","P","offsetHeight","Q","U","Math","max","Z","scrollLeft","$","scrollTop","min","el","idCounter","cbToCb","cb","noop","scrollIntoView","menuNode","actions","computeScrollIntoView","_ref","isOrContainsNode","parent","child","contains","debounce","fn","time","timeoutId","cancel","clearTimeout","wrapper","_len","args","_key","setTimeout","callAllEventHandlers","_len2","fns","_key2","event","_len3","_key3","some","concat","preventDownshiftDefault","nativeEvent","handleRefs","_len4","refs","_key4","ref","current","generateId","resetIdCounter","getA11yStatusMessage","_ref2","isOpen","resultCount","previousResultCount","unwrapArray","arg","defaultValue","isDOMElement","getElementProps","requiredProp","fnName","stateKeys","pickState","state","result","getState","reduce","prevState","isControlledProp","normalizeArrowKey","keyCode","isPlainObject","obj","toString","getNextWrappingIndex","moveAmount","baseIndex","itemCount","getItemNodeFromIndex","circular","itemsLastIndex","newIndex","nonDisabledNewIndex","getNextNonDisabledIndex","currentElementNode","hasAttribute","index","targetWithinDownshift","downshiftElements","checkActiveElement","contextNode","activeElement","validateControlledUnchanged","prevProps","nextProps","warningDescription","propKey","cleanupStatus","getStatusDiv","textContent","setStatus","status","documentProp","div","statusDiv","getElementById","createElement","setAttribute","style","border","clip","margin","overflow","padding","position","appendChild","unknown","mouseUp","itemMouseEnter","keyDownArrowUp","keyDownArrowDown","keyDownEscape","keyDownEnter","keyDownHome","keyDownEnd","clickItem","blurInput","changeInput","keyDownSpaceButton","clickButton","blurButton","controlledPropUpdatedSelectedItem","touchEnd","Downshift","_Component","_this","id","menuId","labelId","inputId","getItemId","input","items","timeoutIds","internalSetTimeout","filter","setItemCount","count","unsetItemCount","setHighlightedIndex","highlightedIndex","otherStateToSet","defaultHighlightedIndex","internalSetState","clearSelection","selectedItem","inputValue","defaultIsOpen","selectItem","item","itemToString","selectItemAtIndex","itemIndex","selectHighlightedItem","stateToSet","isItemSelected","onChangeArg","onStateChangeArg","isStateToSetFunction","onInputValueChange","getStateAndHelpers","setState","newStateToSet","stateReducer","nextState","stateChangeTypes","nextFullState","hasMoreStateThanType","onStateChange","onSelect","onChange","onUserAction","rootRef","_rootNode","getRootProps","_temp","_temp2","_extends2","_ref$refKey","refKey","rest","_excluded","_ref2$suppressRefErro","suppressRefError","called","_this$getState","role","keyDownHandlers","ArrowDown","_this2","preventDefault","amount","shiftKey","moveHighlightedIndex","getItemCount","_this2$getState","nextHighlightedIndex","ArrowUp","_this3","_this3$getState","Enter","which","_this$getState2","itemNode","Escape","reset","buttonKeyDownHandlers","_","toggleMenu","inputKeyDownHandlers","Home","_this4","_this$getState3","newHighlightedIndex","End","_this5","_this$getState4","getToggleButtonProps","_temp3","_ref3","onClick","onPress","onKeyDown","onKeyUp","onBlur","_excluded2","_this$getState5","enabledEventHandlers","buttonHandleClick","buttonHandleKeyDown","buttonHandleKeyUp","buttonHandleBlur","eventHandlers","disabled","environment","focus","blurTarget","isMouseDown","getLabelProps","htmlFor","getInputProps","_temp4","_ref4","onInput","onChangeText","_excluded3","onChangeKey","_this$getState6","_eventHandlers","inputHandleChange","inputHandleKeyDown","inputHandleBlur","autoComplete","downshiftButtonIsActive","dataset","toggle","menuRef","_menuNode","getMenuProps","_temp5","_temp6","_extends3","_ref5","_ref5$refKey","_excluded4","_ref6","_ref6$suppressRefErro","getItemProps","_temp7","_enabledEventHandlers","_ref7","onMouseMove","onMouseDown","_ref7$item","_excluded5","onSelectKey","customClickHandler","avoidScrolling","clearItems","_ref8","_ref9","_this$getState7","openMenu","closeMenu","updateStatus","highlightedItem","setA11yStatus","_this$props","_this$props$initialHi","initialHighlightedIndex","_this$props$initialIs","initialIsOpen","_this$props$initialIn","initialInputValue","_this$props$initialSe","initialSelectedItem","_proto","internalClearTimeouts","stateToMerge","scrollHighlightedItemIntoView","_this6","_this$getState8","_this$getState9","componentDidMount","_this7","validateGetMenuPropsCalledCorrectly","onMouseUp","contextWithinDownshift","onOuterClick","onTouchStart","isTouchMove","onTouchMove","onTouchEnd","addEventListener","cleanup","removeEventListener","shouldScroll","_ref10","currentHighlightedIndex","_ref11","prevHighlightedIndex","scrollWhenOpen","componentDidUpdate","selectedItemChanged","componentWillUnmount","render","children","validateGetRootPropsCalledCorrectly","cloneElement","Component","defaultProps","warn","prevItem","propTypes","_ref12","_ref13","refKeySpecified","isComposite","dropdownDefaultStateValues","callOnChangeProps","action","newState","changes","invokeOnChangeHandler","handler","capitalizeString","getA11ySelectionMessage","selectionParameters","itemToStringLocal","updateA11yStatus","getA11yMessage","getElementIds","toggleButtonId","uniqueId","getItemIndex","getPropTypesValidator","caller","options","isAcceptedCharacterKey","test","slice","toUpperCase","useLatestRef","useRef","useEnhancedReducer","reducer","initialState","isStateEqual","prevStateRef","actionRef","enhancedReducer","useCallback","_useReducer","useReducer","dispatch","propsRef","dispatchWithProps","useEffect","shouldCallOnChangeProps","useControlledReducer","_useEnhancedReducer","circularNavigation","getDefaultValue","defaultStateValues","defaultPropKey","getInitialValue","initialPropKey","getInitialState","getHighlightedIndexOnOpen","offset","useMouseAndTouchTracker","downshiftElementRefs","handleBlur","mouseAndTouchTrackersRef","useGetterPropsCalledChecker","propKeys","getterPropsCalledRef","acc","_getterPropsCalledRef","elementRef","setGetterPropCallInfo","isDropdownsStateEqual","getItemIndexByCharacterKey","keysSoFar","itemToStringParam","lowerCasedItemStrings","toLowerCase","lowerCasedKeysSoFar","isValid","itemString","startsWith","defaultSelectedItem","onSelectedItemChange","onHighlightedIndexChange","onIsOpenChange","commonDefaultProps","MenuKeyDownArrowDown","MenuKeyDownArrowUp","MenuKeyDownEscape","MenuKeyDownHome","MenuKeyDownEnd","MenuKeyDownEnter","MenuKeyDownSpaceButton","MenuKeyDownCharacter","MenuBlur","MenuMouseLeave","ItemMouseMove","ItemClick","ToggleButtonClick","ToggleButtonKeyDownArrowDown","ToggleButtonKeyDownArrowUp","ToggleButtonKeyDownCharacter","FunctionToggleMenu","FunctionOpenMenu","FunctionCloseMenu","FunctionSetHighlightedIndex","FunctionSelectItem","FunctionSetInputValue","FunctionReset","downshiftSelectReducer","lowercasedKey","validatePropTypes","useSelect","userProps","_useControlledReducer","toggleButtonRef","itemRefs","shouldScrollRef","shouldBlurRef","clearTimeoutRef","elementIdsRef","previousResultCountRef","isInitialMountRef","prevPropsRef","latest","outerDispatch","toggleButtonKeyDownHandlers","useMemo","menuKeyDownHandlers","newSelectedItem","setInputValue","newInputValue","labelProps","onMouseLeave","latestState","tabIndex","menuHandleMouseLeave","menuHandleKeyDown","menuHandleBlur","shouldBlur","_ref3$refKey","_ref4$suppressRefErro","toggleButtonHandleClick","toggleButtonHandleKeyDown","toggleProps","toggleButtonNode","_extends4","_latest$current","latestProps","itemHandleMouseMove","itemHandleClick","itemProps","InputKeyDownArrowDown","InputKeyDownArrowUp","InputKeyDownEscape","InputKeyDownHome","InputKeyDownEnd","InputKeyDownEnter","InputChange","InputBlur","ControlledPropUpdatedSelectedItem","getElementIdsCommon","getInitialStateCommon","defaultInputValue","previousSelectedItemRef","defaultPropsCommon","downshiftUseComboboxReducer","useCombobox","inputRef","comboboxRef","_extends5","_ref6$refKey","_ref7$suppressRefErro","inputNode","getComboboxProps","_temp8","_extends6","_ref8$refKey","_ref9$suppressRefErro","comboboxNode","activeIndex","selectedItems","getInitialValueCommon","getDefaultValueCommon","isKeyDownOperationPermitted","metaKey","ctrlKey","altKey","HTMLInputElement","selectionStart","selectionEnd","getA11yRemovalMessage","removedSelectedItem","initialSelectedItems","defaultSelectedItems","initialActiveIndex","defaultActiveIndex","onActiveIndexChange","onSelectedItemsChange","keyNavigationNext","keyNavigationPrevious","SelectedItemClick","SelectedItemKeyDownDelete","SelectedItemKeyDownBackspace","SelectedItemKeyDownNavigationNext","SelectedItemKeyDownNavigationPrevious","DropdownKeyDownNavigationPrevious","DropdownKeyDownBackspace","DropdownClick","FunctionAddSelectedItem","FunctionRemoveSelectedItem","FunctionSetSelectedItems","FunctionSetActiveIndex","downshiftMultipleSelectionReducer","newActiveIndex","selectedItemIndex","newSelectedItems","useMultipleSelection","dropdownRef","previousSelectedItemsRef","selectedItemRefs","find","activeSelectedItem","selectedItemKeyDownHandlers","Delete","Backspace","dropdownKeyDownHandlers","getSelectedItemProps","selectedItemNode","selectedItemHandleClick","selectedItemHandleKeyDown","getDropdownProps","_ref4$refKey","_ref4$preventKeyActio","preventKeyAction","_ref5$suppressRefErro","dropdownNode","dropdownHandleKeyDown","dropdownHandleClick","addSelectedItem","removeSelectedItem","setSelectedItems","setActiveIndex"],"mappings":"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"} \ No newline at end of file diff --git a/dist/downshift.umd.min.js b/dist/downshift.umd.min.js new file mode 100644 index 000000000..bc3f4e00d --- /dev/null +++ b/dist/downshift.umd.min.js @@ -0,0 +1,10 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Downshift={},e.React)}(this,(function(e,t){"use strict";function n(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;tt||i>e&&u=t&&s>=n?i-e-r:u>t&&sn?u-t+o:0}var N=0;function B(e){return"function"==typeof e?e:L}function L(){}function _(e,t){if(e){var n=function(e,t){var n=window,r=t.scrollMode,o=t.block,i=t.inline,u=t.boundary,s=t.skipOverflowHiddenElements,a="function"==typeof u?u:function(e){return e!==u};if(!H(e))throw new TypeError("Invalid target");for(var c,l,d=document.scrollingElement||document.documentElement,p=[],f=e;H(f)&&a(f);){if((f=null==(l=(c=f).parentElement)?c.getRootNode().host||null:l)===d){p.push(f);break}null!=f&&f===document.body&&A(f)&&!A(document.documentElement)||null!=f&&A(f,s)&&p.push(f)}for(var h=n.visualViewport?n.visualViewport.width:innerWidth,g=n.visualViewport?n.visualViewport.height:innerHeight,m=window.scrollX||pageXOffset,I=window.scrollY||pageYOffset,v=e.getBoundingClientRect(),y=v.height,b=v.width,x=v.top,w=v.right,S=v.bottom,C=v.left,k="start"===o||"nearest"===o?x:"end"===o?S:x+y/2,O="center"===i?C+b/2:"end"===i?w:C,M=[],E=0;E=0&&C>=0&&S<=g&&w<=h&&x>=T&&S<=N&&C>=B&&w<=V)return M;var L=getComputedStyle(D),_=parseInt(L.borderLeftWidth,10),j=parseInt(L.borderTopWidth,10),$=parseInt(L.borderRightWidth,10),U=parseInt(L.borderBottomWidth,10),W=0,z=0,q="offsetWidth"in D?D.offsetWidth-D.clientWidth-_-$:0,Y="offsetHeight"in D?D.offsetHeight-D.clientHeight-j-U:0,X="offsetWidth"in D?0===D.offsetWidth?0:R/D.offsetWidth:0,G="offsetHeight"in D?0===D.offsetHeight?0:P/D.offsetHeight:0;if(d===D)W="start"===o?k:"end"===o?k-g:"nearest"===o?F(I,I+g,g,j,U,I+k,I+k+y,y):k-g/2,z="start"===i?O:"center"===i?O-h/2:"end"===i?O-h:F(m,m+h,h,_,$,m+O,m+O+b,b),W=Math.max(0,W+I),z=Math.max(0,z+m);else{W="start"===o?k-T-j:"end"===o?k-N+U+Y:"nearest"===o?F(T,N,P,j,U+Y,k,k+y,y):k-(T+P/2)+Y/2,z="start"===i?O-B-_:"center"===i?O-(B+R/2)+q/2:"end"===i?O-V+$+q:F(B,V,R,_,$+q,O,O+b,b);var J=D.scrollLeft,Q=D.scrollTop;k+=Q-(W=Math.max(0,Math.min(Q+W/G,D.scrollHeight-P/G+Y))),O+=J-(z=Math.max(0,Math.min(J+z/X,D.scrollWidth-R/X+q)))}M.push({el:D,top:W,left:z})}return M}(e,{boundary:t,block:"nearest",scrollMode:"if-needed"});n.forEach((function(e){var t=e.el,n=e.top,r=e.left;t.scrollTop=n,t.scrollLeft=r}))}}function j(e,t){return e===t||e.contains&&e.contains(t)}function $(e,t){var n;function r(){n&&clearTimeout(n)}function o(){for(var o=arguments.length,i=new Array(o),u=0;u1?n-1:0),o=1;o=37&&n<=40&&0!==t.indexOf("Arrow")?"Arrow"+t:t}function ee(e,t,n,r,o){if(void 0===o&&(o=!0),0===n)return-1;var i=n-1;("number"!=typeof t||t<0||t>=n)&&(t=e>0?-1:i+1);var u=t+e;u<0?u=o?i:0:u>i&&(u=o?0:i);var s=te(e,u,n,r,o);return-1===s?t:s}function te(e,t,n,r,o){var i=r(t);if(!i||!i.hasAttribute("disabled"))return t;if(e>0){for(var u=t+1;u=0;s--)if(!r(s).hasAttribute("disabled"))return s;return o?e>0?te(1,0,n,r,!1):te(-1,n-1,n,r,!1):-1}function ne(e,t,n,r){return void 0===r&&(r=!0),t.some((function(t){return t&&(j(t,e)||r&&j(t,n.activeElement))}))}var re=$((function(){ie().textContent=""}),500);function oe(e,t){var n=ie(t);e&&(n.textContent=e,re())}function ie(e){void 0===e&&(e=document);var t=e.getElementById("a11y-status-message");return t||((t=e.createElement("div")).setAttribute("id","a11y-status-message"),t.setAttribute("role","status"),t.setAttribute("aria-live","polite"),t.setAttribute("aria-relevant","additions text"),Object.assign(t.style,{border:"0",clip:"rect(0 0 0 0)",height:"1px",margin:"-1px",overflow:"hidden",padding:"0",position:"absolute",width:"1px"}),e.body.appendChild(t),t)}var ue=Object.freeze({__proto__:null,unknown:0,mouseUp:1,itemMouseEnter:2,keyDownArrowUp:3,keyDownArrowDown:4,keyDownEscape:5,keyDownEnter:6,keyDownHome:7,keyDownEnd:8,clickItem:9,blurInput:10,changeInput:11,keyDownSpaceButton:12,clickButton:13,blurButton:14,controlledPropUpdatedSelectedItem:15,touchEnd:16}),se=["refKey","ref"],ae=["onClick","onPress","onKeyDown","onKeyUp","onBlur"],ce=["onKeyDown","onBlur","onChange","onInput","onChangeText"],le=["refKey","ref"],de=["onMouseMove","onMouseDown","onClick","onPress","index","item"],pe=function(){var e=function(e){var u,s;function a(t){var i=e.call(this,t)||this;i.id=i.props.id||"downshift-"+z(),i.menuId=i.props.menuId||i.id+"-menu",i.labelId=i.props.labelId||i.id+"-label",i.inputId=i.props.inputId||i.id+"-input",i.getItemId=i.props.getItemId||function(e){return i.id+"-item-"+e},i.input=null,i.items=[],i.itemCount=null,i.previousResultCount=0,i.timeoutIds=[],i.internalSetTimeout=function(e,t){var n=setTimeout((function(){i.timeoutIds=i.timeoutIds.filter((function(e){return e!==n})),e()}),t);i.timeoutIds.push(n)},i.setItemCount=function(e){i.itemCount=e},i.unsetItemCount=function(){i.itemCount=null},i.setHighlightedIndex=function(e,t){void 0===e&&(e=i.props.defaultHighlightedIndex),void 0===t&&(t={}),t=G(t),i.internalSetState(r({highlightedIndex:e},t))},i.clearSelection=function(e){i.internalSetState({selectedItem:null,inputValue:"",highlightedIndex:i.props.defaultHighlightedIndex,isOpen:i.props.defaultIsOpen},e)},i.selectItem=function(e,t,n){t=G(t),i.internalSetState(r({isOpen:i.props.defaultIsOpen,highlightedIndex:i.props.defaultHighlightedIndex,selectedItem:e,inputValue:i.props.itemToString(e)},t),n)},i.selectItemAtIndex=function(e,t,n){var r=i.items[e];null!=r&&i.selectItem(r,t,n)},i.selectHighlightedItem=function(e,t){return i.selectItemAtIndex(i.getState().highlightedIndex,e,t)},i.internalSetState=function(e,t){var n,o,u={},s="function"==typeof e;return!s&&e.hasOwnProperty("inputValue")&&i.props.onInputValueChange(e.inputValue,r({},i.getStateAndHelpers(),e)),i.setState((function(t){t=i.getState(t);var a=s?e(t):e;a=i.props.stateReducer(t,a),n=a.hasOwnProperty("selectedItem");var c={};return n&&a.selectedItem!==t.selectedItem&&(o=a.selectedItem),a.type=a.type||0,Object.keys(a).forEach((function(e){t[e]!==a[e]&&(u[e]=a[e]),"type"!==e&&(a[e],Q(i.props,e)||(c[e]=a[e]))})),s&&a.hasOwnProperty("inputValue")&&i.props.onInputValueChange(a.inputValue,r({},i.getStateAndHelpers(),a)),c}),(function(){B(t)(),Object.keys(u).length>1&&i.props.onStateChange(u,i.getStateAndHelpers()),n&&i.props.onSelect(e.selectedItem,i.getStateAndHelpers()),void 0!==o&&i.props.onChange(o,i.getStateAndHelpers()),i.props.onUserAction(u,i.getStateAndHelpers())}))},i.rootRef=function(e){return i._rootNode=e},i.getRootProps=function(e,t){var o,u=void 0===e?{}:e,s=u.refKey,a=void 0===s?"ref":s,c=u.ref,l=n(u,se),d=(void 0===t?{}:t).suppressRefError,p=void 0!==d&&d;i.getRootProps.called=!0,i.getRootProps.refKey=a,i.getRootProps.suppressRefError=p;var f=i.getState().isOpen;return r(((o={})[a]=W(c,i.rootRef),o.role="combobox",o["aria-expanded"]=f,o["aria-haspopup"]="listbox",o["aria-owns"]=f?i.menuId:null,o["aria-labelledby"]=i.labelId,o),l)},i.keyDownHandlers={ArrowDown:function(e){var t=this;if(e.preventDefault(),this.getState().isOpen){var n=e.shiftKey?5:1;this.moveHighlightedIndex(n,{type:4})}else this.internalSetState({isOpen:!0,type:4},(function(){var e=t.getItemCount();if(e>0){var n=ee(1,t.getState().highlightedIndex,e,(function(e){return t.getItemNodeFromIndex(e)}));t.setHighlightedIndex(n,{type:4})}}))},ArrowUp:function(e){var t=this;if(e.preventDefault(),this.getState().isOpen){var n=e.shiftKey?-5:-1;this.moveHighlightedIndex(n,{type:3})}else this.internalSetState({isOpen:!0,type:3},(function(){var e=t.getItemCount();if(e>0){var n=ee(-1,t.getState().highlightedIndex,e,(function(e){return t.getItemNodeFromIndex(e)}));t.setHighlightedIndex(n,{type:3})}}))},Enter:function(e){if(229!==e.which){var t=this.getState(),n=t.isOpen,r=t.highlightedIndex;if(n&&null!=r){e.preventDefault();var o=this.items[r],i=this.getItemNodeFromIndex(r);if(null==o||i&&i.hasAttribute("disabled"))return;this.selectHighlightedItem({type:6})}}},Escape:function(e){e.preventDefault(),this.reset({type:5,selectedItem:null,inputValue:""})}},i.buttonKeyDownHandlers=r({},i.keyDownHandlers,{" ":function(e){e.preventDefault(),this.toggleMenu({type:12})}}),i.inputKeyDownHandlers=r({},i.keyDownHandlers,{Home:function(e){var t=this;e.preventDefault();var n=this.getItemCount(),r=this.getState().isOpen;if(!(n<=0)&&r){var o=te(1,0,n,(function(e){return t.getItemNodeFromIndex(e)}),!1);this.setHighlightedIndex(o,{type:7})}},End:function(e){var t=this;e.preventDefault();var n=this.getItemCount(),r=this.getState().isOpen;if(!(n<=0)&&r){var o=te(-1,n-1,n,(function(e){return t.getItemNodeFromIndex(e)}),!1);this.setHighlightedIndex(o,{type:8})}}}),i.getToggleButtonProps=function(e){var t=void 0===e?{}:e,o=t.onClick;t.onPress;var u=t.onKeyDown,s=t.onKeyUp,a=t.onBlur,c=n(t,ae),l=i.getState().isOpen,d={onClick:U(o,i.buttonHandleClick),onKeyDown:U(u,i.buttonHandleKeyDown),onKeyUp:U(s,i.buttonHandleKeyUp),onBlur:U(a,i.buttonHandleBlur)};return r({type:"button",role:"button","aria-label":l?"close menu":"open menu","aria-haspopup":!0,"data-toggle":!0},c.disabled?{}:d,c)},i.buttonHandleKeyUp=function(e){e.preventDefault()},i.buttonHandleKeyDown=function(e){var t=Z(e);i.buttonKeyDownHandlers[t]&&i.buttonKeyDownHandlers[t].call(o(i),e)},i.buttonHandleClick=function(e){e.preventDefault(),i.props.environment.document.activeElement===i.props.environment.document.body&&e.target.focus(),i.internalSetTimeout((function(){return i.toggleMenu({type:13})}))},i.buttonHandleBlur=function(e){var t=e.target;i.internalSetTimeout((function(){i.isMouseDown||null!=i.props.environment.document.activeElement&&i.props.environment.document.activeElement.id===i.inputId||i.props.environment.document.activeElement===t||i.reset({type:14})}))},i.getLabelProps=function(e){return r({htmlFor:i.inputId,id:i.labelId},e)},i.getInputProps=function(e){var t=void 0===e?{}:e,o=t.onKeyDown,u=t.onBlur,s=t.onChange,a=t.onInput;t.onChangeText;var c=n(t,ce),l={};var d,p=i.getState(),f=p.inputValue,h=p.isOpen,g=p.highlightedIndex;c.disabled||((d={}).onChange=U(s,a,i.inputHandleChange),d.onKeyDown=U(o,i.inputHandleKeyDown),d.onBlur=U(u,i.inputHandleBlur),l=d);return r({"aria-autocomplete":"list","aria-activedescendant":h&&"number"==typeof g&&g>=0?i.getItemId(g):null,"aria-controls":h?i.menuId:null,"aria-labelledby":i.labelId,autoComplete:"off",value:f,id:i.inputId},l,c)},i.inputHandleKeyDown=function(e){var t=Z(e);t&&i.inputKeyDownHandlers[t]&&i.inputKeyDownHandlers[t].call(o(i),e)},i.inputHandleChange=function(e){i.internalSetState({type:11,isOpen:!0,inputValue:e.target.value,highlightedIndex:i.props.defaultHighlightedIndex})},i.inputHandleBlur=function(){i.internalSetTimeout((function(){var e=i.props.environment.document&&!!i.props.environment.document.activeElement&&!!i.props.environment.document.activeElement.dataset&&i.props.environment.document.activeElement.dataset.toggle&&i._rootNode&&i._rootNode.contains(i.props.environment.document.activeElement);i.isMouseDown||e||i.reset({type:10})}))},i.menuRef=function(e){i._menuNode=e},i.getMenuProps=function(e,t){var o,u=void 0===e?{}:e,s=u.refKey,a=void 0===s?"ref":s,c=u.ref,l=n(u,le),d=(void 0===t?{}:t).suppressRefError,p=void 0!==d&&d;return i.getMenuProps.called=!0,i.getMenuProps.refKey=a,i.getMenuProps.suppressRefError=p,r(((o={})[a]=W(c,i.menuRef),o.role="listbox",o["aria-labelledby"]=l&&l["aria-label"]?null:i.labelId,o.id=i.menuId,o),l)},i.getItemProps=function(e){var t,o=void 0===e?{}:e,u=o.onMouseMove,s=o.onMouseDown,a=o.onClick;o.onPress;var c=o.index,l=o.item,d=void 0===l?void 0:l,p=n(o,de);void 0===c?(i.items.push(d),c=i.items.indexOf(d)):i.items[c]=d;var f=a,h=((t={onMouseMove:U(u,(function(){c!==i.getState().highlightedIndex&&(i.setHighlightedIndex(c,{type:2}),i.avoidScrolling=!0,i.internalSetTimeout((function(){return i.avoidScrolling=!1}),250))})),onMouseDown:U(s,(function(e){e.preventDefault()}))}).onClick=U(f,(function(){i.selectItemAtIndex(c,{type:9})})),t),g=p.disabled?{onMouseDown:h.onMouseDown}:h;return r({id:i.getItemId(c),role:"option","aria-selected":i.getState().highlightedIndex===c},g,p)},i.clearItems=function(){i.items=[]},i.reset=function(e,t){void 0===e&&(e={}),e=G(e),i.internalSetState((function(t){var n=t.selectedItem;return r({isOpen:i.props.defaultIsOpen,highlightedIndex:i.props.defaultHighlightedIndex,inputValue:i.props.itemToString(n)},e)}),t)},i.toggleMenu=function(e,t){void 0===e&&(e={}),e=G(e),i.internalSetState((function(t){var n=t.isOpen;return r({isOpen:!n},n&&{highlightedIndex:i.props.defaultHighlightedIndex},e)}),(function(){var n=i.getState(),r=n.isOpen,o=n.highlightedIndex;r&&i.getItemCount()>0&&"number"==typeof o&&i.setHighlightedIndex(o,e),B(t)()}))},i.openMenu=function(e){i.internalSetState({isOpen:!0},e)},i.closeMenu=function(e){i.internalSetState({isOpen:!1},e)},i.updateStatus=$((function(){var e=i.getState(),t=i.items[e.highlightedIndex],n=i.getItemCount(),o=i.props.getA11yStatusMessage(r({itemToString:i.props.itemToString,previousResultCount:i.previousResultCount,resultCount:n,highlightedItem:t},e));i.previousResultCount=n,oe(o,i.props.environment.document)}),200);var u=i.props,s=u.defaultHighlightedIndex,a=u.initialHighlightedIndex,c=void 0===a?s:a,l=u.defaultIsOpen,d=u.initialIsOpen,p=void 0===d?l:d,f=u.initialInputValue,h=void 0===f?"":f,g=u.initialSelectedItem,m=void 0===g?null:g,I=i.getState({highlightedIndex:c,isOpen:p,inputValue:h,selectedItem:m});return null!=I.selectedItem&&void 0===i.props.initialInputValue&&(I.inputValue=i.props.itemToString(I.selectedItem)),i.state=I,i}s=e,(u=a).prototype=Object.create(s.prototype),u.prototype.constructor=u,i(u,s);var c=a.prototype;return c.internalClearTimeouts=function(){this.timeoutIds.forEach((function(e){clearTimeout(e)})),this.timeoutIds=[]},c.getState=function(e){return void 0===e&&(e=this.state),J(e,this.props)},c.getItemCount=function(){var e=this.items.length;return null!=this.itemCount?e=this.itemCount:void 0!==this.props.itemCount&&(e=this.props.itemCount),e},c.getItemNodeFromIndex=function(e){return this.props.environment.document.getElementById(this.getItemId(e))},c.scrollHighlightedItemIntoView=function(){var e=this.getItemNodeFromIndex(this.getState().highlightedIndex);this.props.scrollIntoView(e,this._menuNode)},c.moveHighlightedIndex=function(e,t){var n=this,r=this.getItemCount(),o=this.getState().highlightedIndex;if(r>0){var i=ee(e,o,r,(function(e){return n.getItemNodeFromIndex(e)}));this.setHighlightedIndex(i,t)}},c.getStateAndHelpers=function(){var e=this.getState(),t=e.highlightedIndex,n=e.inputValue,r=e.selectedItem,o=e.isOpen,i=this.props.itemToString,u=this.id,s=this.getRootProps,a=this.getToggleButtonProps,c=this.getLabelProps,l=this.getMenuProps,d=this.getInputProps,p=this.getItemProps,f=this.openMenu,h=this.closeMenu,g=this.toggleMenu,m=this.selectItem,I=this.selectItemAtIndex,v=this.selectHighlightedItem,y=this.setHighlightedIndex,b=this.clearSelection,x=this.clearItems;return{getRootProps:s,getToggleButtonProps:a,getLabelProps:c,getMenuProps:l,getInputProps:d,getItemProps:p,reset:this.reset,openMenu:f,closeMenu:h,toggleMenu:g,selectItem:m,selectItemAtIndex:I,selectHighlightedItem:v,setHighlightedIndex:y,clearSelection:b,clearItems:x,setItemCount:this.setItemCount,unsetItemCount:this.unsetItemCount,setState:this.internalSetState,itemToString:i,id:u,highlightedIndex:t,inputValue:n,isOpen:o,selectedItem:r}},c.componentDidMount=function(){var e=this,t=function(){e.isMouseDown=!0},n=function(t){e.isMouseDown=!1,!ne(t.target,[e._rootNode,e._menuNode],e.props.environment.document)&&e.getState().isOpen&&e.reset({type:1},(function(){return e.props.onOuterClick(e.getStateAndHelpers())}))},r=function(){e.isTouchMove=!1},o=function(){e.isTouchMove=!0},i=function(t){var n=ne(t.target,[e._rootNode,e._menuNode],e.props.environment.document,!1);e.isTouchMove||n||!e.getState().isOpen||e.reset({type:16},(function(){return e.props.onOuterClick(e.getStateAndHelpers())}))},u=this.props.environment;u.addEventListener("mousedown",t),u.addEventListener("mouseup",n),u.addEventListener("touchstart",r),u.addEventListener("touchmove",o),u.addEventListener("touchend",i),this.cleanup=function(){e.internalClearTimeouts(),e.updateStatus.cancel(),u.removeEventListener("mousedown",t),u.removeEventListener("mouseup",n),u.removeEventListener("touchstart",r),u.removeEventListener("touchmove",o),u.removeEventListener("touchend",i)}},c.shouldScroll=function(e,t){var n=(void 0===this.props.highlightedIndex?this.getState():this.props).highlightedIndex,r=(void 0===t.highlightedIndex?e:t).highlightedIndex;return n&&this.getState().isOpen&&!e.isOpen||n!==r},c.componentDidUpdate=function(e,t){Q(this.props,"selectedItem")&&this.props.selectedItemChanged(e.selectedItem,this.props.selectedItem)&&this.internalSetState({type:15,inputValue:this.props.itemToString(this.props.selectedItem)}),!this.avoidScrolling&&this.shouldScroll(t,e)&&this.scrollHighlightedItemIntoView(),this.updateStatus()},c.componentWillUnmount=function(){this.cleanup()},c.render=function(){var e=Y(this.props.children,L);this.clearItems(),this.getRootProps.called=!1,this.getRootProps.refKey=void 0,this.getRootProps.suppressRefError=void 0,this.getMenuProps.called=!1,this.getMenuProps.refKey=void 0,this.getMenuProps.suppressRefError=void 0,this.getLabelProps.called=!1,this.getInputProps.called=!1;var n=Y(e(this.getStateAndHelpers()));return n?this.getRootProps.called||this.props.suppressRefError?n:function(e){return"string"==typeof e.type}(n)?t.cloneElement(n,this.getRootProps(function(e){return e.props}(n))):void 0:null},a}(t.Component);return e.defaultProps={defaultHighlightedIndex:null,defaultIsOpen:!1,getA11yStatusMessage:q,itemToString:function(e){return null==e?"":String(e)},onStateChange:L,onInputValueChange:L,onUserAction:L,onChange:L,onSelect:L,onOuterClick:L,selectedItemChanged:function(e,t){return e!==t},environment:"undefined"==typeof window?{}:window,stateReducer:function(e,t){return t},suppressRefError:!1,scrollIntoView:_},e.stateChangeTypes=ue,e}(),fe=pe,he={highlightedIndex:-1,isOpen:!1,selectedItem:null,inputValue:""};function ge(e,t,n){var o=e.props,i=e.type,u={};Object.keys(t).forEach((function(e){!function(e,t,n,r){var o="on"+be(e)+"Change";t[o]&&void 0!==r[e]&&r[e]!==n[e]&&t[o](r)}(e,o,t,n),n[e]!==t[e]&&(u[e]=n[e])})),o.onStateChange&&Object.keys(u).length&&o.onStateChange(r({type:i},u))}var me=$((function(e,t){oe(e(),t)}),200);function Ie(e){var t=e.id,n=e.labelId,r=e.menuId,o=e.getItemId,i=e.toggleButtonId,u=void 0===t?"downshift-"+z():t;return{labelId:n||u+"-label",menuId:r||u+"-menu",getItemId:o||function(e){return u+"-item-"+e},toggleButtonId:i||u+"-toggle-button"}}function ve(e,t,n){return void 0!==e?e:0===n.length?-1:n.indexOf(t)}function ye(e){return/^\S{1}$/.test(e)}function be(e){return""+e.slice(0,1).toUpperCase()+e.slice(1)}function xe(e){var n=t.useRef(e);return n.current=e,n}function we(e,n,o,i){var u=t.useRef(),s=t.useRef(),a=t.useCallback((function(t,n){s.current=n,t=J(t,n.props);var o=e(t,n);return n.props.stateReducer(t,r({},n,{changes:o}))}),[e]),c=t.useReducer(a,n),l=c[0],d=c[1],p=xe(o),f=t.useCallback((function(e){return d(r({props:p.current},e))}),[p]),h=s.current;return t.useEffect((function(){h&&u.current&&!i(u.current,l)&&ge(h,J(u.current,h.props),l),u.current=l}),[l,h,i]),[l,f]}function Se(e,t,n,r){var o=we(e,t,n,r),i=o[0],u=o[1];return[J(i,n),u]}var Ce={itemToString:function(e){return e?String(e):""},stateReducer:function(e,t){return t.changes},getA11ySelectionMessage:function(e){var t=e.selectedItem,n=e.itemToString;return t?n(t)+" has been selected.":""},scrollIntoView:_,circularNavigation:!1,environment:"undefined"==typeof window?{}:window};function ke(e,t,n){void 0===n&&(n=he);var r="default"+be(t);return r in e?e[r]:n[t]}function Oe(e,t,n){if(void 0===n&&(n=he),t in e)return e[t];var r="initial"+be(t);return r in e?e[r]:ke(e,t,n)}function Me(e){var t=Oe(e,"selectedItem"),n=Oe(e,"isOpen"),r=Oe(e,"highlightedIndex"),o=Oe(e,"inputValue");return{highlightedIndex:r<0&&t?e.items.indexOf(t):r,isOpen:n,selectedItem:t,inputValue:o}}function Ee(e,t,n,r){var o=e.items,i=e.initialHighlightedIndex,u=e.defaultHighlightedIndex,s=t.selectedItem,a=t.highlightedIndex;return 0===o.length?-1:void 0!==i&&a===i?i:void 0!==u?u:s?0===n?o.indexOf(s):ee(n,o.indexOf(s),o.length,r,!1):0===n?-1:n<0?o.length-1:0}function De(e,n,r,o){var i=t.useRef({isMouseDown:!1,isTouchMove:!1});return t.useEffect((function(){var t=function(){i.current.isMouseDown=!0},u=function(t){i.current.isMouseDown=!1,e&&!ne(t.target,n.map((function(e){return e.current})),r.document)&&o()},s=function(){i.current.isTouchMove=!1},a=function(){i.current.isTouchMove=!0},c=function(t){!e||i.current.isTouchMove||ne(t.target,n.map((function(e){return e.current})),r.document,!1)||o()};return r.addEventListener("mousedown",t),r.addEventListener("mouseup",u),r.addEventListener("touchstart",s),r.addEventListener("touchmove",a),r.addEventListener("touchend",c),function(){r.removeEventListener("mousedown",t),r.removeEventListener("mouseup",u),r.removeEventListener("touchstart",s),r.removeEventListener("touchmove",a),r.removeEventListener("touchend",c)}}),[e,r]),i}function Ke(){for(var e=arguments.length,n=new Array(e),r=0;r=0&&{selectedItem:i.items[c]});break;case qe:n={highlightedIndex:Ee(i,e,1,t.getItemNodeFromIndex),isOpen:!0};break;case Ye:n={highlightedIndex:Ee(i,e,-1,t.getItemNodeFromIndex),isOpen:!0};break;case Be:case Le:n=r({isOpen:ke(i,"isOpen"),highlightedIndex:ke(i,"highlightedIndex")},e.highlightedIndex>=0&&{selectedItem:i.items[e.highlightedIndex]});break;case Fe:n={highlightedIndex:te(1,0,i.items.length,t.getItemNodeFromIndex,!1)};break;case Ne:n={highlightedIndex:te(-1,i.items.length-1,i.items.length,t.getItemNodeFromIndex,!1)};break;case Ae:case je:n={isOpen:!1,highlightedIndex:-1};break;case _e:var l=t.key,d=""+e.inputValue+l,p=Re(d,e.highlightedIndex,i.items,i.itemToString,t.getItemNodeFromIndex);n=r({inputValue:d},p>=0&&{highlightedIndex:p});break;case He:n={highlightedIndex:ee(u?5:1,e.highlightedIndex,i.items.length,t.getItemNodeFromIndex,i.circularNavigation)};break;case Ve:n={highlightedIndex:ee(u?-5:-1,e.highlightedIndex,i.items.length,t.getItemNodeFromIndex,i.circularNavigation)};break;case $e:n={highlightedIndex:-1};break;case ze:case Ge:n={isOpen:!e.isOpen,highlightedIndex:e.isOpen?-1:Ee(i,e,0)};break;case Je:n={isOpen:!0,highlightedIndex:Ee(i,e,0)};break;case Qe:n={isOpen:!1};break;case Ze:n={highlightedIndex:t.highlightedIndex};break;case et:n={selectedItem:t.selectedItem};break;case tt:n={inputValue:t.inputValue};break;case nt:n={highlightedIndex:ke(i,"highlightedIndex"),isOpen:ke(i,"isOpen"),selectedItem:ke(i,"selectedItem"),inputValue:ke(i,"inputValue")};break;default:throw new Error("Reducer called without proper action type.")}return r({},e,n)}var it=["onMouseLeave","refKey","onKeyDown","onBlur","ref"],ut=["onClick","onKeyDown","refKey","ref"],st=["item","index","onMouseMove","onClick","refKey","ref"];function at(e){void 0===e&&(e={});var o=r({},Te,e),i=o.items,u=o.scrollIntoView,s=o.environment,a=o.initialIsOpen,c=o.defaultIsOpen,l=o.itemToString,d=o.getA11ySelectionMessage,p=o.getA11yStatusMessage,f=Se(ot,Me(o),o,Pe),h=f[0],g=f[1],m=h.isOpen,I=h.highlightedIndex,v=h.selectedItem,y=h.inputValue,b=t.useRef(null),x=t.useRef(null),w=t.useRef();w.current={};var S=t.useRef(!0),C=t.useRef(!0),k=t.useRef(null),O=t.useRef(Ie(o)),M=t.useRef(),E=t.useRef(!0),D=t.useRef(o),K=xe({state:h,props:o}),P=function(e){return w.current[O.current.getItemId(e)]};t.useEffect((function(){if(!E.current){var e=M.current;me((function(){return p({isOpen:m,highlightedIndex:I,selectedItem:v,inputValue:y,highlightedItem:i[I],resultCount:i.length,itemToString:l,previousResultCount:e})}),s.document)}}),[m,I,y,i]),t.useEffect((function(){if(!E.current){var e=M.current;me((function(){return d({isOpen:m,highlightedIndex:I,selectedItem:v,inputValue:y,highlightedItem:i[I],resultCount:i.length,itemToString:l,previousResultCount:e})}),s.document)}}),[v]),t.useEffect((function(){E.current&&(k.current=$((function(e){e({type:tt,inputValue:""})}),500)),y&&k.current(g)}),[y]),t.useEffect((function(){E.current?(a||c||m)&&x.current&&x.current.focus():m?x.current&&x.current.focus():s.document.activeElement===x.current&&b.current&&(C.current=!1,b.current.focus())}),[m]),t.useEffect((function(){I<0||!m||!Object.keys(w.current).length||(!1===S.current?S.current=!0:u(P(I),x.current))}),[I]),t.useEffect((function(){E.current||(M.current=i.length)})),t.useEffect((function(){E.current||(D.current,D.current=o)}),[h,o]);var R=De(m,[x,b],s,(function(){g({type:je})})),T=Ke("getMenuProps","getToggleButtonProps");t.useEffect((function(){E.current=!1}),[]);var H=t.useMemo((function(){return{ArrowDown:function(e){e.preventDefault(),g({type:qe,getItemNodeFromIndex:P,shiftKey:e.shiftKey})},ArrowUp:function(e){e.preventDefault(),g({type:Ye,getItemNodeFromIndex:P,shiftKey:e.shiftKey})}}}),[g]),V=t.useMemo((function(){return{ArrowDown:function(e){e.preventDefault(),g({type:He,getItemNodeFromIndex:P,shiftKey:e.shiftKey})},ArrowUp:function(e){e.preventDefault(),g({type:Ve,getItemNodeFromIndex:P,shiftKey:e.shiftKey})},Home:function(e){e.preventDefault(),g({type:Fe,getItemNodeFromIndex:P})},End:function(e){e.preventDefault(),g({type:Ne,getItemNodeFromIndex:P})},Escape:function(){g({type:Ae})},Enter:function(e){e.preventDefault(),g({type:Be})}," ":function(e){e.preventDefault(),g({type:Le})}}}),[g]),A=t.useCallback((function(){g({type:Ge})}),[g]),F=t.useCallback((function(){g({type:Qe})}),[g]),N=t.useCallback((function(){g({type:Je})}),[g]),B=t.useCallback((function(e){g({type:Ze,highlightedIndex:e})}),[g]),L=t.useCallback((function(e){g({type:et,selectedItem:e})}),[g]),_=t.useCallback((function(){g({type:nt})}),[g]),j=t.useCallback((function(e){g({type:tt,inputValue:e})}),[g]),z=t.useCallback((function(e){return r({id:O.current.labelId,htmlFor:O.current.toggleButtonId},e)}),[]),q=t.useCallback((function(e,t){var o,i=void 0===e?{}:e,u=i.onMouseLeave,s=i.refKey,a=void 0===s?"ref":s,c=i.onKeyDown,l=i.onBlur,d=i.ref,p=n(i,it),f=(void 0===t?{}:t).suppressRefError,h=void 0!==f&&f,m=K.current.state;return T("getMenuProps",h,a,x),r(((o={})[a]=W(d,(function(e){x.current=e})),o.id=O.current.menuId,o.role="listbox",o["aria-labelledby"]=O.current.labelId,o.tabIndex=-1,o),m.isOpen&&m.highlightedIndex>-1&&{"aria-activedescendant":O.current.getItemId(m.highlightedIndex)},{onMouseLeave:U(u,(function(){g({type:$e})})),onKeyDown:U(c,(function(e){var t=Z(e);t&&V[t]?V[t](e):ye(t)&&g({type:_e,key:t,getItemNodeFromIndex:P})})),onBlur:U(l,(function(){!1!==C.current?!R.current.isMouseDown&&g({type:je}):C.current=!0}))},p)}),[g,K,V,R,T]);return{getToggleButtonProps:t.useCallback((function(e,t){var o,i=void 0===e?{}:e,u=i.onClick,s=i.onKeyDown,a=i.refKey,c=void 0===a?"ref":a,l=i.ref,d=n(i,ut),p=(void 0===t?{}:t).suppressRefError,f=void 0!==p&&p,h=r(((o={})[c]=W(l,(function(e){b.current=e})),o.id=O.current.toggleButtonId,o["aria-haspopup"]="listbox",o["aria-expanded"]=K.current.state.isOpen,o["aria-labelledby"]=O.current.labelId+" "+O.current.toggleButtonId,o),d);return d.disabled||(h.onClick=U(u,(function(){g({type:ze})})),h.onKeyDown=U(s,(function(e){var t=Z(e);t&&H[t]?H[t](e):ye(t)&&g({type:Xe,key:t,getItemNodeFromIndex:P})}))),T("getToggleButtonProps",f,c,b),h}),[g,K,H,T]),getLabelProps:z,getMenuProps:q,getItemProps:t.useCallback((function(e){var t,o=void 0===e?{}:e,i=o.item,u=o.index,s=o.onMouseMove,a=o.onClick,c=o.refKey,l=void 0===c?"ref":c,d=o.ref,p=n(o,st),f=K.current,h=f.state,m=f.props,I=ve(u,i,m.items);if(I<0)throw new Error("Pass either item or item index in getItemProps!");var v=r(((t={role:"option","aria-selected":""+(I===h.highlightedIndex),id:O.current.getItemId(I)})[l]=W(d,(function(e){e&&(w.current[O.current.getItemId(I)]=e)})),t),p);return p.disabled||(v.onMouseMove=U(s,(function(){u!==h.highlightedIndex&&(S.current=!1,g({type:Ue,index:u}))})),v.onClick=U(a,(function(){g({type:We,index:u})}))),v}),[g,K]),toggleMenu:A,openMenu:N,closeMenu:F,setHighlightedIndex:B,selectItem:L,reset:_,setInputValue:j,highlightedIndex:I,isOpen:m,selectedItem:v,inputValue:y}}at.stateChangeTypes=rt;var ct=0,lt=1,dt=2,pt=3,ft=4,ht=5,gt=6,mt=7,It=8,vt=9,yt=10,bt=11,xt=12,wt=13,St=14,Ct=15,kt=16,Ot=17,Mt=18,Et=19,Dt=Object.freeze({__proto__:null,InputKeyDownArrowDown:ct,InputKeyDownArrowUp:lt,InputKeyDownEscape:dt,InputKeyDownHome:pt,InputKeyDownEnd:ft,InputKeyDownEnter:ht,InputChange:gt,InputBlur:mt,MenuMouseLeave:It,ItemMouseMove:vt,ItemClick:yt,ToggleButtonClick:bt,FunctionToggleMenu:xt,FunctionOpenMenu:wt,FunctionCloseMenu:St,FunctionSetHighlightedIndex:Ct,FunctionSelectItem:kt,FunctionSetInputValue:Ot,FunctionReset:Mt,ControlledPropUpdatedSelectedItem:Et}),Kt=["id","inputId"];T.array.isRequired,T.func,T.func,T.func,T.bool,T.number,T.number,T.number,T.bool,T.bool,T.bool,T.any,T.any,T.any,T.string,T.string,T.string,T.string,T.string,T.string,T.func,T.string,T.string,T.func,T.func,T.func,T.func,T.func,T.func,T.shape({addEventListener:T.func,removeEventListener:T.func,document:T.shape({getElementById:T.func,activeElement:T.any,body:T.any})});var Pt=r({},Ce,{getA11yStatusMessage:q,circularNavigation:!0});function Rt(e,t){var n,o=t.type,i=t.props,u=t.shiftKey;switch(o){case vt:n={highlightedIndex:t.index};break;case yt:n={isOpen:ke(i,"isOpen"),highlightedIndex:ke(i,"highlightedIndex"),selectedItem:i.items[t.index],inputValue:i.itemToString(i.items[t.index])};break;case ct:n=e.isOpen?{highlightedIndex:ee(u?5:1,e.highlightedIndex,i.items.length,t.getItemNodeFromIndex,i.circularNavigation)}:{highlightedIndex:Ee(i,e,1,t.getItemNodeFromIndex),isOpen:!0};break;case lt:n=e.isOpen?{highlightedIndex:ee(u?-5:-1,e.highlightedIndex,i.items.length,t.getItemNodeFromIndex,i.circularNavigation)}:{highlightedIndex:Ee(i,e,-1,t.getItemNodeFromIndex),isOpen:!0};break;case ht:n=r({},e.highlightedIndex>=0&&{selectedItem:i.items[e.highlightedIndex],isOpen:ke(i,"isOpen"),highlightedIndex:ke(i,"highlightedIndex"),inputValue:i.itemToString(i.items[e.highlightedIndex])});break;case dt:n={isOpen:!1,selectedItem:null,highlightedIndex:-1,inputValue:""};break;case pt:n={highlightedIndex:te(1,0,i.items.length,t.getItemNodeFromIndex,!1)};break;case ft:n={highlightedIndex:te(-1,i.items.length-1,i.items.length,t.getItemNodeFromIndex,!1)};break;case mt:n=r({isOpen:!1},e.highlightedIndex>=0&&{selectedItem:i.items[e.highlightedIndex],inputValue:i.itemToString(i.items[e.highlightedIndex]),highlightedIndex:-1});break;case gt:n={isOpen:!0,highlightedIndex:ke(i,"highlightedIndex"),inputValue:t.inputValue};break;case It:n={highlightedIndex:-1};break;case bt:case xt:n={isOpen:!e.isOpen,highlightedIndex:e.isOpen?-1:Ee(i,e,0)};break;case wt:n={isOpen:!0,highlightedIndex:Ee(i,e,0)};break;case St:n={isOpen:!1};break;case Ct:n={highlightedIndex:t.highlightedIndex};break;case kt:n={selectedItem:t.selectedItem,inputValue:i.itemToString(t.selectedItem)};break;case Et:case Ot:n={inputValue:t.inputValue};break;case Mt:n={highlightedIndex:ke(i,"highlightedIndex"),isOpen:ke(i,"isOpen"),selectedItem:ke(i,"selectedItem"),inputValue:ke(i,"inputValue")};break;default:throw new Error("Reducer called without proper action type.")}return r({},e,n)}var Tt=["onMouseLeave","refKey","ref"],Ht=["item","index","refKey","ref","onMouseMove","onClick","onPress"],Vt=["onClick","onPress","refKey","ref"],At=["onKeyDown","onChange","onInput","onBlur","onChangeText","refKey","ref"],Ft=["refKey","ref"];function Nt(e){void 0===e&&(e={});var o=r({},Pt,e),i=o.initialIsOpen,u=o.defaultIsOpen,s=o.items,a=o.scrollIntoView,c=o.environment,l=o.getA11yStatusMessage,d=o.getA11ySelectionMessage,p=o.itemToString,f=function(e){var t=Me(e),n=t.selectedItem,o=t.inputValue;return""===o&&n&&void 0===e.defaultInputValue&&void 0===e.initialInputValue&&void 0===e.inputValue&&(o=e.itemToString(n)),r({},t,{inputValue:o})}(o),h=function(e,n,r){var o=t.useRef(),i=we(e,n,r),u=i[0],s=i[1];return Q(r,"selectedItem")&&(o.current!==r.selectedItem&&s({type:Et,inputValue:r.itemToString(r.selectedItem)}),o.current=u.selectedItem===o.current?r.selectedItem:u.selectedItem),[J(u,r),s]}(Rt,f,o),g=h[0],m=h[1],I=g.isOpen,v=g.highlightedIndex,y=g.selectedItem,b=g.inputValue,x=t.useRef(null),w=t.useRef(),S=t.useRef(null),C=t.useRef(null),k=t.useRef(null);w.current={};var O,M,E,D,K,P=t.useRef(!0),R=t.useRef(!0),T=t.useRef((M=(O=o).id,E=O.inputId,D=n(O,Kt),K=void 0===M?"downshift-"+z():M,r({inputId:E||K+"-input"},Ie(r({id:M},D))))),H=t.useRef(),V=t.useRef(o),A=xe({state:g,props:o}),F=function(e){return w.current[T.current.getItemId(e)]};t.useEffect((function(){if(!R.current){var e=H.current;me((function(){return l({isOpen:I,highlightedIndex:v,selectedItem:y,inputValue:b,highlightedItem:s[v],resultCount:s.length,itemToString:p,previousResultCount:e})}),c.document)}}),[I,v,b,s]),t.useEffect((function(){if(!R.current){var e=H.current;me((function(){return d({isOpen:I,highlightedIndex:v,selectedItem:y,inputValue:b,highlightedItem:s[v],resultCount:s.length,itemToString:p,previousResultCount:e})}),c.document)}}),[y]),t.useEffect((function(){v<0||!I||!Object.keys(w.current).length||(!1===P.current?P.current=!0:a(F(v),x.current))}),[v]),t.useEffect((function(){R.current&&(i||u||I)&&S.current&&S.current.focus()}),[I]),t.useEffect((function(){R.current||(H.current=s.length)})),t.useEffect((function(){R.current||(V.current,V.current=o)}),[g,o]);var N=De(I,[k,x,C],c,(function(){m({type:mt})})),B=Ke("getInputProps","getComboboxProps","getMenuProps");t.useEffect((function(){R.current=!1}),[]);var L=t.useMemo((function(){return{ArrowDown:function(e){e.preventDefault(),m({type:ct,shiftKey:e.shiftKey,getItemNodeFromIndex:F})},ArrowUp:function(e){e.preventDefault(),m({type:lt,shiftKey:e.shiftKey,getItemNodeFromIndex:F})},Home:function(e){e.preventDefault(),m({type:pt,getItemNodeFromIndex:F})},End:function(e){e.preventDefault(),m({type:ft,getItemNodeFromIndex:F})},Escape:function(){m({type:dt})},Enter:function(e){if(229!==e.which){var t=A.current.state;t.isOpen&&t.highlightedIndex>-1&&(e.preventDefault(),m({type:ht,getItemNodeFromIndex:F}))}}}}),[m,A]),_=t.useCallback((function(e){return r({id:T.current.labelId,htmlFor:T.current.inputId},e)}),[]),j=t.useCallback((function(e,t){var o,i=void 0===e?{}:e,u=i.onMouseLeave,s=i.refKey,a=void 0===s?"ref":s,c=i.ref,l=n(i,Tt),d=(void 0===t?{}:t).suppressRefError;return B("getMenuProps",void 0!==d&&d,a,x),r(((o={})[a]=W(c,(function(e){x.current=e})),o.id=T.current.menuId,o.role="listbox",o["aria-labelledby"]=T.current.labelId,o.onMouseLeave=U(u,(function(){m({type:It})})),o),l)}),[m,B]),$=t.useCallback((function(e){var t,o,i=void 0===e?{}:e,u=i.item,s=i.index,a=i.refKey,c=void 0===a?"ref":a,l=i.ref,d=i.onMouseMove,p=i.onClick;i.onPress;var f=n(i,Ht),h=A.current,g=h.props,I=h.state,v=ve(s,u,g.items);if(v<0)throw new Error("Pass either item or item index in getItemProps!");var y=p;return r(((t={})[c]=W(l,(function(e){e&&(w.current[T.current.getItemId(v)]=e)})),t.role="option",t["aria-selected"]=""+(v===I.highlightedIndex),t.id=T.current.getItemId(v),t),!f.disabled&&((o={onMouseMove:U(d,(function(){s!==I.highlightedIndex&&(P.current=!1,m({type:vt,index:s}))}))}).onClick=U(y,(function(){m({type:yt,index:s})})),o),f)}),[m,A]),q=t.useCallback((function(e){var t,o=void 0===e?{}:e,i=o.onClick;o.onPress;var u=o.refKey,s=void 0===u?"ref":u,a=o.ref,c=n(o,Vt);return r(((t={})[s]=W(a,(function(e){C.current=e})),t.id=T.current.toggleButtonId,t.tabIndex=-1,t),!c.disabled&&r({},{onClick:U(i,(function(){m({type:bt}),!A.current.state.isOpen&&S.current&&S.current.focus()}))}),c)}),[m,A]),Y=t.useCallback((function(e,t){var o,i=void 0===e?{}:e,u=i.onKeyDown,s=i.onChange,a=i.onInput,c=i.onBlur;i.onChangeText;var l=i.refKey,d=void 0===l?"ref":l,p=i.ref,f=n(i,At),h=(void 0===t?{}:t).suppressRefError;B("getInputProps",void 0!==h&&h,d,S);var g,I=A.current.state,v={};f.disabled||((g={}).onChange=U(s,a,(function(e){m({type:gt,inputValue:e.target.value})})),g.onKeyDown=U(u,(function(e){var t=Z(e);t&&L[t]&&L[t](e)})),g.onBlur=U(c,(function(){N.current.isMouseDown||m({type:mt})})),v=g);return r(((o={})[d]=W(p,(function(e){S.current=e})),o.id=T.current.inputId,o["aria-autocomplete"]="list",o["aria-controls"]=T.current.menuId,o),I.isOpen&&I.highlightedIndex>-1&&{"aria-activedescendant":T.current.getItemId(I.highlightedIndex)},{"aria-labelledby":T.current.labelId,autoComplete:"off",value:I.inputValue},v,f)}),[m,L,A,N,B]),X=t.useCallback((function(e,t){var o,i=void 0===e?{}:e,u=i.refKey,s=void 0===u?"ref":u,a=i.ref,c=n(i,Ft),l=(void 0===t?{}:t).suppressRefError;return B("getComboboxProps",void 0!==l&&l,s,k),r(((o={})[s]=W(a,(function(e){k.current=e})),o.role="combobox",o["aria-haspopup"]="listbox",o["aria-owns"]=T.current.menuId,o["aria-expanded"]=A.current.state.isOpen,o),c)}),[A,B]),G=t.useCallback((function(){m({type:xt})}),[m]),ee=t.useCallback((function(){m({type:St})}),[m]),te=t.useCallback((function(){m({type:wt})}),[m]),ne=t.useCallback((function(e){m({type:Ct,highlightedIndex:e})}),[m]),re=t.useCallback((function(e){m({type:kt,selectedItem:e})}),[m]);return{getItemProps:$,getLabelProps:_,getMenuProps:j,getInputProps:Y,getComboboxProps:X,getToggleButtonProps:q,toggleMenu:G,openMenu:te,closeMenu:ee,setHighlightedIndex:ne,setInputValue:t.useCallback((function(e){m({type:Ot,inputValue:e})}),[m]),selectItem:re,reset:t.useCallback((function(){m({type:Mt})}),[m]),highlightedIndex:v,isOpen:I,selectedItem:y,inputValue:b}}Nt.stateChangeTypes=Dt;var Bt={activeIndex:-1,selectedItems:[]};function Lt(e,t){return Oe(e,t,Bt)}function _t(e,t){return ke(e,t,Bt)}function jt(e){if(e.shiftKey||e.metaKey||e.ctrlKey||e.altKey)return!1;var t=e.target;return!(t instanceof HTMLInputElement&&""!==t.value)||0===t.selectionStart&&0===t.selectionEnd}T.array,T.array,T.array,T.func,T.func,T.func,T.number,T.number,T.number,T.func,T.func,T.string,T.string,T.shape({addEventListener:T.func,removeEventListener:T.func,document:T.shape({getElementById:T.func,activeElement:T.any,body:T.any})});var $t={itemToString:Ce.itemToString,stateReducer:Ce.stateReducer,environment:Ce.environment,getA11yRemovalMessage:function(e){var t=e.removedSelectedItem;return(0,e.itemToString)(t)+" has been removed."},keyNavigationNext:"ArrowRight",keyNavigationPrevious:"ArrowLeft"},Ut=0,Wt=1,zt=2,qt=3,Yt=4,Xt=5,Gt=6,Jt=7,Qt=8,Zt=9,en=10,tn=11,nn=12,rn=Object.freeze({__proto__:null,SelectedItemClick:Ut,SelectedItemKeyDownDelete:Wt,SelectedItemKeyDownBackspace:zt,SelectedItemKeyDownNavigationNext:qt,SelectedItemKeyDownNavigationPrevious:Yt,DropdownKeyDownNavigationPrevious:Xt,DropdownKeyDownBackspace:Gt,DropdownClick:Jt,FunctionAddSelectedItem:Qt,FunctionRemoveSelectedItem:Zt,FunctionSetSelectedItems:en,FunctionSetActiveIndex:tn,FunctionReset:nn});function on(e,t){var n,o=t.type,i=t.index,u=t.props,s=t.selectedItem,a=e.activeIndex,c=e.selectedItems;switch(o){case Ut:n={activeIndex:i};break;case Yt:n={activeIndex:a-1<0?0:a-1};break;case qt:n={activeIndex:a+1>=c.length?-1:a+1};break;case zt:case Wt:var l=a;1===c.length?l=-1:a===c.length-1&&(l=c.length-2),n=r({selectedItems:[].concat(c.slice(0,a),c.slice(a+1))},{activeIndex:l});break;case Xt:n={activeIndex:c.length-1};break;case Gt:n={selectedItems:c.slice(0,c.length-1)};break;case Qt:n={selectedItems:[].concat(c,[s])};break;case Jt:n={activeIndex:-1};break;case Zt:var d=a,p=c.indexOf(s);1===c.length?d=-1:p===c.length-1&&(d=c.length-2),n=r({selectedItems:[].concat(c.slice(0,p),c.slice(p+1))},{activeIndex:d});break;case en:n={selectedItems:t.selectedItems};break;case tn:n={activeIndex:t.activeIndex};break;case nn:n={activeIndex:_t(u,"activeIndex"),selectedItems:_t(u,"selectedItems")};break;default:throw new Error("Reducer called without proper action type.")}return r({},e,n)}var un=["refKey","ref","onClick","onKeyDown","selectedItem","index"],sn=["refKey","ref","onKeyDown","onClick","preventKeyAction"];function an(e){void 0===e&&(e={});var o=r({},$t,e),i=o.getA11yRemovalMessage,u=o.itemToString,s=o.environment,a=o.keyNavigationNext,c=o.keyNavigationPrevious,l=Se(on,function(e){return{activeIndex:Lt(e,"activeIndex"),selectedItems:Lt(e,"selectedItems")}}(o),o),d=l[0],p=l[1],f=d.activeIndex,h=d.selectedItems,g=t.useRef(!0),m=t.useRef(null),I=t.useRef(h),v=t.useRef();v.current=[];var y=t.useRef(o),b=xe({state:d,props:o});t.useEffect((function(){if(!g.current){if(h.length= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","function t(t){return\"object\"==typeof t&&null!=t&&1===t.nodeType}function e(t,e){return(!e||\"hidden\"!==t)&&\"visible\"!==t&&\"clip\"!==t}function n(t,n){if(t.clientHeighte||o>t&&l=e&&d>=n?o-t-r:l>e&&dn?l-e+i:0}var i=function(e,i){var o=window,l=i.scrollMode,d=i.block,f=i.inline,h=i.boundary,u=i.skipOverflowHiddenElements,s=\"function\"==typeof h?h:function(t){return t!==h};if(!t(e))throw new TypeError(\"Invalid target\");for(var a,c,g=document.scrollingElement||document.documentElement,p=[],m=e;t(m)&&s(m);){if((m=null==(c=(a=m).parentElement)?a.getRootNode().host||null:c)===g){p.push(m);break}null!=m&&m===document.body&&n(m)&&!n(document.documentElement)||null!=m&&n(m,u)&&p.push(m)}for(var w=o.visualViewport?o.visualViewport.width:innerWidth,v=o.visualViewport?o.visualViewport.height:innerHeight,W=window.scrollX||pageXOffset,H=window.scrollY||pageYOffset,b=e.getBoundingClientRect(),y=b.height,E=b.width,M=b.top,V=b.right,x=b.bottom,I=b.left,C=\"start\"===d||\"nearest\"===d?M:\"end\"===d?x:M+y/2,R=\"center\"===f?I+E/2:\"end\"===f?V:I,T=[],k=0;k=0&&I>=0&&x<=v&&V<=w&&M>=Y&&x<=S&&I>=j&&V<=L)return T;var N=getComputedStyle(B),q=parseInt(N.borderLeftWidth,10),z=parseInt(N.borderTopWidth,10),A=parseInt(N.borderRightWidth,10),F=parseInt(N.borderBottomWidth,10),G=0,J=0,K=\"offsetWidth\"in B?B.offsetWidth-B.clientWidth-q-A:0,P=\"offsetHeight\"in B?B.offsetHeight-B.clientHeight-z-F:0,Q=\"offsetWidth\"in B?0===B.offsetWidth?0:X/B.offsetWidth:0,U=\"offsetHeight\"in B?0===B.offsetHeight?0:O/B.offsetHeight:0;if(g===B)G=\"start\"===d?C:\"end\"===d?C-v:\"nearest\"===d?r(H,H+v,v,z,F,H+C,H+C+y,y):C-v/2,J=\"start\"===f?R:\"center\"===f?R-w/2:\"end\"===f?R-w:r(W,W+w,w,q,A,W+R,W+R+E,E),G=Math.max(0,G+H),J=Math.max(0,J+W);else{G=\"start\"===d?C-Y-z:\"end\"===d?C-S+F+P:\"nearest\"===d?r(Y,S,O,z,F+P,C,C+y,y):C-(Y+O/2)+P/2,J=\"start\"===f?R-j-q:\"center\"===f?R-(j+X/2)+K/2:\"end\"===f?R-L+A+K:r(j,L,X,q,A+K,R,R+E,E);var Z=B.scrollLeft,$=B.scrollTop;C+=$-(G=Math.max(0,Math.min($+G/U,B.scrollHeight-O/U+P))),R+=Z-(J=Math.max(0,Math.min(Z+J/Q,B.scrollWidth-X/Q+K)))}T.push({el:B,top:G,left:J})}return T};export{i as default};\n//# sourceMappingURL=index.mjs.map\n","import computeScrollIntoView from 'compute-scroll-into-view'\nimport {isPreact} from './is.macro'\n\nlet idCounter = 0\n\n/**\n * Accepts a parameter and returns it if it's a function\n * or a noop function if it's not. This allows us to\n * accept a callback, but not worry about it if it's not\n * passed.\n * @param {Function} cb the callback\n * @return {Function} a function\n */\nfunction cbToCb(cb) {\n return typeof cb === 'function' ? cb : noop\n}\n\nfunction noop() {}\n\n/**\n * Scroll node into view if necessary\n * @param {HTMLElement} node the element that should scroll into view\n * @param {HTMLElement} menuNode the menu element of the component\n */\nfunction scrollIntoView(node, menuNode) {\n if (!node) {\n return\n }\n\n const actions = computeScrollIntoView(node, {\n boundary: menuNode,\n block: 'nearest',\n scrollMode: 'if-needed',\n })\n actions.forEach(({el, top, left}) => {\n el.scrollTop = top\n el.scrollLeft = left\n })\n}\n\n/**\n * @param {HTMLElement} parent the parent node\n * @param {HTMLElement} child the child node\n * @return {Boolean} whether the parent is the child or the child is in the parent\n */\nfunction isOrContainsNode(parent, child) {\n return parent === child || (parent.contains && parent.contains(child))\n}\n\n/**\n * Simple debounce implementation. Will call the given\n * function once after the time given has passed since\n * it was last called.\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n * @return {Function} the debounced function\n */\nfunction debounce(fn, time) {\n let timeoutId\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n }\n\n function wrapper(...args) {\n cancel()\n timeoutId = setTimeout(() => {\n timeoutId = null\n fn(...args)\n }, time)\n }\n\n wrapper.cancel = cancel\n\n return wrapper\n}\n\n/**\n * This is intended to be used to compose event handlers.\n * They are executed in order until one of them sets\n * `event.preventDownshiftDefault = true`.\n * @param {...Function} fns the event handler functions\n * @return {Function} the event handler to add to an element\n */\nfunction callAllEventHandlers(...fns) {\n return (event, ...args) =>\n fns.some(fn => {\n if (fn) {\n fn(event, ...args)\n }\n return (\n event.preventDownshiftDefault ||\n (event.hasOwnProperty('nativeEvent') &&\n event.nativeEvent.preventDownshiftDefault)\n )\n })\n}\n\nfunction handleRefs(...refs) {\n return node => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n })\n }\n}\n\n/**\n * This generates a unique ID for an instance of Downshift\n * @return {String} the unique ID\n */\nfunction generateId() {\n return String(idCounter++)\n}\n\n/**\n * This is only used in tests\n * @param {Number} num the number to set the idCounter to\n */\nfunction setIdCounter(num) {\n idCounter = num\n}\n\n/**\n * Resets idCounter to 0. Used for SSR.\n */\nfunction resetIdCounter() {\n idCounter = 0\n}\n\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specift if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\nfunction getA11yStatusMessage({isOpen, resultCount, previousResultCount}) {\n if (!isOpen) {\n return ''\n }\n\n if (!resultCount) {\n return 'No results are available.'\n }\n\n if (resultCount !== previousResultCount) {\n return `${resultCount} result${\n resultCount === 1 ? ' is' : 's are'\n } available, use up and down arrow keys to navigate. Press Enter key to select.`\n }\n\n return ''\n}\n\n/**\n * Takes an argument and if it's an array, returns the first item in the array\n * otherwise returns the argument\n * @param {*} arg the maybe-array\n * @param {*} defaultValue the value if arg is falsey not defined\n * @return {*} the arg or it's first item\n */\nfunction unwrapArray(arg, defaultValue) {\n arg = Array.isArray(arg) ? /* istanbul ignore next (preact) */ arg[0] : arg\n if (!arg && defaultValue) {\n return defaultValue\n } else {\n return arg\n }\n}\n\n/**\n * @param {Object} element (P)react element\n * @return {Boolean} whether it's a DOM element\n */\nfunction isDOMElement(element) {\n /* istanbul ignore if */\n if (isPreact) {\n // then this is preact or preact X\n return (\n typeof element.type === 'string' || typeof element.nodeName === 'string'\n )\n }\n\n // then we assume this is react\n return typeof element.type === 'string'\n}\n\n/**\n * @param {Object} element (P)react element\n * @return {Object} the props\n */\nfunction getElementProps(element) {\n // props for react, attributes for preact\n\n /* istanbul ignore if */\n if (isPreact) {\n return element.props || element.attributes\n }\n\n return element.props\n}\n\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\nfunction requiredProp(fnName, propName) {\n // eslint-disable-next-line no-console\n console.error(`The property \"${propName}\" is required in \"${fnName}\"`)\n}\n\nconst stateKeys = [\n 'highlightedIndex',\n 'inputValue',\n 'isOpen',\n 'selectedItem',\n 'type',\n]\n/**\n * @param {Object} state the state object\n * @return {Object} state that is relevant to downshift\n */\nfunction pickState(state = {}) {\n const result = {}\n stateKeys.forEach(k => {\n if (state.hasOwnProperty(k)) {\n result[k] = state[k]\n }\n })\n return result\n}\n\n/**\n * This will perform a shallow merge of the given state object\n * with the state coming from props\n * (for the controlled component scenario)\n * This is used in state updater functions so they're referencing\n * the right state regardless of where it comes from.\n *\n * @param {Object} state The state of the component/hook.\n * @param {Object} props The props that may contain controlled values.\n * @returns {Object} The merged controlled state.\n */\nfunction getState(state, props) {\n return Object.keys(state).reduce((prevState, key) => {\n prevState[key] = isControlledProp(props, key) ? props[key] : state[key]\n\n return prevState\n }, {})\n}\n\n/**\n * This determines whether a prop is a \"controlled prop\" meaning it is\n * state which is controlled by the outside of this component rather\n * than within this component.\n *\n * @param {Object} props The props that may contain controlled values.\n * @param {String} key the key to check\n * @return {Boolean} whether it is a controlled controlled prop\n */\nfunction isControlledProp(props, key) {\n return props[key] !== undefined\n}\n\n/**\n * Normalizes the 'key' property of a KeyboardEvent in IE/Edge\n * @param {Object} event a keyboardEvent object\n * @return {String} keyboard key\n */\nfunction normalizeArrowKey(event) {\n const {key, keyCode} = event\n /* istanbul ignore next (ie) */\n if (keyCode >= 37 && keyCode <= 40 && key.indexOf('Arrow') !== 0) {\n return `Arrow${key}`\n }\n return key\n}\n\n/**\n * Simple check if the value passed is object literal\n * @param {*} obj any things\n * @return {Boolean} whether it's object literal\n */\nfunction isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]'\n}\n\n/**\n * Returns the new index in the list, in a circular way. If next value is out of bonds from the total,\n * it will wrap to either 0 or itemCount - 1.\n *\n * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.\n * @param {number} baseIndex The initial position to move from.\n * @param {number} itemCount The total number of items.\n * @param {Function} getItemNodeFromIndex Used to check if item is disabled.\n * @param {boolean} circular Specify if navigation is circular. Default is true.\n * @returns {number} The new index after the move.\n */\nfunction getNextWrappingIndex(\n moveAmount,\n baseIndex,\n itemCount,\n getItemNodeFromIndex,\n circular = true,\n) {\n if (itemCount === 0) {\n return -1\n }\n\n const itemsLastIndex = itemCount - 1\n\n if (\n typeof baseIndex !== 'number' ||\n baseIndex < 0 ||\n baseIndex >= itemCount\n ) {\n baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1\n }\n\n let newIndex = baseIndex + moveAmount\n\n if (newIndex < 0) {\n newIndex = circular ? itemsLastIndex : 0\n } else if (newIndex > itemsLastIndex) {\n newIndex = circular ? 0 : itemsLastIndex\n }\n\n const nonDisabledNewIndex = getNextNonDisabledIndex(\n moveAmount,\n newIndex,\n itemCount,\n getItemNodeFromIndex,\n circular,\n )\n\n return nonDisabledNewIndex === -1 ? baseIndex : nonDisabledNewIndex\n}\n\n/**\n * Returns the next index in the list of an item that is not disabled.\n *\n * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.\n * @param {number} baseIndex The initial position to move from.\n * @param {number} itemCount The total number of items.\n * @param {Function} getItemNodeFromIndex Used to check if item is disabled.\n * @param {boolean} circular Specify if navigation is circular. Default is true.\n * @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.\n */\nfunction getNextNonDisabledIndex(\n moveAmount,\n baseIndex,\n itemCount,\n getItemNodeFromIndex,\n circular,\n) {\n const currentElementNode = getItemNodeFromIndex(baseIndex)\n if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) {\n return baseIndex\n }\n\n if (moveAmount > 0) {\n for (let index = baseIndex + 1; index < itemCount; index++) {\n if (!getItemNodeFromIndex(index).hasAttribute('disabled')) {\n return index\n }\n }\n } else {\n for (let index = baseIndex - 1; index >= 0; index--) {\n if (!getItemNodeFromIndex(index).hasAttribute('disabled')) {\n return index\n }\n }\n }\n\n if (circular) {\n return moveAmount > 0\n ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false)\n : getNextNonDisabledIndex(\n -1,\n itemCount - 1,\n itemCount,\n getItemNodeFromIndex,\n false,\n )\n }\n\n return -1\n}\n\n/**\n * Checks if event target is within the downshift elements.\n *\n * @param {EventTarget} target Target to check.\n * @param {HTMLElement[]} downshiftElements The elements that form downshift (list, toggle button etc).\n * @param {Document} document The document.\n * @param {boolean} checkActiveElement Whether to also check activeElement.\n *\n * @returns {boolean} Whether or not the target is within downshift elements.\n */\nfunction targetWithinDownshift(\n target,\n downshiftElements,\n document,\n checkActiveElement = true,\n) {\n return downshiftElements.some(\n contextNode =>\n contextNode &&\n (isOrContainsNode(contextNode, target) ||\n (checkActiveElement &&\n isOrContainsNode(contextNode, document.activeElement))),\n )\n}\n\nexport function validateControlledUnchanged(state, prevProps, nextProps) {\n if (process.env.NODE_ENV === 'production') {\n return\n }\n\n const warningDescription = `This prop should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled Downshift element for the lifetime of the component. More info: https://github.com/downshift-js/downshift#control-props`\n\n Object.keys(state).forEach(propKey => {\n if (prevProps[propKey] !== undefined && nextProps[propKey] === undefined) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: A component has changed the controlled prop \"${propKey}\" to be uncontrolled. ${warningDescription}`,\n )\n } else if (\n prevProps[propKey] === undefined &&\n nextProps[propKey] !== undefined\n ) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: A component has changed the uncontrolled prop \"${propKey}\" to be controlled. ${warningDescription}`,\n )\n }\n })\n}\n\nexport {\n cbToCb,\n callAllEventHandlers,\n handleRefs,\n debounce,\n scrollIntoView,\n generateId,\n getA11yStatusMessage,\n unwrapArray,\n isDOMElement,\n getElementProps,\n noop,\n requiredProp,\n setIdCounter,\n resetIdCounter,\n pickState,\n isPlainObject,\n normalizeArrowKey,\n getNextWrappingIndex,\n getNextNonDisabledIndex,\n targetWithinDownshift,\n getState,\n isControlledProp,\n}\n","import {debounce} from './utils'\n\nconst cleanupStatus = debounce(() => {\n getStatusDiv().textContent = ''\n}, 500)\n\n/**\n * @param {String} status the status message\n * @param {Object} documentProp document passed by the user.\n */\nfunction setStatus(status, documentProp) {\n const div = getStatusDiv(documentProp)\n if (!status) {\n return\n }\n\n div.textContent = status\n cleanupStatus()\n}\n\n/**\n * Get the status node or create it if it does not already exist.\n * @param {Object} documentProp document passed by the user.\n * @return {HTMLElement} the status node.\n */\nfunction getStatusDiv(documentProp = document) {\n let statusDiv = documentProp.getElementById('a11y-status-message')\n if (statusDiv) {\n return statusDiv\n }\n\n statusDiv = documentProp.createElement('div')\n statusDiv.setAttribute('id', 'a11y-status-message')\n statusDiv.setAttribute('role', 'status')\n statusDiv.setAttribute('aria-live', 'polite')\n statusDiv.setAttribute('aria-relevant', 'additions text')\n Object.assign(statusDiv.style, {\n border: '0',\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: '0',\n position: 'absolute',\n width: '1px',\n })\n documentProp.body.appendChild(statusDiv)\n return statusDiv\n}\n\nexport default setStatus\n","import productionEnum from './productionEnum.macro'\n\nexport const unknown = productionEnum('__autocomplete_unknown__')\nexport const mouseUp = productionEnum('__autocomplete_mouseup__')\nexport const itemMouseEnter = productionEnum('__autocomplete_item_mouseenter__')\nexport const keyDownArrowUp = productionEnum(\n '__autocomplete_keydown_arrow_up__',\n)\nexport const keyDownArrowDown = productionEnum(\n '__autocomplete_keydown_arrow_down__',\n)\nexport const keyDownEscape = productionEnum('__autocomplete_keydown_escape__')\nexport const keyDownEnter = productionEnum('__autocomplete_keydown_enter__')\nexport const keyDownHome = productionEnum('__autocomplete_keydown_home__')\nexport const keyDownEnd = productionEnum('__autocomplete_keydown_end__')\nexport const clickItem = productionEnum('__autocomplete_click_item__')\nexport const blurInput = productionEnum('__autocomplete_blur_input__')\nexport const changeInput = productionEnum('__autocomplete_change_input__')\nexport const keyDownSpaceButton = productionEnum(\n '__autocomplete_keydown_space_button__',\n)\nexport const clickButton = productionEnum('__autocomplete_click_button__')\nexport const blurButton = productionEnum('__autocomplete_blur_button__')\nexport const controlledPropUpdatedSelectedItem = productionEnum(\n '__autocomplete_controlled_prop_updated_selected_item__',\n)\nexport const touchEnd = productionEnum('__autocomplete_touchend__')\n","/* eslint camelcase:0 */\n\nimport PropTypes from 'prop-types'\nimport {Component, cloneElement} from 'react'\nimport {isForwardRef} from 'react-is'\nimport {isPreact, isReactNative} from './is.macro'\nimport setA11yStatus from './set-a11y-status'\nimport * as stateChangeTypes from './stateChangeTypes'\nimport {\n handleRefs,\n callAllEventHandlers,\n cbToCb,\n debounce,\n generateId,\n getA11yStatusMessage,\n getElementProps,\n isDOMElement,\n targetWithinDownshift,\n isPlainObject,\n noop,\n normalizeArrowKey,\n pickState,\n requiredProp,\n scrollIntoView,\n unwrapArray,\n getNextWrappingIndex,\n getNextNonDisabledIndex,\n getState,\n isControlledProp,\n validateControlledUnchanged\n} from './utils'\n\nclass Downshift extends Component {\n static propTypes = {\n children: PropTypes.func,\n defaultHighlightedIndex: PropTypes.number,\n defaultIsOpen: PropTypes.bool,\n initialHighlightedIndex: PropTypes.number,\n initialSelectedItem: PropTypes.any,\n initialInputValue: PropTypes.string,\n initialIsOpen: PropTypes.bool,\n getA11yStatusMessage: PropTypes.func,\n itemToString: PropTypes.func,\n onChange: PropTypes.func,\n onSelect: PropTypes.func,\n onStateChange: PropTypes.func,\n onInputValueChange: PropTypes.func,\n onUserAction: PropTypes.func,\n onOuterClick: PropTypes.func,\n selectedItemChanged: PropTypes.func,\n stateReducer: PropTypes.func,\n itemCount: PropTypes.number,\n id: PropTypes.string,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n suppressRefError: PropTypes.bool,\n scrollIntoView: PropTypes.func,\n // things we keep in state for uncontrolled components\n // but can accept as props for controlled components\n /* eslint-disable react/no-unused-prop-types */\n selectedItem: PropTypes.any,\n isOpen: PropTypes.bool,\n inputValue: PropTypes.string,\n highlightedIndex: PropTypes.number,\n labelId: PropTypes.string,\n inputId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n /* eslint-enable react/no-unused-prop-types */\n }\n\n static defaultProps = {\n defaultHighlightedIndex: null,\n defaultIsOpen: false,\n getA11yStatusMessage,\n itemToString: i => {\n if (i == null) {\n return ''\n }\n if (\n process.env.NODE_ENV !== 'production' &&\n isPlainObject(i) &&\n !i.hasOwnProperty('toString')\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n 'downshift: An object was passed to the default implementation of `itemToString`. You should probably provide your own `itemToString` implementation. Please refer to the `itemToString` API documentation.',\n 'The object that was passed:',\n i,\n )\n }\n return String(i)\n },\n onStateChange: noop,\n onInputValueChange: noop,\n onUserAction: noop,\n onChange: noop,\n onSelect: noop,\n onOuterClick: noop,\n selectedItemChanged: (prevItem, item) => prevItem !== item,\n environment:\n typeof window === 'undefined' /* istanbul ignore next (ssr) */\n ? {}\n : window,\n stateReducer: (state, stateToSet) => stateToSet,\n suppressRefError: false,\n scrollIntoView,\n }\n\n static stateChangeTypes = stateChangeTypes\n\n constructor(props) {\n super(props)\n // fancy destructuring + defaults + aliases\n // this basically says each value of state should either be set to\n // the initial value or the default value if the initial value is not provided\n const {\n defaultHighlightedIndex,\n initialHighlightedIndex: highlightedIndex = defaultHighlightedIndex,\n defaultIsOpen,\n initialIsOpen: isOpen = defaultIsOpen,\n initialInputValue: inputValue = '',\n initialSelectedItem: selectedItem = null,\n } = this.props\n const state = this.getState({\n highlightedIndex,\n isOpen,\n inputValue,\n selectedItem,\n })\n if (\n state.selectedItem != null &&\n this.props.initialInputValue === undefined\n ) {\n state.inputValue = this.props.itemToString(state.selectedItem)\n }\n this.state = state\n }\n\n id = this.props.id || `downshift-${generateId()}`\n menuId = this.props.menuId || `${this.id}-menu`\n labelId = this.props.labelId || `${this.id}-label`\n inputId = this.props.inputId || `${this.id}-input`\n getItemId = this.props.getItemId || (index => `${this.id}-item-${index}`)\n\n input = null\n items = []\n // itemCount can be changed asynchronously\n // from within downshift (so it can't come from a prop)\n // this is why we store it as an instance and use\n // getItemCount rather than just use items.length\n // (to support windowing + async)\n itemCount = null\n previousResultCount = 0\n\n timeoutIds = []\n\n /**\n * @param {Function} fn the function to call after the time\n * @param {Number} time the time to wait\n */\n internalSetTimeout = (fn, time) => {\n const id = setTimeout(() => {\n this.timeoutIds = this.timeoutIds.filter(i => i !== id)\n fn()\n }, time)\n\n this.timeoutIds.push(id)\n }\n\n /**\n * Clear all running timeouts\n */\n internalClearTimeouts() {\n this.timeoutIds.forEach(id => {\n clearTimeout(id)\n })\n\n this.timeoutIds = []\n }\n\n /**\n * Gets the state based on internal state or props\n * If a state value is passed via props, then that\n * is the value given, otherwise it's retrieved from\n * stateToMerge\n *\n * @param {Object} stateToMerge defaults to this.state\n * @return {Object} the state\n */\n getState(stateToMerge = this.state) {\n return getState(stateToMerge, this.props)\n }\n\n getItemCount() {\n // things read better this way. They're in priority order:\n // 1. `this.itemCount`\n // 2. `this.props.itemCount`\n // 3. `this.items.length`\n let itemCount = this.items.length\n if (this.itemCount != null) {\n itemCount = this.itemCount\n } else if (this.props.itemCount !== undefined) {\n itemCount = this.props.itemCount\n }\n return itemCount\n }\n\n setItemCount = count => {\n this.itemCount = count\n }\n\n unsetItemCount = () => {\n this.itemCount = null\n }\n\n getItemNodeFromIndex(index) {\n return this.props.environment.document.getElementById(this.getItemId(index))\n }\n\n setHighlightedIndex = (\n highlightedIndex = this.props.defaultHighlightedIndex,\n otherStateToSet = {},\n ) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState({highlightedIndex, ...otherStateToSet})\n }\n\n scrollHighlightedItemIntoView() {\n /* istanbul ignore else (react-native) */\n if (!isReactNative) {\n const node = this.getItemNodeFromIndex(this.getState().highlightedIndex)\n this.props.scrollIntoView(node, this._menuNode)\n }\n }\n\n moveHighlightedIndex(amount, otherStateToSet) {\n const itemCount = this.getItemCount()\n const {highlightedIndex} = this.getState()\n if (itemCount > 0) {\n const nextHighlightedIndex = getNextWrappingIndex(\n amount,\n highlightedIndex,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n )\n this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet)\n }\n }\n\n clearSelection = cb => {\n this.internalSetState(\n {\n selectedItem: null,\n inputValue: '',\n highlightedIndex: this.props.defaultHighlightedIndex,\n isOpen: this.props.defaultIsOpen,\n },\n cb,\n )\n }\n\n selectItem = (item, otherStateToSet, cb) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState(\n {\n isOpen: this.props.defaultIsOpen,\n highlightedIndex: this.props.defaultHighlightedIndex,\n selectedItem: item,\n inputValue: this.props.itemToString(item),\n ...otherStateToSet,\n },\n cb,\n )\n }\n\n selectItemAtIndex = (itemIndex, otherStateToSet, cb) => {\n const item = this.items[itemIndex]\n if (item == null) {\n return\n }\n this.selectItem(item, otherStateToSet, cb)\n }\n\n selectHighlightedItem = (otherStateToSet, cb) => {\n return this.selectItemAtIndex(\n this.getState().highlightedIndex,\n otherStateToSet,\n cb,\n )\n }\n\n // any piece of our state can live in two places:\n // 1. Uncontrolled: it's internal (this.state)\n // We will call this.setState to update that state\n // 2. Controlled: it's external (this.props)\n // We will call this.props.onStateChange to update that state\n //\n // In addition, we'll call this.props.onChange if the\n // selectedItem is changed.\n internalSetState = (stateToSet, cb) => {\n let isItemSelected, onChangeArg\n\n const onStateChangeArg = {}\n const isStateToSetFunction = typeof stateToSet === 'function'\n\n // we want to call `onInputValueChange` before the `setState` call\n // so someone controlling the `inputValue` state gets notified of\n // the input change as soon as possible. This avoids issues with\n // preserving the cursor position.\n // See https://github.com/downshift-js/downshift/issues/217 for more info.\n if (!isStateToSetFunction && stateToSet.hasOwnProperty('inputValue')) {\n this.props.onInputValueChange(stateToSet.inputValue, {\n ...this.getStateAndHelpers(),\n ...stateToSet,\n })\n }\n return this.setState(\n state => {\n state = this.getState(state)\n let newStateToSet = isStateToSetFunction\n ? stateToSet(state)\n : stateToSet\n\n // Your own function that could modify the state that will be set.\n newStateToSet = this.props.stateReducer(state, newStateToSet)\n\n // checks if an item is selected, regardless of if it's different from\n // what was selected before\n // used to determine if onSelect and onChange callbacks should be called\n isItemSelected = newStateToSet.hasOwnProperty('selectedItem')\n // this keeps track of the object we want to call with setState\n const nextState = {}\n // this is just used to tell whether the state changed\n const nextFullState = {}\n // we need to call on change if the outside world is controlling any of our state\n // and we're trying to update that state. OR if the selection has changed and we're\n // trying to update the selection\n if (\n isItemSelected &&\n newStateToSet.selectedItem !== state.selectedItem\n ) {\n onChangeArg = newStateToSet.selectedItem\n }\n newStateToSet.type = newStateToSet.type || stateChangeTypes.unknown\n\n Object.keys(newStateToSet).forEach(key => {\n // onStateChangeArg should only have the state that is\n // actually changing\n if (state[key] !== newStateToSet[key]) {\n onStateChangeArg[key] = newStateToSet[key]\n }\n // the type is useful for the onStateChangeArg\n // but we don't actually want to set it in internal state.\n // this is an undocumented feature for now... Not all internalSetState\n // calls support it and I'm not certain we want them to yet.\n // But it enables users controlling the isOpen state to know when\n // the isOpen state changes due to mouseup events which is quite handy.\n if (key === 'type') {\n return\n }\n nextFullState[key] = newStateToSet[key]\n // if it's coming from props, then we don't care to set it internally\n if (!isControlledProp(this.props, key)) {\n nextState[key] = newStateToSet[key]\n }\n })\n\n // if stateToSet is a function, then we weren't able to call onInputValueChange\n // earlier, so we'll call it now that we know what the inputValue state will be.\n if (\n isStateToSetFunction &&\n newStateToSet.hasOwnProperty('inputValue')\n ) {\n this.props.onInputValueChange(newStateToSet.inputValue, {\n ...this.getStateAndHelpers(),\n ...newStateToSet,\n })\n }\n\n return nextState\n },\n () => {\n // call the provided callback if it's a function\n cbToCb(cb)()\n\n // only call the onStateChange and onChange callbacks if\n // we have relevant information to pass them.\n const hasMoreStateThanType = Object.keys(onStateChangeArg).length > 1\n if (hasMoreStateThanType) {\n this.props.onStateChange(onStateChangeArg, this.getStateAndHelpers())\n }\n\n if (isItemSelected) {\n this.props.onSelect(\n stateToSet.selectedItem,\n this.getStateAndHelpers(),\n )\n }\n\n if (onChangeArg !== undefined) {\n this.props.onChange(onChangeArg, this.getStateAndHelpers())\n }\n // this is currently undocumented and therefore subject to change\n // We'll try to not break it, but just be warned.\n this.props.onUserAction(onStateChangeArg, this.getStateAndHelpers())\n },\n )\n }\n\n getStateAndHelpers() {\n const {highlightedIndex, inputValue, selectedItem, isOpen} = this.getState()\n const {itemToString} = this.props\n const {id} = this\n const {\n getRootProps,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getItemProps,\n openMenu,\n closeMenu,\n toggleMenu,\n selectItem,\n selectItemAtIndex,\n selectHighlightedItem,\n setHighlightedIndex,\n clearSelection,\n clearItems,\n reset,\n setItemCount,\n unsetItemCount,\n internalSetState: setState,\n } = this\n return {\n // prop getters\n getRootProps,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getItemProps,\n\n // actions\n reset,\n openMenu,\n closeMenu,\n toggleMenu,\n selectItem,\n selectItemAtIndex,\n selectHighlightedItem,\n setHighlightedIndex,\n clearSelection,\n clearItems,\n setItemCount,\n unsetItemCount,\n setState,\n\n // props\n itemToString,\n\n // derived\n id,\n\n // state\n highlightedIndex,\n inputValue,\n isOpen,\n selectedItem,\n }\n }\n\n //////////////////////////// ROOT\n\n rootRef = node => (this._rootNode = node)\n\n getRootProps = (\n {refKey = 'ref', ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n // this is used in the render to know whether the user has called getRootProps.\n // It uses that to know whether to apply the props automatically\n this.getRootProps.called = true\n this.getRootProps.refKey = refKey\n this.getRootProps.suppressRefError = suppressRefError\n const {isOpen} = this.getState()\n return {\n [refKey]: handleRefs(ref, this.rootRef),\n role: 'combobox',\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'listbox',\n 'aria-owns': isOpen ? this.menuId : null,\n 'aria-labelledby': this.labelId,\n ...rest,\n }\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT\n\n keyDownHandlers = {\n ArrowDown(event) {\n event.preventDefault()\n\n if (this.getState().isOpen) {\n const amount = event.shiftKey ? 5 : 1\n this.moveHighlightedIndex(amount, {\n type: stateChangeTypes.keyDownArrowDown,\n })\n } else {\n this.internalSetState(\n {\n isOpen: true,\n type: stateChangeTypes.keyDownArrowDown,\n },\n () => {\n const itemCount = this.getItemCount()\n if (itemCount > 0) {\n const {highlightedIndex} = this.getState()\n const nextHighlightedIndex = getNextWrappingIndex(\n 1,\n highlightedIndex,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n )\n\n this.setHighlightedIndex(nextHighlightedIndex, {\n type: stateChangeTypes.keyDownArrowDown,\n })\n }\n },\n )\n }\n },\n\n ArrowUp(event) {\n event.preventDefault()\n\n if (this.getState().isOpen) {\n const amount = event.shiftKey ? -5 : -1\n this.moveHighlightedIndex(amount, {\n type: stateChangeTypes.keyDownArrowUp,\n })\n } else {\n this.internalSetState(\n {\n isOpen: true,\n type: stateChangeTypes.keyDownArrowUp,\n },\n () => {\n const itemCount = this.getItemCount()\n if (itemCount > 0) {\n const {highlightedIndex} = this.getState()\n const nextHighlightedIndex = getNextWrappingIndex(\n -1,\n highlightedIndex,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n )\n\n this.setHighlightedIndex(nextHighlightedIndex, {\n type: stateChangeTypes.keyDownArrowUp,\n })\n }\n },\n )\n }\n },\n\n Enter(event) {\n if (event.which === 229) {\n return\n }\n\n const {isOpen, highlightedIndex} = this.getState()\n if (isOpen && highlightedIndex != null) {\n event.preventDefault()\n const item = this.items[highlightedIndex]\n const itemNode = this.getItemNodeFromIndex(highlightedIndex)\n if (item == null || (itemNode && itemNode.hasAttribute('disabled'))) {\n return\n }\n this.selectHighlightedItem({\n type: stateChangeTypes.keyDownEnter,\n })\n }\n },\n\n Escape(event) {\n event.preventDefault()\n this.reset({\n type: stateChangeTypes.keyDownEscape,\n selectedItem: null,\n inputValue: '',\n })\n },\n }\n\n //////////////////////////// BUTTON\n\n buttonKeyDownHandlers = {\n ...this.keyDownHandlers,\n\n ' '(event) {\n event.preventDefault()\n this.toggleMenu({type: stateChangeTypes.keyDownSpaceButton})\n },\n }\n\n inputKeyDownHandlers = {\n ...this.keyDownHandlers,\n Home(event) {\n event.preventDefault()\n\n const itemCount = this.getItemCount()\n const {isOpen} = this.getState()\n\n if (itemCount <= 0 || !isOpen) {\n return\n }\n\n // get next non-disabled starting downwards from 0 if that's disabled.\n const newHighlightedIndex = getNextNonDisabledIndex(\n 1,\n 0,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n false,\n )\n\n this.setHighlightedIndex(newHighlightedIndex, {\n type: stateChangeTypes.keyDownHome,\n })\n },\n\n End(event) {\n event.preventDefault()\n\n const itemCount = this.getItemCount()\n const {isOpen} = this.getState()\n\n if (itemCount <= 0 || !isOpen) {\n return\n }\n\n // get next non-disabled starting upwards from last index if that's disabled.\n const newHighlightedIndex = getNextNonDisabledIndex(\n -1,\n itemCount - 1,\n itemCount,\n index => this.getItemNodeFromIndex(index),\n false,\n )\n\n this.setHighlightedIndex(newHighlightedIndex, {\n type: stateChangeTypes.keyDownEnd,\n })\n },\n }\n\n getToggleButtonProps = ({\n onClick,\n onPress,\n onKeyDown,\n onKeyUp,\n onBlur,\n ...rest\n } = {}) => {\n const {isOpen} = this.getState()\n const enabledEventHandlers = isReactNative\n ? /* istanbul ignore next (react-native) */\n {\n onPress: callAllEventHandlers(onPress, this.buttonHandleClick),\n }\n : {\n onClick: callAllEventHandlers(onClick, this.buttonHandleClick),\n onKeyDown: callAllEventHandlers(onKeyDown, this.buttonHandleKeyDown),\n onKeyUp: callAllEventHandlers(onKeyUp, this.buttonHandleKeyUp),\n onBlur: callAllEventHandlers(onBlur, this.buttonHandleBlur),\n }\n const eventHandlers = rest.disabled ? {} : enabledEventHandlers\n return {\n type: 'button',\n role: 'button',\n 'aria-label': isOpen ? 'close menu' : 'open menu',\n 'aria-haspopup': true,\n 'data-toggle': true,\n ...eventHandlers,\n ...rest,\n }\n }\n\n buttonHandleKeyUp = event => {\n // Prevent click event from emitting in Firefox\n event.preventDefault()\n }\n\n buttonHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (this.buttonKeyDownHandlers[key]) {\n this.buttonKeyDownHandlers[key].call(this, event)\n }\n }\n\n buttonHandleClick = event => {\n event.preventDefault()\n // handle odd case for Safari and Firefox which\n // don't give the button the focus properly.\n /* istanbul ignore if (can't reasonably test this) */\n if (\n !isReactNative &&\n this.props.environment.document.activeElement ===\n this.props.environment.document.body\n ) {\n event.target.focus()\n }\n // to simplify testing components that use downshift, we'll not wrap this in a setTimeout\n // if the NODE_ENV is test. With the proper build system, this should be dead code eliminated\n // when building for production and should therefore have no impact on production code.\n if (process.env.NODE_ENV === 'test') {\n this.toggleMenu({type: stateChangeTypes.clickButton})\n } else {\n // Ensure that toggle of menu occurs after the potential blur event in iOS\n this.internalSetTimeout(() =>\n this.toggleMenu({type: stateChangeTypes.clickButton}),\n )\n }\n }\n\n buttonHandleBlur = event => {\n const blurTarget = event.target // Save blur target for comparison with activeElement later\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not body element\n this.internalSetTimeout(() => {\n if (\n !this.isMouseDown &&\n (this.props.environment.document.activeElement == null ||\n this.props.environment.document.activeElement.id !== this.inputId) &&\n this.props.environment.document.activeElement !== blurTarget // Do nothing if we refocus the same element again (to solve issue in Safari on iOS)\n ) {\n this.reset({type: stateChangeTypes.blurButton})\n }\n })\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ BUTTON\n\n /////////////////////////////// LABEL\n\n getLabelProps = props => {\n return {htmlFor: this.inputId, id: this.labelId, ...props}\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ LABEL\n\n /////////////////////////////// INPUT\n\n getInputProps = ({\n onKeyDown,\n onBlur,\n onChange,\n onInput,\n onChangeText,\n ...rest\n } = {}) => {\n let onChangeKey\n let eventHandlers = {}\n\n /* istanbul ignore next (preact) */\n if (isPreact) {\n onChangeKey = 'onInput'\n } else {\n onChangeKey = 'onChange'\n }\n const {inputValue, isOpen, highlightedIndex} = this.getState()\n\n if (!rest.disabled) {\n eventHandlers = {\n [onChangeKey]: callAllEventHandlers(\n onChange,\n onInput,\n this.inputHandleChange,\n ),\n onKeyDown: callAllEventHandlers(onKeyDown, this.inputHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, this.inputHandleBlur),\n }\n }\n\n /* istanbul ignore if (react-native) */\n if (isReactNative) {\n eventHandlers = {\n onChange: callAllEventHandlers(\n onChange,\n onInput,\n this.inputHandleChange,\n ),\n onChangeText: callAllEventHandlers(onChangeText, onInput, text =>\n this.inputHandleChange({nativeEvent: {text}}),\n ),\n onBlur: callAllEventHandlers(onBlur, this.inputHandleBlur),\n }\n }\n\n return {\n 'aria-autocomplete': 'list',\n 'aria-activedescendant':\n isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0\n ? this.getItemId(highlightedIndex)\n : null,\n 'aria-controls': isOpen ? this.menuId : null,\n 'aria-labelledby': this.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete=\"nope\" is ignored on latest Chrome and Opera\n autoComplete: 'off',\n value: inputValue,\n id: this.inputId,\n ...eventHandlers,\n ...rest,\n }\n }\n\n inputHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && this.inputKeyDownHandlers[key]) {\n this.inputKeyDownHandlers[key].call(this, event)\n }\n }\n\n inputHandleChange = event => {\n this.internalSetState({\n type: stateChangeTypes.changeInput,\n isOpen: true,\n inputValue: isReactNative\n ? /* istanbul ignore next (react-native) */ event.nativeEvent.text\n : event.target.value,\n highlightedIndex: this.props.defaultHighlightedIndex,\n })\n }\n\n inputHandleBlur = () => {\n // Need setTimeout, so that when the user presses Tab, the activeElement is the next focused element, not the body element\n this.internalSetTimeout(() => {\n const downshiftButtonIsActive =\n this.props.environment.document &&\n !!this.props.environment.document.activeElement &&\n !!this.props.environment.document.activeElement.dataset &&\n this.props.environment.document.activeElement.dataset.toggle &&\n this._rootNode &&\n this._rootNode.contains(this.props.environment.document.activeElement)\n if (!this.isMouseDown && !downshiftButtonIsActive) {\n this.reset({type: stateChangeTypes.blurInput})\n }\n })\n }\n\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INPUT\n\n /////////////////////////////// MENU\n\n menuRef = node => {\n this._menuNode = node\n }\n\n getMenuProps = (\n {refKey = 'ref', ref, ...props} = {},\n {suppressRefError = false} = {},\n ) => {\n this.getMenuProps.called = true\n this.getMenuProps.refKey = refKey\n this.getMenuProps.suppressRefError = suppressRefError\n\n return {\n [refKey]: handleRefs(ref, this.menuRef),\n role: 'listbox',\n 'aria-labelledby': props && props['aria-label'] ? null : this.labelId,\n id: this.menuId,\n ...props,\n }\n }\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU\n\n /////////////////////////////// ITEM\n getItemProps = ({\n onMouseMove,\n onMouseDown,\n onClick,\n onPress,\n index,\n item = process.env.NODE_ENV === 'production'\n ? /* istanbul ignore next */ undefined\n : requiredProp('getItemProps', 'item'),\n ...rest\n } = {}) => {\n if (index === undefined) {\n this.items.push(item)\n index = this.items.indexOf(item)\n } else {\n this.items[index] = item\n }\n\n const onSelectKey = isReactNative\n ? /* istanbul ignore next (react-native) */ 'onPress'\n : 'onClick'\n const customClickHandler = isReactNative\n ? /* istanbul ignore next (react-native) */ onPress\n : onClick\n\n const enabledEventHandlers = {\n // onMouseMove is used over onMouseEnter here. onMouseMove\n // is only triggered on actual mouse movement while onMouseEnter\n // can fire on DOM changes, interrupting keyboard navigation\n onMouseMove: callAllEventHandlers(onMouseMove, () => {\n if (index === this.getState().highlightedIndex) {\n return\n }\n this.setHighlightedIndex(index, {\n type: stateChangeTypes.itemMouseEnter,\n })\n\n // We never want to manually scroll when changing state based\n // on `onMouseMove` because we will be moving the element out\n // from under the user which is currently scrolling/moving the\n // cursor\n this.avoidScrolling = true\n this.internalSetTimeout(() => (this.avoidScrolling = false), 250)\n }),\n onMouseDown: callAllEventHandlers(onMouseDown, event => {\n // This prevents the activeElement from being changed\n // to the item so it can remain with the current activeElement\n // which is a more common use case.\n event.preventDefault()\n }),\n [onSelectKey]: callAllEventHandlers(customClickHandler, () => {\n this.selectItemAtIndex(index, {\n type: stateChangeTypes.clickItem,\n })\n }),\n }\n\n // Passing down the onMouseDown handler to prevent redirect\n // of the activeElement if clicking on disabled items\n const eventHandlers = rest.disabled\n ? {onMouseDown: enabledEventHandlers.onMouseDown}\n : enabledEventHandlers\n\n return {\n id: this.getItemId(index),\n role: 'option',\n 'aria-selected': this.getState().highlightedIndex === index,\n ...eventHandlers,\n ...rest,\n }\n }\n //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ITEM\n\n clearItems = () => {\n this.items = []\n }\n\n reset = (otherStateToSet = {}, cb) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState(\n ({selectedItem}) => ({\n isOpen: this.props.defaultIsOpen,\n highlightedIndex: this.props.defaultHighlightedIndex,\n inputValue: this.props.itemToString(selectedItem),\n ...otherStateToSet,\n }),\n cb,\n )\n }\n\n toggleMenu = (otherStateToSet = {}, cb) => {\n otherStateToSet = pickState(otherStateToSet)\n this.internalSetState(\n ({isOpen}) => {\n return {\n isOpen: !isOpen,\n ...(isOpen && {\n highlightedIndex: this.props.defaultHighlightedIndex,\n }),\n ...otherStateToSet,\n }\n },\n () => {\n const {isOpen, highlightedIndex} = this.getState()\n if (isOpen) {\n if (this.getItemCount() > 0 && typeof highlightedIndex === 'number') {\n this.setHighlightedIndex(highlightedIndex, otherStateToSet)\n }\n }\n cbToCb(cb)()\n },\n )\n }\n\n openMenu = cb => {\n this.internalSetState({isOpen: true}, cb)\n }\n\n closeMenu = cb => {\n this.internalSetState({isOpen: false}, cb)\n }\n\n updateStatus = debounce(() => {\n const state = this.getState()\n const item = this.items[state.highlightedIndex]\n const resultCount = this.getItemCount()\n const status = this.props.getA11yStatusMessage({\n itemToString: this.props.itemToString,\n previousResultCount: this.previousResultCount,\n resultCount,\n highlightedItem: item,\n ...state,\n })\n this.previousResultCount = resultCount\n\n setA11yStatus(status, this.props.environment.document)\n }, 200)\n\n componentDidMount() {\n /* istanbul ignore if (react-native) */\n if (\n process.env.NODE_ENV !== 'production' &&\n !isReactNative &&\n this.getMenuProps.called &&\n !this.getMenuProps.suppressRefError\n ) {\n validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps)\n }\n\n /* istanbul ignore if (react-native) */\n if (isReactNative) {\n this.cleanup = () => {\n this.internalClearTimeouts()\n }\n } else {\n // this.isMouseDown helps us track whether the mouse is currently held down.\n // This is useful when the user clicks on an item in the list, but holds the mouse\n // down long enough for the list to disappear (because the blur event fires on the input)\n // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should\n // trigger hiding the menu.\n const onMouseDown = () => {\n this.isMouseDown = true\n }\n const onMouseUp = event => {\n this.isMouseDown = false\n // if the target element or the activeElement is within a downshift node\n // then we don't want to reset downshift\n const contextWithinDownshift = targetWithinDownshift(\n event.target,\n [this._rootNode, this._menuNode],\n this.props.environment.document,\n )\n if (!contextWithinDownshift && this.getState().isOpen) {\n this.reset({type: stateChangeTypes.mouseUp}, () =>\n this.props.onOuterClick(this.getStateAndHelpers()),\n )\n }\n }\n // Touching an element in iOS gives focus and hover states, but touching out of\n // the element will remove hover, and persist the focus state, resulting in the\n // blur event not being triggered.\n // this.isTouchMove helps us track whether the user is tapping or swiping on a touch screen.\n // If the user taps outside of Downshift, the component should be reset,\n // but not if the user is swiping\n const onTouchStart = () => {\n this.isTouchMove = false\n }\n\n const onTouchMove = () => {\n this.isTouchMove = true\n }\n\n const onTouchEnd = event => {\n const contextWithinDownshift = targetWithinDownshift(\n event.target,\n [this._rootNode, this._menuNode],\n this.props.environment.document,\n false,\n )\n if (\n !this.isTouchMove &&\n !contextWithinDownshift &&\n this.getState().isOpen\n ) {\n this.reset({type: stateChangeTypes.touchEnd}, () =>\n this.props.onOuterClick(this.getStateAndHelpers()),\n )\n }\n }\n const {environment} = this.props\n\n environment.addEventListener('mousedown', onMouseDown)\n environment.addEventListener('mouseup', onMouseUp)\n environment.addEventListener('touchstart', onTouchStart)\n environment.addEventListener('touchmove', onTouchMove)\n environment.addEventListener('touchend', onTouchEnd)\n\n this.cleanup = () => {\n this.internalClearTimeouts()\n this.updateStatus.cancel()\n environment.removeEventListener('mousedown', onMouseDown)\n environment.removeEventListener('mouseup', onMouseUp)\n environment.removeEventListener('touchstart', onTouchStart)\n environment.removeEventListener('touchmove', onTouchMove)\n environment.removeEventListener('touchend', onTouchEnd)\n }\n }\n }\n\n shouldScroll(prevState, prevProps) {\n const {highlightedIndex: currentHighlightedIndex} =\n this.props.highlightedIndex === undefined ? this.getState() : this.props\n const {highlightedIndex: prevHighlightedIndex} =\n prevProps.highlightedIndex === undefined ? prevState : prevProps\n const scrollWhenOpen =\n currentHighlightedIndex && this.getState().isOpen && !prevState.isOpen\n const scrollWhenNavigating =\n currentHighlightedIndex !== prevHighlightedIndex\n\n return scrollWhenOpen || scrollWhenNavigating\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (process.env.NODE_ENV !== 'production') {\n validateControlledUnchanged(this.state, prevProps, this.props)\n /* istanbul ignore if (react-native) */\n if (\n !isReactNative &&\n this.getMenuProps.called &&\n !this.getMenuProps.suppressRefError\n ) {\n validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps)\n }\n }\n\n if (\n isControlledProp(this.props, 'selectedItem') &&\n this.props.selectedItemChanged(\n prevProps.selectedItem,\n this.props.selectedItem,\n )\n ) {\n this.internalSetState({\n type: stateChangeTypes.controlledPropUpdatedSelectedItem,\n inputValue: this.props.itemToString(this.props.selectedItem),\n })\n }\n\n if (!this.avoidScrolling && this.shouldScroll(prevState, prevProps)) {\n this.scrollHighlightedItemIntoView()\n }\n\n /* istanbul ignore else (react-native) */\n if (!isReactNative) {\n this.updateStatus()\n }\n }\n\n componentWillUnmount() {\n this.cleanup() // avoids memory leak\n }\n\n render() {\n const children = unwrapArray(this.props.children, noop)\n // because the items are rerendered every time we call the children\n // we clear this out each render and it will be populated again as\n // getItemProps is called.\n this.clearItems()\n // we reset this so we know whether the user calls getRootProps during\n // this render. If they do then we don't need to do anything,\n // if they don't then we need to clone the element they return and\n // apply the props for them.\n this.getRootProps.called = false\n this.getRootProps.refKey = undefined\n this.getRootProps.suppressRefError = undefined\n // we do something similar for getMenuProps\n this.getMenuProps.called = false\n this.getMenuProps.refKey = undefined\n this.getMenuProps.suppressRefError = undefined\n // we do something similar for getLabelProps\n this.getLabelProps.called = false\n // and something similar for getInputProps\n this.getInputProps.called = false\n const element = unwrapArray(children(this.getStateAndHelpers()))\n if (!element) {\n return null\n }\n\n if (this.getRootProps.called || this.props.suppressRefError) {\n if (\n process.env.NODE_ENV !== 'production' &&\n !this.getRootProps.suppressRefError &&\n !this.props.suppressRefError\n ) {\n validateGetRootPropsCalledCorrectly(element, this.getRootProps)\n }\n return element\n } else if (isDOMElement(element)) {\n // they didn't apply the root props, but we can clone\n // this and apply the props ourselves\n return cloneElement(element, this.getRootProps(getElementProps(element)))\n }\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n // they didn't apply the root props, but they need to\n // otherwise we can't query around the autocomplete\n\n throw new Error(\n 'downshift: If you return a non-DOM element, you must apply the getRootProps function',\n )\n }\n\n /* istanbul ignore next */\n return undefined\n }\n}\n\nexport default Downshift\n\nfunction validateGetMenuPropsCalledCorrectly(node, {refKey}) {\n if (!node) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: The ref prop \"${refKey}\" from getMenuProps was not applied correctly on your menu element.`,\n )\n }\n}\n\nfunction validateGetRootPropsCalledCorrectly(element, {refKey}) {\n const refKeySpecified = refKey !== 'ref'\n const isComposite = !isDOMElement(element)\n if (isComposite && !refKeySpecified && !isForwardRef(element)) {\n // eslint-disable-next-line no-console\n console.error(\n 'downshift: You returned a non-DOM element. You must specify a refKey in getRootProps',\n )\n } else if (!isComposite && refKeySpecified) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: You returned a DOM element. You should not specify a refKey in getRootProps. You specified \"${refKey}\"`,\n )\n }\n if (!isForwardRef(element) && !getElementProps(element)[refKey]) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: You must apply the ref prop \"${refKey}\" from getRootProps onto your root element.`,\n )\n }\n}\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","import PropTypes from 'prop-types'\nimport {useRef, useCallback, useReducer, useEffect} from 'react'\nimport {\n scrollIntoView,\n getNextWrappingIndex,\n getState,\n generateId,\n debounce,\n targetWithinDownshift,\n} from '../utils'\nimport setStatus from '../set-a11y-status'\n\nconst dropdownDefaultStateValues = {\n highlightedIndex: -1,\n isOpen: false,\n selectedItem: null,\n inputValue: '',\n}\n\nfunction callOnChangeProps(action, state, newState) {\n const {props, type} = action\n const changes = {}\n\n Object.keys(state).forEach(key => {\n invokeOnChangeHandler(key, props, state, newState)\n\n if (newState[key] !== state[key]) {\n changes[key] = newState[key]\n }\n })\n\n if (props.onStateChange && Object.keys(changes).length) {\n props.onStateChange({type, ...changes})\n }\n}\n\nfunction invokeOnChangeHandler(key, props, state, newState) {\n const handler = `on${capitalizeString(key)}Change`\n if (\n props[handler] &&\n newState[key] !== undefined &&\n newState[key] !== state[key]\n ) {\n props[handler](newState)\n }\n}\n\n/**\n * Default state reducer that returns the changes.\n *\n * @param {Object} s state.\n * @param {Object} a action with changes.\n * @returns {Object} changes.\n */\nfunction stateReducer(s, a) {\n return a.changes\n}\n\n/**\n * Returns a message to be added to aria-live region when item is selected.\n *\n * @param {Object} selectionParameters Parameters required to build the message.\n * @returns {string} The a11y message.\n */\nfunction getA11ySelectionMessage(selectionParameters) {\n const {selectedItem, itemToString: itemToStringLocal} = selectionParameters\n\n return selectedItem\n ? `${itemToStringLocal(selectedItem)} has been selected.`\n : ''\n}\n\n/**\n * Debounced call for updating the a11y message.\n */\nexport const updateA11yStatus = debounce((getA11yMessage, document) => {\n setStatus(getA11yMessage(), document)\n}, 200)\n\nexport function getElementIds({\n id,\n labelId,\n menuId,\n getItemId,\n toggleButtonId,\n}) {\n const uniqueId = id === undefined ? `downshift-${generateId()}` : id\n\n return {\n labelId: labelId || `${uniqueId}-label`,\n menuId: menuId || `${uniqueId}-menu`,\n getItemId: getItemId || (index => `${uniqueId}-item-${index}`),\n toggleButtonId: toggleButtonId || `${uniqueId}-toggle-button`,\n }\n}\n\nexport function getItemIndex(index, item, items) {\n if (index !== undefined) {\n return index\n }\n if (items.length === 0) {\n return -1\n }\n return items.indexOf(item)\n}\n\nfunction itemToString(item) {\n return item ? String(item) : ''\n}\n\nexport function getPropTypesValidator(caller, propTypes) {\n // istanbul ignore next\n return function validate(options = {}) {\n Object.keys(propTypes).forEach(key => {\n PropTypes.checkPropTypes(propTypes, options, key, caller.name)\n })\n }\n}\n\nexport function isAcceptedCharacterKey(key) {\n return /^\\S{1}$/.test(key)\n}\n\nexport function capitalizeString(string) {\n return `${string.slice(0, 1).toUpperCase()}${string.slice(1)}`\n}\n\nexport function useLatestRef(val) {\n const ref = useRef(val)\n // technically this is not \"concurrent mode safe\" because we're manipulating\n // the value during render (so it's not idempotent). However, the places this\n // hook is used is to support memoizing callbacks which will be called\n // *during* render, so we need the latest values *during* render.\n // If not for this, then we'd probably want to use useLayoutEffect instead.\n ref.current = val\n return ref\n}\n\n/**\n * Computes the controlled state using a the previous state, props,\n * two reducers, one from downshift and an optional one from the user.\n * Also calls the onChange handlers for state values that have changed.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nexport function useEnhancedReducer(reducer, initialState, props, isStateEqual) {\n const prevStateRef = useRef()\n const actionRef = useRef()\n const enhancedReducer = useCallback(\n (state, action) => {\n actionRef.current = action\n state = getState(state, action.props)\n\n const changes = reducer(state, action)\n const newState = action.props.stateReducer(state, {...action, changes})\n\n return newState\n },\n [reducer],\n )\n const [state, dispatch] = useReducer(enhancedReducer, initialState)\n const propsRef = useLatestRef(props)\n const dispatchWithProps = useCallback(\n action => dispatch({props: propsRef.current, ...action}),\n [propsRef],\n )\n const action = actionRef.current\n\n useEffect(() => {\n const shouldCallOnChangeProps =\n action &&\n prevStateRef.current &&\n !isStateEqual(prevStateRef.current, state)\n\n if (shouldCallOnChangeProps) {\n callOnChangeProps(\n action,\n getState(prevStateRef.current, action.props),\n state,\n )\n }\n\n prevStateRef.current = state\n }, [state, action, isStateEqual])\n\n return [state, dispatchWithProps]\n}\n\n/**\n * Wraps the useEnhancedReducer and applies the controlled prop values before\n * returning the new state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @param {Function} isStateEqual Function that checks if a previous state is equal to the next.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nexport function useControlledReducer(reducer, initialState, props, isStateEqual) {\n const [state, dispatch] = useEnhancedReducer(reducer, initialState, props, isStateEqual)\n\n return [getState(state, props), dispatch]\n}\n\nexport const defaultProps = {\n itemToString,\n stateReducer,\n getA11ySelectionMessage,\n scrollIntoView,\n circularNavigation: false,\n environment:\n typeof window === 'undefined' /* istanbul ignore next (ssr) */\n ? {}\n : window,\n}\n\nexport function getDefaultValue(\n props,\n propKey,\n defaultStateValues = dropdownDefaultStateValues,\n) {\n const defaultPropKey = `default${capitalizeString(propKey)}`\n\n if (defaultPropKey in props) {\n return props[defaultPropKey]\n }\n\n return defaultStateValues[propKey]\n}\n\nexport function getInitialValue(\n props,\n propKey,\n defaultStateValues = dropdownDefaultStateValues,\n) {\n if (propKey in props) {\n return props[propKey]\n }\n\n const initialPropKey = `initial${capitalizeString(propKey)}`\n\n if (initialPropKey in props) {\n return props[initialPropKey]\n }\n return getDefaultValue(props, propKey, defaultStateValues)\n}\n\nexport function getInitialState(props) {\n const selectedItem = getInitialValue(props, 'selectedItem')\n const isOpen = getInitialValue(props, 'isOpen')\n const highlightedIndex = getInitialValue(props, 'highlightedIndex')\n const inputValue = getInitialValue(props, 'inputValue')\n\n return {\n highlightedIndex:\n highlightedIndex < 0 && selectedItem\n ? props.items.indexOf(selectedItem)\n : highlightedIndex,\n isOpen,\n selectedItem,\n inputValue,\n }\n}\n\nexport function getHighlightedIndexOnOpen(\n props,\n state,\n offset,\n getItemNodeFromIndex,\n) {\n const {items, initialHighlightedIndex, defaultHighlightedIndex} = props\n const {selectedItem, highlightedIndex} = state\n\n if (items.length === 0) {\n return -1\n }\n\n // initialHighlightedIndex will give value to highlightedIndex on initial state only.\n if (\n initialHighlightedIndex !== undefined &&\n highlightedIndex === initialHighlightedIndex\n ) {\n return initialHighlightedIndex\n }\n if (defaultHighlightedIndex !== undefined) {\n return defaultHighlightedIndex\n }\n if (selectedItem) {\n if (offset === 0) {\n return items.indexOf(selectedItem)\n }\n return getNextWrappingIndex(\n offset,\n items.indexOf(selectedItem),\n items.length,\n getItemNodeFromIndex,\n false,\n )\n }\n if (offset === 0) {\n return -1\n }\n return offset < 0 ? items.length - 1 : 0\n}\n\n/**\n * Reuse the movement tracking of mouse and touch events.\n *\n * @param {boolean} isOpen Whether the dropdown is open or not.\n * @param {Array} downshiftElementRefs Downshift element refs to track movement (toggleButton, menu etc.)\n * @param {Object} environment Environment where component/hook exists.\n * @param {Function} handleBlur Handler on blur from mouse or touch.\n * @returns {Object} Ref containing whether mouseDown or touchMove event is happening\n */\nexport function useMouseAndTouchTracker(\n isOpen,\n downshiftElementRefs,\n environment,\n handleBlur,\n) {\n const mouseAndTouchTrackersRef = useRef({\n isMouseDown: false,\n isTouchMove: false,\n })\n\n useEffect(() => {\n // The same strategy for checking if a click occurred inside or outside downsift\n // as in downshift.js.\n const onMouseDown = () => {\n mouseAndTouchTrackersRef.current.isMouseDown = true\n }\n const onMouseUp = event => {\n mouseAndTouchTrackersRef.current.isMouseDown = false\n if (\n isOpen &&\n !targetWithinDownshift(\n event.target,\n downshiftElementRefs.map(ref => ref.current),\n environment.document,\n )\n ) {\n handleBlur()\n }\n }\n const onTouchStart = () => {\n mouseAndTouchTrackersRef.current.isTouchMove = false\n }\n const onTouchMove = () => {\n mouseAndTouchTrackersRef.current.isTouchMove = true\n }\n const onTouchEnd = event => {\n if (\n isOpen &&\n !mouseAndTouchTrackersRef.current.isTouchMove &&\n !targetWithinDownshift(\n event.target,\n downshiftElementRefs.map(ref => ref.current),\n environment.document,\n false,\n )\n ) {\n handleBlur()\n }\n }\n\n environment.addEventListener('mousedown', onMouseDown)\n environment.addEventListener('mouseup', onMouseUp)\n environment.addEventListener('touchstart', onTouchStart)\n environment.addEventListener('touchmove', onTouchMove)\n environment.addEventListener('touchend', onTouchEnd)\n\n return function cleanup() {\n environment.removeEventListener('mousedown', onMouseDown)\n environment.removeEventListener('mouseup', onMouseUp)\n environment.removeEventListener('touchstart', onTouchStart)\n environment.removeEventListener('touchmove', onTouchMove)\n environment.removeEventListener('touchend', onTouchEnd)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, environment])\n\n return mouseAndTouchTrackersRef\n}\n\n/**\n * Custom hook that checks if getter props are called correctly.\n *\n * @param {...any} propKeys Getter prop names to be handled.\n * @returns {Function} Setter function called inside getter props to set call information.\n */\nexport function useGetterPropsCalledChecker(...propKeys) {\n const getterPropsCalledRef = useRef(\n propKeys.reduce((acc, propKey) => {\n acc[propKey] = {}\n return acc\n }, {}),\n )\n\n if (process.env.NODE_ENV !== 'production') {\n Object.keys(getterPropsCalledRef.current).forEach(propKey => {\n getterPropsCalledRef.current[propKey] = null\n })\n }\n\n useEffect(() => {\n if (process.env.NODE_ENV !== 'production') {\n Object.keys(getterPropsCalledRef.current).forEach(propKey => {\n if (!getterPropsCalledRef.current[propKey]) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: You forgot to call the ${propKey} getter function on your component / element.`,\n )\n return\n }\n\n const {\n suppressRefError,\n refKey,\n elementRef,\n } = getterPropsCalledRef.current[propKey]\n\n if ((!elementRef || !elementRef.current) && !suppressRefError) {\n // eslint-disable-next-line no-console\n console.error(\n `downshift: The ref prop \"${refKey}\" from ${propKey} was not applied correctly on your element.`,\n )\n }\n })\n }\n })\n\n const setGetterPropCallInfo = useCallback(\n (propKey, suppressRefError, refKey, elementRef) => {\n if (process.env.NODE_ENV !== 'production') {\n getterPropsCalledRef.current[propKey] = {\n suppressRefError,\n refKey,\n elementRef,\n }\n }\n },\n [],\n )\n\n return setGetterPropCallInfo\n}\n\n/**\n * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item.\n * Used by useSelect and useCombobox.\n *\n * @param {Object} prevState\n * @param {Object} newState\n * @returns {boolean} Wheather the states are deeply equal.\n */\n export function isDropdownsStateEqual(prevState, newState) {\n return (\n prevState.isOpen === newState.isOpen &&\n prevState.inputValue === newState.inputValue &&\n prevState.highlightedIndex === newState.highlightedIndex &&\n prevState.selectedItem === newState.selectedItem\n )\n}\n","import PropTypes from 'prop-types'\nimport {defaultProps as commonDefaultProps} from '../utils'\n\nfunction getItemIndexByCharacterKey(\n keysSoFar,\n highlightedIndex,\n items,\n itemToStringParam,\n getItemNodeFromIndex,\n) {\n const lowerCasedItemStrings = items.map(item =>\n itemToStringParam(item).toLowerCase(),\n )\n const lowerCasedKeysSoFar = keysSoFar.toLowerCase()\n const isValid = (itemString, index) => {\n const element = getItemNodeFromIndex(index)\n\n return (\n itemString.startsWith(lowerCasedKeysSoFar) &&\n !(element && element.hasAttribute('disabled'))\n )\n }\n\n for (\n let index = highlightedIndex + 1;\n index < lowerCasedItemStrings.length;\n index++\n ) {\n const itemString = lowerCasedItemStrings[index]\n\n if (isValid(itemString, index)) {\n return index\n }\n }\n\n for (let index = 0; index < highlightedIndex; index++) {\n const itemString = lowerCasedItemStrings[index]\n\n if (isValid(itemString, index)) {\n return index\n }\n }\n\n return highlightedIndex\n}\n\nconst propTypes = {\n items: PropTypes.array.isRequired,\n itemToString: PropTypes.func,\n getA11yStatusMessage: PropTypes.func,\n getA11ySelectionMessage: PropTypes.func,\n circularNavigation: PropTypes.bool,\n highlightedIndex: PropTypes.number,\n defaultHighlightedIndex: PropTypes.number,\n initialHighlightedIndex: PropTypes.number,\n isOpen: PropTypes.bool,\n defaultIsOpen: PropTypes.bool,\n initialIsOpen: PropTypes.bool,\n selectedItem: PropTypes.any,\n initialSelectedItem: PropTypes.any,\n defaultSelectedItem: PropTypes.any,\n id: PropTypes.string,\n labelId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n toggleButtonId: PropTypes.string,\n stateReducer: PropTypes.func,\n onSelectedItemChange: PropTypes.func,\n onHighlightedIndexChange: PropTypes.func,\n onStateChange: PropTypes.func,\n onIsOpenChange: PropTypes.func,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n}\n\n/**\n * Default implementation for status message. Only added when menu is open.\n * Will specift if there are results in the list, and if so, how many,\n * and what keys are relevant.\n *\n * @param {Object} param the downshift state and other relevant properties\n * @return {String} the a11y status message\n */\nfunction getA11yStatusMessage({isOpen, resultCount, previousResultCount}) {\n if (!isOpen) {\n return ''\n }\n\n if (!resultCount) {\n return 'No results are available.'\n }\n\n if (resultCount !== previousResultCount) {\n return `${resultCount} result${\n resultCount === 1 ? ' is' : 's are'\n } available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select.`\n }\n \n return ''\n}\n\nconst defaultProps = {\n ...commonDefaultProps,\n getA11yStatusMessage,\n}\n\nexport {propTypes, getItemIndexByCharacterKey, defaultProps}\n","import productionEnum from '../../productionEnum.macro'\n\nexport const MenuKeyDownArrowDown = productionEnum(\n '__menu_keydown_arrow_down__',\n)\nexport const MenuKeyDownArrowUp = productionEnum('__menu_keydown_arrow_up__')\nexport const MenuKeyDownEscape = productionEnum('__menu_keydown_escape__')\nexport const MenuKeyDownHome = productionEnum('__menu_keydown_home__')\nexport const MenuKeyDownEnd = productionEnum('__menu_keydown_end__')\nexport const MenuKeyDownEnter = productionEnum('__menu_keydown_enter__')\nexport const MenuKeyDownSpaceButton = productionEnum(\n '__menu_keydown_space_button__',\n)\nexport const MenuKeyDownCharacter = productionEnum('__menu_keydown_character__')\nexport const MenuBlur = productionEnum('__menu_blur__')\nexport const MenuMouseLeave = productionEnum('__menu_mouse_leave__')\n\nexport const ItemMouseMove = productionEnum('__item_mouse_move__')\nexport const ItemClick = productionEnum('__item_click__')\n\nexport const ToggleButtonClick = productionEnum('__togglebutton_click__')\nexport const ToggleButtonKeyDownArrowDown = productionEnum(\n '__togglebutton_keydown_arrow_down__',\n)\nexport const ToggleButtonKeyDownArrowUp = productionEnum(\n '__togglebutton_keydown_arrow_up__',\n)\nexport const ToggleButtonKeyDownCharacter = productionEnum(\n '__togglebutton_keydown_character__',\n)\n\nexport const FunctionToggleMenu = productionEnum('__function_toggle_menu__')\nexport const FunctionOpenMenu = productionEnum('__function_open_menu__')\nexport const FunctionCloseMenu = productionEnum('__function_close_menu__')\nexport const FunctionSetHighlightedIndex = productionEnum(\n '__function_set_highlighted_index__',\n)\nexport const FunctionSelectItem = productionEnum('__function_select_item__')\nexport const FunctionSetInputValue = productionEnum(\n '__function_set_input_value__',\n)\nexport const FunctionReset = productionEnum('__function_reset__')\n","import {getNextWrappingIndex, getNextNonDisabledIndex} from '../../utils'\nimport {getHighlightedIndexOnOpen, getDefaultValue} from '../utils'\nimport {getItemIndexByCharacterKey} from './utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\n/* eslint-disable complexity */\nexport default function downshiftSelectReducer(state, action) {\n const {type, props, shiftKey} = action\n let changes\n\n switch (type) {\n case stateChangeTypes.ItemMouseMove:\n changes = {\n highlightedIndex: action.index,\n }\n\n break\n case stateChangeTypes.ItemClick:\n changes = {\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n selectedItem: props.items[action.index],\n }\n\n break\n case stateChangeTypes.ToggleButtonKeyDownCharacter:\n {\n const lowercasedKey = action.key\n const inputValue = `${state.inputValue}${lowercasedKey}`\n const itemIndex = getItemIndexByCharacterKey(\n inputValue,\n state.selectedItem ? props.items.indexOf(state.selectedItem) : -1,\n props.items,\n props.itemToString,\n action.getItemNodeFromIndex,\n )\n\n changes = {\n inputValue,\n ...(itemIndex >= 0 && {\n selectedItem: props.items[itemIndex],\n }),\n }\n }\n\n break\n case stateChangeTypes.ToggleButtonKeyDownArrowDown:\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n 1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n\n break\n case stateChangeTypes.ToggleButtonKeyDownArrowUp:\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n -1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n\n break\n case stateChangeTypes.MenuKeyDownEnter:\n case stateChangeTypes.MenuKeyDownSpaceButton:\n changes = {\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n ...(state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n }),\n }\n\n break\n case stateChangeTypes.MenuKeyDownHome:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n 1,\n 0,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n\n break\n case stateChangeTypes.MenuKeyDownEnd:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n -1,\n props.items.length - 1,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n\n break\n case stateChangeTypes.MenuKeyDownEscape:\n changes = {\n isOpen: false,\n highlightedIndex: -1,\n }\n\n break\n case stateChangeTypes.MenuBlur:\n changes = {\n isOpen: false,\n highlightedIndex: -1,\n }\n\n break\n case stateChangeTypes.MenuKeyDownCharacter:\n {\n const lowercasedKey = action.key\n const inputValue = `${state.inputValue}${lowercasedKey}`\n const highlightedIndex = getItemIndexByCharacterKey(\n inputValue,\n state.highlightedIndex,\n props.items,\n props.itemToString,\n action.getItemNodeFromIndex,\n )\n\n changes = {\n inputValue,\n ...(highlightedIndex >= 0 && {\n highlightedIndex,\n }),\n }\n }\n break\n case stateChangeTypes.MenuKeyDownArrowDown:\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? 5 : 1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n\n break\n case stateChangeTypes.MenuKeyDownArrowUp:\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? -5 : -1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n\n break\n case stateChangeTypes.MenuMouseLeave:\n changes = {\n highlightedIndex: -1,\n }\n\n break\n case stateChangeTypes.ToggleButtonClick:\n case stateChangeTypes.FunctionToggleMenu:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen\n ? -1\n : getHighlightedIndexOnOpen(props, state, 0),\n }\n\n break\n case stateChangeTypes.FunctionOpenMenu:\n changes = {\n isOpen: true,\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 0),\n }\n\n break\n case stateChangeTypes.FunctionCloseMenu:\n changes = {\n isOpen: false,\n }\n\n break\n case stateChangeTypes.FunctionSetHighlightedIndex:\n changes = {\n highlightedIndex: action.highlightedIndex,\n }\n\n break\n case stateChangeTypes.FunctionSelectItem:\n changes = {\n selectedItem: action.selectedItem,\n }\n\n break\n case stateChangeTypes.FunctionSetInputValue:\n changes = {\n inputValue: action.inputValue,\n }\n\n break\n case stateChangeTypes.FunctionReset:\n changes = {\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n isOpen: getDefaultValue(props, 'isOpen'),\n selectedItem: getDefaultValue(props, 'selectedItem'),\n inputValue: getDefaultValue(props, 'inputValue'),\n }\n\n break\n default:\n throw new Error('Reducer called without proper action type.')\n }\n\n return {\n ...state,\n ...changes,\n }\n}\n/* eslint-enable complexity */\n","/* eslint-disable max-statements */\nimport {useRef, useEffect, useCallback, useMemo} from 'react'\nimport {\n getElementIds,\n getItemIndex,\n getPropTypesValidator,\n isAcceptedCharacterKey,\n useControlledReducer,\n getInitialState,\n updateA11yStatus,\n useMouseAndTouchTracker,\n useGetterPropsCalledChecker,\n useLatestRef,\n isDropdownsStateEqual\n} from '../utils'\nimport {\n callAllEventHandlers,\n handleRefs,\n debounce,\n normalizeArrowKey,\n validateControlledUnchanged,\n} from '../../utils'\nimport downshiftSelectReducer from './reducer'\nimport {propTypes, defaultProps} from './utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\nconst validatePropTypes =\n process.env.NODE_ENV === 'production'\n ? /* istanbul ignore next */ null\n : getPropTypesValidator(useSelect, propTypes)\n\nuseSelect.stateChangeTypes = stateChangeTypes\n\nfunction useSelect(userProps = {}) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n validatePropTypes(userProps)\n }\n // Props defaults and destructuring.\n const props = {\n ...defaultProps,\n ...userProps,\n }\n const {\n items,\n scrollIntoView,\n environment,\n initialIsOpen,\n defaultIsOpen,\n itemToString,\n getA11ySelectionMessage,\n getA11yStatusMessage,\n } = props\n // Initial state depending on controlled props.\n const initialState = getInitialState(props)\n const [state, dispatch] = useControlledReducer(\n downshiftSelectReducer,\n initialState,\n props,\n isDropdownsStateEqual\n )\n const {isOpen, highlightedIndex, selectedItem, inputValue} = state\n\n // Element efs.\n const toggleButtonRef = useRef(null)\n const menuRef = useRef(null)\n const itemRefs = useRef()\n itemRefs.current = {}\n // used not to scroll when highlight by mouse.\n const shouldScrollRef = useRef(true)\n // used not to trigger menu blur action in some scenarios.\n const shouldBlurRef = useRef(true)\n // used to keep the inputValue clearTimeout object between renders.\n const clearTimeoutRef = useRef(null)\n // prevent id re-generation between renders.\n const elementIdsRef = useRef(getElementIds(props))\n // used to keep track of how many items we had on previous cycle.\n const previousResultCountRef = useRef()\n const isInitialMountRef = useRef(true)\n // used for checking when props are moving from controlled to uncontrolled.\n const prevPropsRef = useRef(props)\n // utility callback to get item element.\n const latest = useLatestRef({\n state,\n props,\n })\n\n // Some utils.\n const getItemNodeFromIndex = index =>\n itemRefs.current[elementIdsRef.current.getItemId(index)]\n\n // Effects.\n // Sets a11y status message on changes in state.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11yStatusMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, highlightedIndex, inputValue, items])\n // Sets a11y status message on changes in selectedItem.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11ySelectionMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItem])\n // Sets cleanup for the keysSoFar after 500ms.\n useEffect(() => {\n // init the clean function here as we need access to dispatch.\n if (isInitialMountRef.current) {\n clearTimeoutRef.current = debounce(outerDispatch => {\n outerDispatch({\n type: stateChangeTypes.FunctionSetInputValue,\n inputValue: '',\n })\n }, 500)\n }\n\n if (!inputValue) {\n return\n }\n clearTimeoutRef.current(dispatch)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [inputValue])\n /* Controls the focus on the menu or the toggle button. */\n useEffect(() => {\n // Don't focus menu on first render.\n if (isInitialMountRef.current) {\n // Unless it was initialised as open.\n if ((initialIsOpen || defaultIsOpen || isOpen) && menuRef.current) {\n menuRef.current.focus()\n }\n return\n }\n // Focus menu on open.\n if (isOpen) {\n // istanbul ignore else\n if (menuRef.current) {\n menuRef.current.focus()\n }\n return\n }\n // Focus toggleButton on close, but not if it was closed with (Shift+)Tab.\n if (environment.document.activeElement === menuRef.current) {\n // istanbul ignore else\n if (toggleButtonRef.current) {\n shouldBlurRef.current = false\n toggleButtonRef.current.focus()\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen])\n // Scroll on highlighted item if change comes from keyboard.\n useEffect(() => {\n if (\n highlightedIndex < 0 ||\n !isOpen ||\n !Object.keys(itemRefs.current).length\n ) {\n return\n }\n if (shouldScrollRef.current === false) {\n shouldScrollRef.current = true\n } else {\n scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex])\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n previousResultCountRef.current = items.length\n })\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n validateControlledUnchanged(state, prevPropsRef.current, props)\n prevPropsRef.current = props\n }, [state, props])\n // Add mouse/touch events to document.\n const mouseAndTouchTrackersRef = useMouseAndTouchTracker(\n isOpen,\n [menuRef, toggleButtonRef],\n environment,\n () => {\n dispatch({\n type: stateChangeTypes.MenuBlur,\n })\n },\n )\n const setGetterPropCallInfo = useGetterPropsCalledChecker(\n 'getMenuProps',\n 'getToggleButtonProps',\n )\n // Make initial ref false.\n useEffect(() => {\n isInitialMountRef.current = false\n }, [])\n\n // Event handler functions.\n const toggleButtonKeyDownHandlers = useMemo(\n () => ({\n ArrowDown(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.ToggleButtonKeyDownArrowDown,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n ArrowUp(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.ToggleButtonKeyDownArrowUp,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n }),\n [dispatch],\n )\n const menuKeyDownHandlers = useMemo(\n () => ({\n ArrowDown(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownArrowDown,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n ArrowUp(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownArrowUp,\n getItemNodeFromIndex,\n shiftKey: event.shiftKey,\n })\n },\n Home(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownHome,\n getItemNodeFromIndex,\n })\n },\n End(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownEnd,\n getItemNodeFromIndex,\n })\n },\n Escape() {\n dispatch({\n type: stateChangeTypes.MenuKeyDownEscape,\n })\n },\n Enter(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownEnter,\n })\n },\n ' '(event) {\n event.preventDefault()\n\n dispatch({\n type: stateChangeTypes.MenuKeyDownSpaceButton,\n })\n },\n }),\n [dispatch],\n )\n\n // Action functions.\n const toggleMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionToggleMenu,\n })\n }, [dispatch])\n const closeMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionCloseMenu,\n })\n }, [dispatch])\n const openMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionOpenMenu,\n })\n }, [dispatch])\n const setHighlightedIndex = useCallback(\n newHighlightedIndex => {\n dispatch({\n type: stateChangeTypes.FunctionSetHighlightedIndex,\n highlightedIndex: newHighlightedIndex,\n })\n },\n [dispatch],\n )\n const selectItem = useCallback(\n newSelectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionSelectItem,\n selectedItem: newSelectedItem,\n })\n },\n [dispatch],\n )\n const reset = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionReset,\n })\n }, [dispatch])\n const setInputValue = useCallback(\n newInputValue => {\n dispatch({\n type: stateChangeTypes.FunctionSetInputValue,\n inputValue: newInputValue,\n })\n },\n [dispatch],\n )\n // Getter functions.\n const getLabelProps = useCallback(\n labelProps => ({\n id: elementIdsRef.current.labelId,\n htmlFor: elementIdsRef.current.toggleButtonId,\n ...labelProps,\n }),\n [],\n )\n const getMenuProps = useCallback(\n (\n {onMouseLeave, refKey = 'ref', onKeyDown, onBlur, ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n const latestState = latest.current.state\n const menuHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && menuKeyDownHandlers[key]) {\n menuKeyDownHandlers[key](event)\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: stateChangeTypes.MenuKeyDownCharacter,\n key,\n getItemNodeFromIndex,\n })\n }\n }\n const menuHandleBlur = () => {\n // if the blur was a result of selection, we don't trigger this action.\n if (shouldBlurRef.current === false) {\n shouldBlurRef.current = true\n return\n }\n\n const shouldBlur = !mouseAndTouchTrackersRef.current.isMouseDown\n /* istanbul ignore else */\n if (shouldBlur) {\n dispatch({type: stateChangeTypes.MenuBlur})\n }\n }\n const menuHandleMouseLeave = () => {\n dispatch({\n type: stateChangeTypes.MenuMouseLeave,\n })\n }\n\n setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef)\n\n return {\n [refKey]: handleRefs(ref, menuNode => {\n menuRef.current = menuNode\n }),\n id: elementIdsRef.current.menuId,\n role: 'listbox',\n 'aria-labelledby': elementIdsRef.current.labelId,\n tabIndex: -1,\n ...(latestState.isOpen &&\n latestState.highlightedIndex > -1 && {\n 'aria-activedescendant': elementIdsRef.current.getItemId(\n latestState.highlightedIndex,\n ),\n }),\n onMouseLeave: callAllEventHandlers(onMouseLeave, menuHandleMouseLeave),\n onKeyDown: callAllEventHandlers(onKeyDown, menuHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, menuHandleBlur),\n ...rest,\n }\n },\n [dispatch, latest, menuKeyDownHandlers, mouseAndTouchTrackersRef, setGetterPropCallInfo],\n )\n const getToggleButtonProps = useCallback(\n (\n {onClick, onKeyDown, refKey = 'ref', ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n const toggleButtonHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ToggleButtonClick,\n })\n }\n const toggleButtonHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && toggleButtonKeyDownHandlers[key]) {\n toggleButtonKeyDownHandlers[key](event)\n } else if (isAcceptedCharacterKey(key)) {\n dispatch({\n type: stateChangeTypes.ToggleButtonKeyDownCharacter,\n key,\n getItemNodeFromIndex,\n })\n }\n }\n const toggleProps = {\n [refKey]: handleRefs(ref, toggleButtonNode => {\n toggleButtonRef.current = toggleButtonNode\n }),\n id: elementIdsRef.current.toggleButtonId,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': latest.current.state.isOpen,\n 'aria-labelledby': `${elementIdsRef.current.labelId} ${elementIdsRef.current.toggleButtonId}`,\n ...rest,\n }\n\n if (!rest.disabled) {\n toggleProps.onClick = callAllEventHandlers(\n onClick,\n toggleButtonHandleClick,\n )\n toggleProps.onKeyDown = callAllEventHandlers(\n onKeyDown,\n toggleButtonHandleKeyDown,\n )\n }\n\n setGetterPropCallInfo(\n 'getToggleButtonProps',\n suppressRefError,\n refKey,\n toggleButtonRef,\n )\n\n return toggleProps\n },\n [dispatch, latest, toggleButtonKeyDownHandlers, setGetterPropCallInfo],\n )\n const getItemProps = useCallback(\n ({\n item,\n index,\n onMouseMove,\n onClick,\n refKey = 'ref',\n ref,\n ...rest\n } = {}) => {\n const {state: latestState, props: latestProps} = latest.current\n const itemHandleMouseMove = () => {\n if (index === latestState.highlightedIndex) {\n return\n }\n shouldScrollRef.current = false\n dispatch({\n type: stateChangeTypes.ItemMouseMove,\n index,\n })\n }\n const itemHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ItemClick,\n index,\n })\n }\n\n const itemIndex = getItemIndex(index, item, latestProps.items)\n if (itemIndex < 0) {\n throw new Error('Pass either item or item index in getItemProps!')\n }\n const itemProps = {\n role: 'option',\n 'aria-selected': `${itemIndex === latestState.highlightedIndex}`,\n id: elementIdsRef.current.getItemId(itemIndex),\n [refKey]: handleRefs(ref, itemNode => {\n if (itemNode) {\n itemRefs.current[\n elementIdsRef.current.getItemId(itemIndex)\n ] = itemNode\n }\n }),\n ...rest,\n }\n\n if (!rest.disabled) {\n itemProps.onMouseMove = callAllEventHandlers(\n onMouseMove,\n itemHandleMouseMove,\n )\n itemProps.onClick = callAllEventHandlers(onClick, itemHandleClick)\n }\n\n return itemProps\n },\n [dispatch, latest],\n )\n\n return {\n // prop getters.\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getItemProps,\n // actions.\n toggleMenu,\n openMenu,\n closeMenu,\n setHighlightedIndex,\n selectItem,\n reset,\n setInputValue,\n // state.\n highlightedIndex,\n isOpen,\n selectedItem,\n inputValue,\n }\n}\n\nexport default useSelect\n","import productionEnum from '../../productionEnum.macro'\n\nexport const InputKeyDownArrowDown = productionEnum(\n '__input_keydown_arrow_down__',\n)\nexport const InputKeyDownArrowUp = productionEnum('__input_keydown_arrow_up__')\nexport const InputKeyDownEscape = productionEnum('__input_keydown_escape__')\nexport const InputKeyDownHome = productionEnum('__input_keydown_home__')\nexport const InputKeyDownEnd = productionEnum('__input_keydown_end__')\nexport const InputKeyDownEnter = productionEnum('__input_keydown_enter__')\nexport const InputChange = productionEnum('__input_change__')\nexport const InputBlur = productionEnum('__input_blur__')\n\nexport const MenuMouseLeave = productionEnum('__menu_mouse_leave__')\n\nexport const ItemMouseMove = productionEnum('__item_mouse_move__')\nexport const ItemClick = productionEnum('__item_click__')\n\nexport const ToggleButtonClick = productionEnum('__togglebutton_click__')\n\nexport const FunctionToggleMenu = productionEnum('__function_toggle_menu__')\nexport const FunctionOpenMenu = productionEnum('__function_open_menu__')\nexport const FunctionCloseMenu = productionEnum('__function_close_menu__')\nexport const FunctionSetHighlightedIndex = productionEnum(\n '__function_set_highlighted_index__',\n)\nexport const FunctionSelectItem = productionEnum('__function_select_item__')\nexport const FunctionSetInputValue = productionEnum(\n '__function_set_input_value__',\n)\nexport const FunctionReset = productionEnum('__function_reset__')\nexport const ControlledPropUpdatedSelectedItem = productionEnum(\n '__controlled_prop_updated_selected_item__',\n)\n","import {useRef} from 'react'\nimport PropTypes from 'prop-types'\nimport {\n generateId,\n getA11yStatusMessage,\n isControlledProp,\n getState,\n} from '../../utils'\nimport {\n getElementIds as getElementIdsCommon,\n defaultProps as defaultPropsCommon,\n getInitialState as getInitialStateCommon,\n useEnhancedReducer,\n} from '../utils'\nimport {ControlledPropUpdatedSelectedItem} from './stateChangeTypes'\n\nexport function getElementIds({id, inputId, ...rest}) {\n const uniqueId = id === undefined ? `downshift-${generateId()}` : id\n\n return {\n inputId: inputId || `${uniqueId}-input`,\n ...getElementIdsCommon({id, ...rest}),\n }\n}\n\nexport function getInitialState(props) {\n const initialState = getInitialStateCommon(props)\n const {selectedItem} = initialState\n let {inputValue} = initialState\n\n if (\n inputValue === '' &&\n selectedItem &&\n props.defaultInputValue === undefined &&\n props.initialInputValue === undefined &&\n props.inputValue === undefined\n ) {\n inputValue = props.itemToString(selectedItem)\n }\n\n return {\n ...initialState,\n inputValue,\n }\n}\n\nexport const propTypes = {\n items: PropTypes.array.isRequired,\n itemToString: PropTypes.func,\n getA11yStatusMessage: PropTypes.func,\n getA11ySelectionMessage: PropTypes.func,\n circularNavigation: PropTypes.bool,\n highlightedIndex: PropTypes.number,\n defaultHighlightedIndex: PropTypes.number,\n initialHighlightedIndex: PropTypes.number,\n isOpen: PropTypes.bool,\n defaultIsOpen: PropTypes.bool,\n initialIsOpen: PropTypes.bool,\n selectedItem: PropTypes.any,\n initialSelectedItem: PropTypes.any,\n defaultSelectedItem: PropTypes.any,\n inputValue: PropTypes.string,\n defaultInputValue: PropTypes.string,\n initialInputValue: PropTypes.string,\n id: PropTypes.string,\n labelId: PropTypes.string,\n menuId: PropTypes.string,\n getItemId: PropTypes.func,\n inputId: PropTypes.string,\n toggleButtonId: PropTypes.string,\n stateReducer: PropTypes.func,\n onSelectedItemChange: PropTypes.func,\n onHighlightedIndexChange: PropTypes.func,\n onStateChange: PropTypes.func,\n onIsOpenChange: PropTypes.func,\n onInputValueChange: PropTypes.func,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n}\n\n/**\n * The useCombobox version of useControlledReducer, which also\n * checks if the controlled prop selectedItem changed between\n * renders. If so, it will also update inputValue with its\n * string equivalent. It uses the common useEnhancedReducer to\n * compute the rest of the state.\n *\n * @param {Function} reducer Reducer function from downshift.\n * @param {Object} initialState Initial state of the hook.\n * @param {Object} props The hook props.\n * @returns {Array} An array with the state and an action dispatcher.\n */\nexport function useControlledReducer(reducer, initialState, props) {\n const previousSelectedItemRef = useRef()\n const [state, dispatch] = useEnhancedReducer(reducer, initialState, props)\n\n // ToDo: if needed, make same approach as selectedItemChanged from Downshift.\n if (isControlledProp(props, 'selectedItem')) {\n if (previousSelectedItemRef.current !== props.selectedItem) {\n dispatch({\n type: ControlledPropUpdatedSelectedItem,\n inputValue: props.itemToString(props.selectedItem),\n })\n }\n\n previousSelectedItemRef.current =\n state.selectedItem === previousSelectedItemRef.current\n ? props.selectedItem\n : state.selectedItem\n }\n\n return [getState(state, props), dispatch]\n}\n\nexport const defaultProps = {\n ...defaultPropsCommon,\n getA11yStatusMessage,\n circularNavigation: true,\n}\n","import {getHighlightedIndexOnOpen, getDefaultValue} from '../utils'\nimport {getNextWrappingIndex, getNextNonDisabledIndex} from '../../utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\n/* eslint-disable complexity */\nexport default function downshiftUseComboboxReducer(state, action) {\n const {type, props, shiftKey} = action\n let changes\n\n switch (type) {\n case stateChangeTypes.ItemMouseMove:\n changes = {\n highlightedIndex: action.index,\n }\n break\n case stateChangeTypes.ItemClick:\n changes = {\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n selectedItem: props.items[action.index],\n inputValue: props.itemToString(props.items[action.index]),\n }\n break\n case stateChangeTypes.InputKeyDownArrowDown:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? 5 : 1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n 1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n }\n break\n case stateChangeTypes.InputKeyDownArrowUp:\n if (state.isOpen) {\n changes = {\n highlightedIndex: getNextWrappingIndex(\n shiftKey ? -5 : -1,\n state.highlightedIndex,\n props.items.length,\n action.getItemNodeFromIndex,\n props.circularNavigation,\n ),\n }\n } else {\n changes = {\n highlightedIndex: getHighlightedIndexOnOpen(\n props,\n state,\n -1,\n action.getItemNodeFromIndex,\n ),\n isOpen: true,\n }\n }\n break\n case stateChangeTypes.InputKeyDownEnter:\n changes = {\n ...(state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n isOpen: getDefaultValue(props, 'isOpen'),\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n inputValue: props.itemToString(props.items[state.highlightedIndex]),\n }),\n }\n break\n case stateChangeTypes.InputKeyDownEscape:\n changes = {\n isOpen: false,\n selectedItem: null,\n highlightedIndex: -1,\n inputValue: '',\n }\n break\n case stateChangeTypes.InputKeyDownHome:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n 1,\n 0,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n break\n case stateChangeTypes.InputKeyDownEnd:\n changes = {\n highlightedIndex: getNextNonDisabledIndex(\n -1,\n props.items.length - 1,\n props.items.length,\n action.getItemNodeFromIndex,\n false,\n ),\n }\n break\n case stateChangeTypes.InputBlur:\n changes = {\n isOpen: false,\n ...(state.highlightedIndex >= 0 && {\n selectedItem: props.items[state.highlightedIndex],\n inputValue: props.itemToString(props.items[state.highlightedIndex]),\n highlightedIndex: -1,\n }),\n }\n break\n case stateChangeTypes.InputChange:\n changes = {\n isOpen: true,\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n inputValue: action.inputValue,\n }\n break\n case stateChangeTypes.MenuMouseLeave:\n changes = {\n highlightedIndex: -1,\n }\n break\n case stateChangeTypes.ToggleButtonClick:\n case stateChangeTypes.FunctionToggleMenu:\n changes = {\n isOpen: !state.isOpen,\n highlightedIndex: state.isOpen\n ? -1\n : getHighlightedIndexOnOpen(props, state, 0),\n }\n break\n case stateChangeTypes.FunctionOpenMenu:\n changes = {\n isOpen: true,\n highlightedIndex: getHighlightedIndexOnOpen(props, state, 0),\n }\n break\n case stateChangeTypes.FunctionCloseMenu:\n changes = {\n isOpen: false,\n }\n break\n case stateChangeTypes.FunctionSetHighlightedIndex:\n changes = {\n highlightedIndex: action.highlightedIndex,\n }\n break\n case stateChangeTypes.FunctionSelectItem:\n changes = {\n selectedItem: action.selectedItem,\n inputValue: props.itemToString(action.selectedItem)\n }\n break\n case stateChangeTypes.ControlledPropUpdatedSelectedItem:\n case stateChangeTypes.FunctionSetInputValue:\n changes = {\n inputValue: action.inputValue,\n }\n break\n case stateChangeTypes.FunctionReset:\n changes = {\n highlightedIndex: getDefaultValue(props, 'highlightedIndex'),\n isOpen: getDefaultValue(props, 'isOpen'),\n selectedItem: getDefaultValue(props, 'selectedItem'),\n inputValue: getDefaultValue(props, 'inputValue'),\n }\n break\n default:\n throw new Error('Reducer called without proper action type.')\n }\n\n return {\n ...state,\n ...changes,\n }\n}\n/* eslint-enable complexity */\n","/* eslint-disable max-statements */\nimport {useRef, useEffect, useCallback, useMemo} from 'react'\nimport {isPreact, isReactNative} from '../../is.macro'\nimport {\n handleRefs,\n normalizeArrowKey,\n callAllEventHandlers,\n validateControlledUnchanged,\n} from '../../utils'\nimport {\n getItemIndex,\n getPropTypesValidator,\n updateA11yStatus,\n useMouseAndTouchTracker,\n useGetterPropsCalledChecker,\n useLatestRef,\n} from '../utils'\nimport {\n getInitialState,\n propTypes,\n defaultProps,\n getElementIds,\n useControlledReducer,\n} from './utils'\nimport downshiftUseComboboxReducer from './reducer'\nimport * as stateChangeTypes from './stateChangeTypes'\n\nconst validatePropTypes =\n process.env.NODE_ENV === 'production'\n ? /* istanbul ignore next */ null\n : getPropTypesValidator(useCombobox, propTypes)\n\nuseCombobox.stateChangeTypes = stateChangeTypes\n\nfunction useCombobox(userProps = {}) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== 'production') {\n validatePropTypes(userProps)\n }\n // Props defaults and destructuring.\n const props = {\n ...defaultProps,\n ...userProps,\n }\n const {\n initialIsOpen,\n defaultIsOpen,\n items,\n scrollIntoView,\n environment,\n getA11yStatusMessage,\n getA11ySelectionMessage,\n itemToString,\n } = props\n // Initial state depending on controlled props.\n const initialState = getInitialState(props)\n const [state, dispatch] = useControlledReducer(\n downshiftUseComboboxReducer,\n initialState,\n props,\n )\n const {isOpen, highlightedIndex, selectedItem, inputValue} = state\n\n // Element refs.\n const menuRef = useRef(null)\n const itemRefs = useRef()\n const inputRef = useRef(null)\n const toggleButtonRef = useRef(null)\n const comboboxRef = useRef(null)\n itemRefs.current = {}\n // used not to scroll on highlight by mouse.\n const shouldScrollRef = useRef(true)\n const isInitialMountRef = useRef(true)\n // prevent id re-generation between renders.\n const elementIdsRef = useRef(getElementIds(props))\n // used to keep track of how many items we had on previous cycle.\n const previousResultCountRef = useRef()\n // used for checking when props are moving from controlled to uncontrolled.\n const prevPropsRef = useRef(props)\n // used to store information about getter props being called on render.\n // utility callback to get item element.\n const latest = useLatestRef({state, props})\n\n const getItemNodeFromIndex = index =>\n itemRefs.current[elementIdsRef.current.getItemId(index)]\n\n // Effects.\n // Sets a11y status message on changes in state.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11yStatusMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, highlightedIndex, inputValue, items])\n // Sets a11y status message on changes in selectedItem.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n const previousResultCount = previousResultCountRef.current\n\n updateA11yStatus(\n () =>\n getA11ySelectionMessage({\n isOpen,\n highlightedIndex,\n selectedItem,\n inputValue,\n highlightedItem: items[highlightedIndex],\n resultCount: items.length,\n itemToString,\n previousResultCount,\n }),\n environment.document,\n )\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItem])\n // Scroll on highlighted item if change comes from keyboard.\n useEffect(() => {\n if (\n highlightedIndex < 0 ||\n !isOpen ||\n !Object.keys(itemRefs.current).length\n ) {\n return\n }\n\n if (shouldScrollRef.current === false) {\n shouldScrollRef.current = true\n } else {\n scrollIntoView(getItemNodeFromIndex(highlightedIndex), menuRef.current)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [highlightedIndex])\n // Controls the focus on the menu or the toggle button.\n useEffect(() => {\n // Don't focus menu on first render.\n if (isInitialMountRef.current) {\n // Unless it was initialised as open.\n if (initialIsOpen || defaultIsOpen || isOpen) {\n if (inputRef.current) {\n inputRef.current.focus()\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen])\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n previousResultCountRef.current = items.length\n })\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n validateControlledUnchanged(state, prevPropsRef.current, props)\n prevPropsRef.current = props\n }, [state, props])\n // Add mouse/touch events to document.\n const mouseAndTouchTrackersRef = useMouseAndTouchTracker(\n isOpen,\n [comboboxRef, menuRef, toggleButtonRef],\n environment,\n () => {\n dispatch({\n type: stateChangeTypes.InputBlur,\n })\n },\n )\n const setGetterPropCallInfo = useGetterPropsCalledChecker(\n 'getInputProps',\n 'getComboboxProps',\n 'getMenuProps',\n )\n // Make initial ref false.\n useEffect(() => {\n isInitialMountRef.current = false\n }, [])\n\n /* Event handler functions */\n const inputKeyDownHandlers = useMemo(\n () => ({\n ArrowDown(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownArrowDown,\n shiftKey: event.shiftKey,\n getItemNodeFromIndex,\n })\n },\n ArrowUp(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownArrowUp,\n shiftKey: event.shiftKey,\n getItemNodeFromIndex,\n })\n },\n Home(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownHome,\n getItemNodeFromIndex,\n })\n },\n End(event) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownEnd,\n getItemNodeFromIndex,\n })\n },\n Escape() {\n dispatch({\n type: stateChangeTypes.InputKeyDownEscape,\n })\n },\n Enter(event) {\n // if IME composing, wait for next Enter keydown event.\n if (event.which === 229) {\n return\n }\n const latestState = latest.current.state\n\n if (latestState.isOpen && latestState.highlightedIndex > -1) {\n event.preventDefault()\n dispatch({\n type: stateChangeTypes.InputKeyDownEnter,\n getItemNodeFromIndex,\n })\n }\n },\n }),\n [dispatch, latest],\n )\n\n // Getter props.\n const getLabelProps = useCallback(\n labelProps => ({\n id: elementIdsRef.current.labelId,\n htmlFor: elementIdsRef.current.inputId,\n ...labelProps,\n }),\n [],\n )\n const getMenuProps = useCallback(\n (\n {onMouseLeave, refKey = 'ref', ref, ...rest} = {},\n {suppressRefError = false} = {},\n ) => {\n setGetterPropCallInfo('getMenuProps', suppressRefError, refKey, menuRef)\n return {\n [refKey]: handleRefs(ref, menuNode => {\n menuRef.current = menuNode\n }),\n id: elementIdsRef.current.menuId,\n role: 'listbox',\n 'aria-labelledby': elementIdsRef.current.labelId,\n onMouseLeave: callAllEventHandlers(onMouseLeave, () => {\n dispatch({\n type: stateChangeTypes.MenuMouseLeave,\n })\n }),\n ...rest,\n }\n },\n [dispatch, setGetterPropCallInfo],\n )\n\n const getItemProps = useCallback(\n ({\n item,\n index,\n refKey = 'ref',\n ref,\n onMouseMove,\n onClick,\n onPress,\n ...rest\n } = {}) => {\n const {props: latestProps, state: latestState} = latest.current\n const itemIndex = getItemIndex(index, item, latestProps.items)\n if (itemIndex < 0) {\n throw new Error('Pass either item or item index in getItemProps!')\n }\n\n const onSelectKey = isReactNative\n ? /* istanbul ignore next (react-native) */ 'onPress'\n : 'onClick'\n const customClickHandler = isReactNative\n ? /* istanbul ignore next (react-native) */ onPress\n : onClick\n\n const itemHandleMouseMove = () => {\n if (index === latestState.highlightedIndex) {\n return\n }\n shouldScrollRef.current = false\n dispatch({\n type: stateChangeTypes.ItemMouseMove,\n index,\n })\n }\n const itemHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ItemClick,\n index,\n })\n }\n\n return {\n [refKey]: handleRefs(ref, itemNode => {\n if (itemNode) {\n itemRefs.current[\n elementIdsRef.current.getItemId(itemIndex)\n ] = itemNode\n }\n }),\n role: 'option',\n 'aria-selected': `${itemIndex === latestState.highlightedIndex}`,\n id: elementIdsRef.current.getItemId(itemIndex),\n ...(!rest.disabled && {\n onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),\n [onSelectKey]: callAllEventHandlers(\n customClickHandler,\n itemHandleClick,\n ),\n }),\n ...rest,\n }\n },\n [dispatch, latest],\n )\n\n const getToggleButtonProps = useCallback(\n ({onClick, onPress, refKey = 'ref', ref, ...rest} = {}) => {\n const toggleButtonHandleClick = () => {\n dispatch({\n type: stateChangeTypes.ToggleButtonClick,\n })\n\n if (!latest.current.state.isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }\n\n return {\n [refKey]: handleRefs(ref, toggleButtonNode => {\n toggleButtonRef.current = toggleButtonNode\n }),\n id: elementIdsRef.current.toggleButtonId,\n tabIndex: -1,\n ...(!rest.disabled && {\n ...(isReactNative\n ? /* istanbul ignore next (react-native) */ {\n onPress: callAllEventHandlers(onPress, toggleButtonHandleClick),\n }\n : {\n onClick: callAllEventHandlers(onClick, toggleButtonHandleClick),\n }),\n }),\n ...rest,\n }\n },\n [dispatch, latest],\n )\n const getInputProps = useCallback(\n (\n {\n onKeyDown,\n onChange,\n onInput,\n onBlur,\n onChangeText,\n refKey = 'ref',\n ref,\n ...rest\n } = {},\n {suppressRefError = false} = {},\n ) => {\n setGetterPropCallInfo('getInputProps', suppressRefError, refKey, inputRef)\n\n const latestState = latest.current.state\n const inputHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && inputKeyDownHandlers[key]) {\n inputKeyDownHandlers[key](event)\n }\n }\n const inputHandleChange = event => {\n dispatch({\n type: stateChangeTypes.InputChange,\n inputValue: isReactNative\n ? /* istanbul ignore next (react-native) */ event.nativeEvent.text\n : event.target.value,\n })\n }\n const inputHandleBlur = () => {\n /* istanbul ignore else */\n if (!mouseAndTouchTrackersRef.current.isMouseDown) {\n dispatch({\n type: stateChangeTypes.InputBlur,\n })\n }\n }\n\n /* istanbul ignore next (preact) */\n const onChangeKey = isPreact ? 'onInput' : 'onChange'\n let eventHandlers = {}\n\n if (!rest.disabled) {\n eventHandlers = {\n [onChangeKey]: callAllEventHandlers(\n onChange,\n onInput,\n inputHandleChange,\n ),\n onKeyDown: callAllEventHandlers(onKeyDown, inputHandleKeyDown),\n onBlur: callAllEventHandlers(onBlur, inputHandleBlur),\n }\n }\n\n /* istanbul ignore if (react-native) */\n if (isReactNative) {\n eventHandlers.onChange = callAllEventHandlers(\n onChange,\n onInput,\n inputHandleChange,\n )\n eventHandlers.onChangeText = callAllEventHandlers(\n onChangeText,\n onInput,\n text => {\n inputHandleChange({nativeEvent: {text}})\n },\n )\n }\n\n return {\n [refKey]: handleRefs(ref, inputNode => {\n inputRef.current = inputNode\n }),\n id: elementIdsRef.current.inputId,\n 'aria-autocomplete': 'list',\n 'aria-controls': elementIdsRef.current.menuId,\n ...(latestState.isOpen &&\n latestState.highlightedIndex > -1 && {\n 'aria-activedescendant': elementIdsRef.current.getItemId(\n latestState.highlightedIndex,\n ),\n }),\n 'aria-labelledby': elementIdsRef.current.labelId,\n // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion\n // revert back since autocomplete=\"nope\" is ignored on latest Chrome and Opera\n autoComplete: 'off',\n value: latestState.inputValue,\n ...eventHandlers,\n ...rest,\n }\n },\n [\n dispatch,\n inputKeyDownHandlers,\n latest,\n mouseAndTouchTrackersRef,\n setGetterPropCallInfo,\n ],\n )\n const getComboboxProps = useCallback(\n ({refKey = 'ref', ref, ...rest} = {}, {suppressRefError = false} = {}) => {\n setGetterPropCallInfo(\n 'getComboboxProps',\n suppressRefError,\n refKey,\n comboboxRef,\n )\n\n return {\n [refKey]: handleRefs(ref, comboboxNode => {\n comboboxRef.current = comboboxNode\n }),\n role: 'combobox',\n 'aria-haspopup': 'listbox',\n 'aria-owns': elementIdsRef.current.menuId,\n 'aria-expanded': latest.current.state.isOpen,\n ...rest,\n }\n },\n [latest, setGetterPropCallInfo],\n )\n\n // returns\n const toggleMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionToggleMenu,\n })\n }, [dispatch])\n const closeMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionCloseMenu,\n })\n }, [dispatch])\n const openMenu = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionOpenMenu,\n })\n }, [dispatch])\n const setHighlightedIndex = useCallback(\n newHighlightedIndex => {\n dispatch({\n type: stateChangeTypes.FunctionSetHighlightedIndex,\n highlightedIndex: newHighlightedIndex,\n })\n },\n [dispatch],\n )\n const selectItem = useCallback(\n newSelectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionSelectItem,\n selectedItem: newSelectedItem,\n })\n },\n [dispatch],\n )\n const setInputValue = useCallback(\n newInputValue => {\n dispatch({\n type: stateChangeTypes.FunctionSetInputValue,\n inputValue: newInputValue,\n })\n },\n [dispatch],\n )\n const reset = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionReset,\n })\n }, [dispatch])\n\n return {\n // prop getters.\n getItemProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getComboboxProps,\n getToggleButtonProps,\n // actions.\n toggleMenu,\n openMenu,\n closeMenu,\n setHighlightedIndex,\n setInputValue,\n selectItem,\n reset,\n // state.\n highlightedIndex,\n isOpen,\n selectedItem,\n inputValue,\n }\n}\n\nexport default useCombobox\n","import PropTypes from 'prop-types'\nimport {\n getInitialValue as getInitialValueCommon,\n getDefaultValue as getDefaultValueCommon,\n defaultProps as defaultPropsCommon,\n} from '../utils'\n\nconst defaultStateValues = {\n activeIndex: -1,\n selectedItems: [],\n}\n\n/**\n * Returns the initial value for a state key in the following order:\n * 1. controlled prop, 2. initial prop, 3. default prop, 4. default\n * value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\nfunction getInitialValue(props, propKey) {\n return getInitialValueCommon(props, propKey, defaultStateValues)\n}\n\n/**\n * Returns the default value for a state key in the following order:\n * 1. controlled prop, 2. default prop, 3. default value from Downshift.\n *\n * @param {Object} props Props passed to the hook.\n * @param {string} propKey Props key to generate the value for.\n * @returns {any} The initial value for that prop.\n */\nexport function getDefaultValue(props, propKey) {\n return getDefaultValueCommon(props, propKey, defaultStateValues)\n}\n\n/**\n * Gets the initial state based on the provided props. It uses initial, default\n * and controlled props related to state in order to compute the initial value.\n *\n * @param {Object} props Props passed to the hook.\n * @returns {Object} The initial state.\n */\nexport function getInitialState(props) {\n const activeIndex = getInitialValue(props, 'activeIndex')\n const selectedItems = getInitialValue(props, 'selectedItems')\n\n return {\n activeIndex,\n selectedItems,\n }\n}\n\n/**\n * Returns true if dropdown keydown operation is permitted. Should not be\n * allowed on keydown with modifier keys (ctrl, alt, shift, meta), on\n * input element with text content that is either highlighted or selection\n * cursor is not at the starting position.\n *\n * @param {KeyboardEvent} event The event from keydown.\n * @returns {boolean} Whether the operation is allowed.\n */\nexport function isKeyDownOperationPermitted(event) {\n if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {\n return false\n }\n\n const element = event.target\n\n if (\n element instanceof HTMLInputElement && // if element is a text input\n element.value !== '' && // and we have text in it\n // and cursor is either not at the start or is currently highlighting text.\n (element.selectionStart !== 0 || element.selectionEnd !== 0)\n ) {\n return false\n }\n\n return true\n}\n\n/**\n * Returns a message to be added to aria-live region when item is removed.\n *\n * @param {Object} selectionParameters Parameters required to build the message.\n * @returns {string} The a11y message.\n */\nfunction getA11yRemovalMessage(selectionParameters) {\n const {\n removedSelectedItem,\n itemToString: itemToStringLocal,\n } = selectionParameters\n\n return `${itemToStringLocal(removedSelectedItem)} has been removed.`\n}\n\nexport const propTypes = {\n selectedItems: PropTypes.array,\n initialSelectedItems: PropTypes.array,\n defaultSelectedItems: PropTypes.array,\n itemToString: PropTypes.func,\n getA11yRemovalMessage: PropTypes.func,\n stateReducer: PropTypes.func,\n activeIndex: PropTypes.number,\n initialActiveIndex: PropTypes.number,\n defaultActiveIndex: PropTypes.number,\n onActiveIndexChange: PropTypes.func,\n onSelectedItemsChange: PropTypes.func,\n keyNavigationNext: PropTypes.string,\n keyNavigationPrevious: PropTypes.string,\n environment: PropTypes.shape({\n addEventListener: PropTypes.func,\n removeEventListener: PropTypes.func,\n document: PropTypes.shape({\n getElementById: PropTypes.func,\n activeElement: PropTypes.any,\n body: PropTypes.any,\n }),\n }),\n}\n\nexport const defaultProps = {\n itemToString: defaultPropsCommon.itemToString,\n stateReducer: defaultPropsCommon.stateReducer,\n environment: defaultPropsCommon.environment,\n getA11yRemovalMessage,\n keyNavigationNext: 'ArrowRight',\n keyNavigationPrevious: 'ArrowLeft',\n}\n","import productionEnum from '../../productionEnum.macro'\n\nexport const SelectedItemClick = productionEnum('__selected_item_click__')\nexport const SelectedItemKeyDownDelete = productionEnum(\n '__selected_item_keydown_delete__',\n)\nexport const SelectedItemKeyDownBackspace = productionEnum(\n '__selected_item_keydown_backspace__',\n)\nexport const SelectedItemKeyDownNavigationNext = productionEnum(\n '__selected_item_keydown_navigation_next__',\n)\nexport const SelectedItemKeyDownNavigationPrevious = productionEnum(\n '__selected_item_keydown_navigation_previous__',\n)\n\nexport const DropdownKeyDownNavigationPrevious = productionEnum(\n '__dropdown_keydown_navigation_previous__',\n)\nexport const DropdownKeyDownBackspace = productionEnum(\n '__dropdown_keydown_backspace__',\n)\nexport const DropdownClick = productionEnum('__dropdown_click__')\n\nexport const FunctionAddSelectedItem = productionEnum(\n '__function_add_selected_item__',\n)\nexport const FunctionRemoveSelectedItem = productionEnum(\n '__function_remove_selected_item__',\n)\nexport const FunctionSetSelectedItems = productionEnum(\n '__function_set_selected_items__',\n)\nexport const FunctionSetActiveIndex = productionEnum(\n '__function_set_active_index__',\n)\nexport const FunctionReset = productionEnum('__function_reset__')\n","import {getDefaultValue} from './utils'\nimport * as stateChangeTypes from './stateChangeTypes'\n\n/* eslint-disable complexity */\nexport default function downshiftMultipleSelectionReducer(state, action) {\n const {type, index, props, selectedItem} = action\n const {activeIndex, selectedItems} = state\n let changes\n\n switch (type) {\n case stateChangeTypes.SelectedItemClick:\n changes = {\n activeIndex: index,\n }\n\n break\n case stateChangeTypes.SelectedItemKeyDownNavigationPrevious:\n changes = {\n activeIndex: activeIndex - 1 < 0 ? 0 : activeIndex - 1,\n }\n\n break\n case stateChangeTypes.SelectedItemKeyDownNavigationNext:\n changes = {\n activeIndex:\n activeIndex + 1 >= selectedItems.length ? -1 : activeIndex + 1,\n }\n\n break\n case stateChangeTypes.SelectedItemKeyDownBackspace:\n case stateChangeTypes.SelectedItemKeyDownDelete: {\n let newActiveIndex = activeIndex\n\n if (selectedItems.length === 1) {\n newActiveIndex = -1\n } else if (activeIndex === selectedItems.length - 1) {\n newActiveIndex = selectedItems.length - 2\n }\n\n changes = {\n selectedItems: [\n ...selectedItems.slice(0, activeIndex),\n ...selectedItems.slice(activeIndex + 1),\n ],\n ...{activeIndex: newActiveIndex},\n }\n\n break\n }\n case stateChangeTypes.DropdownKeyDownNavigationPrevious:\n changes = {\n activeIndex: selectedItems.length - 1,\n }\n break\n case stateChangeTypes.DropdownKeyDownBackspace:\n changes = {\n selectedItems: selectedItems.slice(0, selectedItems.length - 1),\n }\n break\n case stateChangeTypes.FunctionAddSelectedItem:\n changes = {\n selectedItems: [...selectedItems, selectedItem],\n }\n break\n case stateChangeTypes.DropdownClick:\n changes = {\n activeIndex: -1,\n }\n break\n case stateChangeTypes.FunctionRemoveSelectedItem: {\n let newActiveIndex = activeIndex\n const selectedItemIndex = selectedItems.indexOf(selectedItem)\n\n if (selectedItems.length === 1) {\n newActiveIndex = -1\n } else if (selectedItemIndex === selectedItems.length - 1) {\n newActiveIndex = selectedItems.length - 2\n }\n\n changes = {\n selectedItems: [\n ...selectedItems.slice(0, selectedItemIndex),\n ...selectedItems.slice(selectedItemIndex + 1),\n ],\n ...{activeIndex: newActiveIndex},\n }\n break\n }\n case stateChangeTypes.FunctionSetSelectedItems: {\n const {selectedItems: newSelectedItems} = action\n changes = {\n selectedItems: newSelectedItems,\n }\n break\n }\n case stateChangeTypes.FunctionSetActiveIndex: {\n const {activeIndex: newActiveIndex} = action\n changes = {\n activeIndex: newActiveIndex,\n }\n break\n }\n case stateChangeTypes.FunctionReset:\n changes = {\n activeIndex: getDefaultValue(props, 'activeIndex'),\n selectedItems: getDefaultValue(props, 'selectedItems'),\n }\n break\n default:\n throw new Error('Reducer called without proper action type.')\n }\n\n return {\n ...state,\n ...changes,\n }\n}\n","import {useRef, useEffect, useCallback, useMemo} from 'react'\nimport setStatus from '../../set-a11y-status'\nimport {\n handleRefs,\n callAllEventHandlers,\n normalizeArrowKey,\n validateControlledUnchanged,\n} from '../../utils'\nimport {\n useControlledReducer,\n getItemIndex,\n useGetterPropsCalledChecker,\n useLatestRef,\n} from '../utils'\nimport {\n getInitialState,\n defaultProps,\n isKeyDownOperationPermitted,\n} from './utils'\nimport downshiftMultipleSelectionReducer from './reducer'\nimport * as stateChangeTypes from './stateChangeTypes'\n\nuseMultipleSelection.stateChangeTypes = stateChangeTypes\n\nfunction useMultipleSelection(userProps = {}) {\n // Props defaults and destructuring.\n const props = {\n ...defaultProps,\n ...userProps,\n }\n const {\n getA11yRemovalMessage,\n itemToString,\n environment,\n keyNavigationNext,\n keyNavigationPrevious,\n } = props\n\n // Reducer init.\n const [state, dispatch] = useControlledReducer(\n downshiftMultipleSelectionReducer,\n getInitialState(props),\n props,\n )\n const {activeIndex, selectedItems} = state\n\n // Refs.\n const isInitialMountRef = useRef(true)\n const dropdownRef = useRef(null)\n const previousSelectedItemsRef = useRef(selectedItems)\n const selectedItemRefs = useRef()\n selectedItemRefs.current = []\n // used for checking when props are moving from controlled to uncontrolled.\n const prevPropsRef = useRef(props)\n const latest = useLatestRef({state, props})\n\n // Effects.\n /* Sets a11y status message on changes in selectedItem. */\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n if (selectedItems.length < previousSelectedItemsRef.current.length) {\n const removedSelectedItem = previousSelectedItemsRef.current.find(\n item => selectedItems.indexOf(item) < 0,\n )\n\n setStatus(\n getA11yRemovalMessage({\n itemToString,\n resultCount: selectedItems.length,\n removedSelectedItem,\n activeIndex,\n activeSelectedItem: selectedItems[activeIndex],\n }),\n environment.document,\n )\n }\n\n previousSelectedItemsRef.current = selectedItems\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedItems.length])\n // Sets focus on active item.\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n if (activeIndex === -1 && dropdownRef.current) {\n dropdownRef.current.focus()\n } else if (selectedItemRefs.current[activeIndex]) {\n selectedItemRefs.current[activeIndex].focus()\n }\n }, [activeIndex])\n useEffect(() => {\n if (isInitialMountRef.current) {\n return\n }\n\n validateControlledUnchanged(state, prevPropsRef.current, props)\n prevPropsRef.current = props\n }, [state, props])\n const setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps')\n // Make initial ref false.\n useEffect(() => {\n isInitialMountRef.current = false\n }, [])\n\n // Event handler functions.\n const selectedItemKeyDownHandlers = useMemo(\n () => ({\n [keyNavigationPrevious]() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownNavigationPrevious,\n })\n },\n [keyNavigationNext]() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownNavigationNext,\n })\n },\n Delete() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownDelete,\n })\n },\n Backspace() {\n dispatch({\n type: stateChangeTypes.SelectedItemKeyDownBackspace,\n })\n },\n }),\n [dispatch, keyNavigationNext, keyNavigationPrevious],\n )\n const dropdownKeyDownHandlers = useMemo(\n () => ({\n [keyNavigationPrevious](event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: stateChangeTypes.DropdownKeyDownNavigationPrevious,\n })\n }\n },\n Backspace(event) {\n if (isKeyDownOperationPermitted(event)) {\n dispatch({\n type: stateChangeTypes.DropdownKeyDownBackspace,\n })\n }\n },\n }),\n [dispatch, keyNavigationPrevious],\n )\n\n // Getter props.\n const getSelectedItemProps = useCallback(\n ({\n refKey = 'ref',\n ref,\n onClick,\n onKeyDown,\n selectedItem,\n index,\n ...rest\n } = {}) => {\n const {state: latestState} = latest.current\n const itemIndex = getItemIndex(\n index,\n selectedItem,\n latestState.selectedItems,\n )\n if (itemIndex < 0) {\n throw new Error(\n 'Pass either selectedItem or index in getSelectedItemProps!',\n )\n }\n\n const selectedItemHandleClick = () => {\n dispatch({\n type: stateChangeTypes.SelectedItemClick,\n index,\n })\n }\n const selectedItemHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && selectedItemKeyDownHandlers[key]) {\n selectedItemKeyDownHandlers[key](event)\n }\n }\n\n return {\n [refKey]: handleRefs(ref, selectedItemNode => {\n if (selectedItemNode) {\n selectedItemRefs.current.push(selectedItemNode)\n }\n }),\n tabIndex: index === latestState.activeIndex ? 0 : -1,\n onClick: callAllEventHandlers(onClick, selectedItemHandleClick),\n onKeyDown: callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown),\n ...rest,\n }\n },\n [dispatch, latest, selectedItemKeyDownHandlers],\n )\n const getDropdownProps = useCallback(\n (\n {\n refKey = 'ref',\n ref,\n onKeyDown,\n onClick,\n preventKeyAction = false,\n ...rest\n } = {},\n {suppressRefError = false} = {},\n ) => {\n setGetterPropCallInfo(\n 'getDropdownProps',\n suppressRefError,\n refKey,\n dropdownRef,\n )\n\n const dropdownHandleKeyDown = event => {\n const key = normalizeArrowKey(event)\n if (key && dropdownKeyDownHandlers[key]) {\n dropdownKeyDownHandlers[key](event)\n }\n }\n const dropdownHandleClick = () => {\n dispatch({\n type: stateChangeTypes.DropdownClick,\n })\n }\n\n return {\n [refKey]: handleRefs(ref, dropdownNode => {\n if (dropdownNode) {\n dropdownRef.current = dropdownNode\n }\n }),\n ...(!preventKeyAction && {\n onKeyDown: callAllEventHandlers(onKeyDown, dropdownHandleKeyDown),\n onClick: callAllEventHandlers(onClick, dropdownHandleClick),\n }),\n ...rest,\n }\n },\n [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo],\n )\n\n // returns\n const addSelectedItem = useCallback(\n selectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionAddSelectedItem,\n selectedItem,\n })\n },\n [dispatch],\n )\n const removeSelectedItem = useCallback(\n selectedItem => {\n dispatch({\n type: stateChangeTypes.FunctionRemoveSelectedItem,\n selectedItem,\n })\n },\n [dispatch],\n )\n const setSelectedItems = useCallback(\n newSelectedItems => {\n dispatch({\n type: stateChangeTypes.FunctionSetSelectedItems,\n selectedItems: newSelectedItems,\n })\n },\n [dispatch],\n )\n const setActiveIndex = useCallback(\n newActiveIndex => {\n dispatch({\n type: stateChangeTypes.FunctionSetActiveIndex,\n activeIndex: newActiveIndex,\n })\n },\n [dispatch],\n )\n const reset = useCallback(() => {\n dispatch({\n type: stateChangeTypes.FunctionReset,\n })\n }, [dispatch])\n\n return {\n getSelectedItemProps,\n getDropdownProps,\n addSelectedItem,\n removeSelectedItem,\n setSelectedItems,\n setActiveIndex,\n reset,\n selectedItems,\n activeIndex,\n }\n}\n\nexport default useMultipleSelection\n"],"names":["_objectWithoutPropertiesLoose","source","excluded","key","i","target","sourceKeys","Object","keys","length","indexOf","_extends","assign","bind","arguments","prototype","hasOwnProperty","call","apply","this","_assertThisInitialized","self","ReferenceError","_setPrototypeOf","o","p","setPrototypeOf","__proto__","b","Symbol","for","c","d","e","f","g","h","k","l","m","n","q","r","t","v","w","x","y","z","a","u","$$typeof","type","A","module","exports","require$$0","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","require$$2","nodeType","clientHeight","scrollHeight","clientWidth","scrollWidth","getComputedStyle","overflowY","overflowX","ownerDocument","defaultView","frameElement","idCounter","cbToCb","cb","noop","scrollIntoView","menuNode","actions","window","scrollMode","block","inline","boundary","skipOverflowHiddenElements","s","TypeError","document","scrollingElement","documentElement","parentElement","getRootNode","host","push","body","visualViewport","width","innerWidth","height","innerHeight","W","scrollX","pageXOffset","H","scrollY","pageYOffset","getBoundingClientRect","E","M","top","V","right","bottom","I","left","C","R","T","B","D","O","X","Y","L","S","j","N","parseInt","borderLeftWidth","borderTopWidth","borderRightWidth","F","borderBottomWidth","G","J","K","offsetWidth","P","offsetHeight","Q","U","Math","max","Z","scrollLeft","$","scrollTop","min","el","computeScrollIntoView","forEach","_ref","isOrContainsNode","parent","child","contains","debounce","fn","time","timeoutId","cancel","clearTimeout","wrapper","_len","args","Array","_key","setTimeout","callAllEventHandlers","_len2","fns","_key2","event","_len3","_key3","some","concat","preventDownshiftDefault","nativeEvent","handleRefs","_len4","refs","_key4","ref","current","generateId","String","getA11yStatusMessage","_ref2","isOpen","resultCount","previousResultCount","unwrapArray","arg","defaultValue","isArray","stateKeys","pickState","state","result","getState","reduce","prevState","isControlledProp","undefined","normalizeArrowKey","keyCode","getNextWrappingIndex","moveAmount","baseIndex","itemCount","getItemNodeFromIndex","circular","itemsLastIndex","newIndex","nonDisabledNewIndex","getNextNonDisabledIndex","currentElementNode","hasAttribute","index","targetWithinDownshift","downshiftElements","checkActiveElement","contextNode","activeElement","cleanupStatus","getStatusDiv","textContent","setStatus","status","documentProp","div","statusDiv","getElementById","createElement","setAttribute","style","border","clip","margin","overflow","padding","position","appendChild","Downshift","_Component","subClass","superClass","_this","id","menuId","labelId","inputId","getItemId","input","items","timeoutIds","internalSetTimeout","filter","setItemCount","count","unsetItemCount","setHighlightedIndex","highlightedIndex","otherStateToSet","defaultHighlightedIndex","internalSetState","clearSelection","selectedItem","inputValue","defaultIsOpen","selectItem","item","itemToString","selectItemAtIndex","itemIndex","selectHighlightedItem","stateToSet","isItemSelected","onChangeArg","onStateChangeArg","isStateToSetFunction","onInputValueChange","getStateAndHelpers","setState","newStateToSet","stateReducer","nextState","onStateChange","onSelect","onChange","onUserAction","rootRef","_rootNode","getRootProps","_temp","_temp2","_extends2","_ref$refKey","refKey","rest","_excluded","_ref2$suppressRefErro","suppressRefError","called","role","keyDownHandlers","ArrowDown","_this2","preventDefault","amount","shiftKey","moveHighlightedIndex","getItemCount","nextHighlightedIndex","ArrowUp","_this3","Enter","which","_this$getState2","itemNode","Escape","reset","buttonKeyDownHandlers","toggleMenu","inputKeyDownHandlers","Home","_this4","newHighlightedIndex","End","_this5","getToggleButtonProps","_temp3","_ref3","onClick","onPress","onKeyDown","onKeyUp","onBlur","_excluded2","enabledEventHandlers","buttonHandleClick","buttonHandleKeyDown","buttonHandleKeyUp","buttonHandleBlur","disabled","environment","focus","blurTarget","isMouseDown","getLabelProps","htmlFor","getInputProps","_temp4","_ref4","onInput","onChangeText","_excluded3","eventHandlers","_eventHandlers","_this$getState6","inputHandleChange","inputHandleKeyDown","inputHandleBlur","autoComplete","value","downshiftButtonIsActive","dataset","toggle","menuRef","_menuNode","getMenuProps","_temp5","_temp6","_extends3","_ref5","_ref5$refKey","_excluded4","_ref6$suppressRefErro","getItemProps","_temp7","_enabledEventHandlers","_ref7","onMouseMove","onMouseDown","_ref7$item","_excluded5","customClickHandler","avoidScrolling","clearItems","_ref8","_ref9","_this$getState7","openMenu","closeMenu","updateStatus","highlightedItem","setA11yStatus","_this$props","_this$props$initialHi","initialHighlightedIndex","_this$props$initialIs","initialIsOpen","_this$props$initialIn","initialInputValue","_this$props$initialSe","initialSelectedItem","create","constructor","_proto","internalClearTimeouts","stateToMerge","scrollHighlightedItemIntoView","_this6","_this$getState9","componentDidMount","_this7","onMouseUp","onOuterClick","onTouchStart","isTouchMove","onTouchMove","onTouchEnd","contextWithinDownshift","addEventListener","cleanup","removeEventListener","shouldScroll","prevProps","currentHighlightedIndex","prevHighlightedIndex","componentDidUpdate","selectedItemChanged","componentWillUnmount","render","children","isDOMElement","cloneElement","getElementProps","Component","defaultProps","prevItem","stateChangeTypes","Downshift$1","dropdownDefaultStateValues","callOnChangeProps","action","newState","changes","handler","capitalizeString","invokeOnChangeHandler","updateA11yStatus","getA11yMessage","getElementIds","toggleButtonId","uniqueId","getItemIndex","isAcceptedCharacterKey","test","slice","toUpperCase","useLatestRef","val","useRef","useEnhancedReducer","reducer","initialState","isStateEqual","prevStateRef","actionRef","enhancedReducer","useCallback","_useReducer","useReducer","dispatch","propsRef","dispatchWithProps","useEffect","useControlledReducer","_useEnhancedReducer","getA11ySelectionMessage","selectionParameters","itemToStringLocal","circularNavigation","getDefaultValue","propKey","defaultStateValues","defaultPropKey","getInitialValue","initialPropKey","getInitialState","getHighlightedIndexOnOpen","offset","useMouseAndTouchTracker","downshiftElementRefs","handleBlur","mouseAndTouchTrackersRef","map","useGetterPropsCalledChecker","propKeys","acc","isDropdownsStateEqual","getItemIndexByCharacterKey","keysSoFar","itemToStringParam","lowerCasedItemStrings","toLowerCase","lowerCasedKeysSoFar","isValid","itemString","startsWith","commonDefaultProps","MenuKeyDownArrowDown","MenuKeyDownArrowUp","MenuKeyDownEscape","MenuKeyDownHome","MenuKeyDownEnd","MenuKeyDownEnter","MenuKeyDownSpaceButton","MenuKeyDownCharacter","MenuBlur","MenuMouseLeave","ItemMouseMove","ItemClick","ToggleButtonClick","ToggleButtonKeyDownArrowDown","ToggleButtonKeyDownArrowUp","ToggleButtonKeyDownCharacter","FunctionToggleMenu","FunctionOpenMenu","FunctionCloseMenu","FunctionSetHighlightedIndex","FunctionSelectItem","FunctionSetInputValue","FunctionReset","downshiftSelectReducer","lowercasedKey","useSelect","userProps","_useControlledReducer","toggleButtonRef","itemRefs","shouldScrollRef","shouldBlurRef","clearTimeoutRef","elementIdsRef","previousResultCountRef","isInitialMountRef","prevPropsRef","latest","outerDispatch","setGetterPropCallInfo","toggleButtonKeyDownHandlers","useMemo","menuKeyDownHandlers","newSelectedItem","setInputValue","newInputValue","labelProps","onMouseLeave","latestState","tabIndex","_ref3$refKey","_ref4$suppressRefErro","toggleProps","toggleButtonNode","_extends4","_latest$current","latestProps","itemProps","InputKeyDownArrowDown","InputKeyDownArrowUp","InputKeyDownEscape","InputKeyDownHome","InputKeyDownEnd","InputKeyDownEnter","InputChange","InputBlur","ControlledPropUpdatedSelectedItem","defaultPropsCommon","downshiftUseComboboxReducer","useCombobox","getInitialStateCommon","defaultInputValue","previousSelectedItemRef","inputRef","comboboxRef","getElementIdsCommon","_extends5","_ref6","_ref6$refKey","_ref7$suppressRefErro","inputNode","getComboboxProps","_temp8","_extends6","_ref8$refKey","_ref9$suppressRefErro","comboboxNode","activeIndex","selectedItems","getInitialValueCommon","getDefaultValueCommon","isKeyDownOperationPermitted","metaKey","ctrlKey","altKey","HTMLInputElement","selectionStart","selectionEnd","getA11yRemovalMessage","removedSelectedItem","keyNavigationNext","keyNavigationPrevious","SelectedItemClick","SelectedItemKeyDownDelete","SelectedItemKeyDownBackspace","SelectedItemKeyDownNavigationNext","SelectedItemKeyDownNavigationPrevious","DropdownKeyDownNavigationPrevious","DropdownKeyDownBackspace","DropdownClick","FunctionAddSelectedItem","FunctionRemoveSelectedItem","FunctionSetSelectedItems","FunctionSetActiveIndex","downshiftMultipleSelectionReducer","newActiveIndex","selectedItemIndex","useMultipleSelection","dropdownRef","previousSelectedItemsRef","selectedItemRefs","find","activeSelectedItem","selectedItemKeyDownHandlers","Delete","Backspace","dropdownKeyDownHandlers","getSelectedItemProps","selectedItemNode","getDropdownProps","_ref4$refKey","_ref4$preventKeyActio","preventKeyAction","_ref5$suppressRefErro","dropdownNode","addSelectedItem","removeSelectedItem","setSelectedItems","newSelectedItems","setActiveIndex"],"mappings":"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"} \ No newline at end of file diff --git a/src/hooks/useSelect/index.js b/src/hooks/useSelect/index.js index 2d302dc8b..17e6be3ed 100644 --- a/src/hooks/useSelect/index.js +++ b/src/hooks/useSelect/index.js @@ -11,6 +11,7 @@ import { useMouseAndTouchTracker, useGetterPropsCalledChecker, useLatestRef, + isDropdownsStateEqual } from '../utils' import { callAllEventHandlers, @@ -56,6 +57,7 @@ function useSelect(userProps = {}) { downshiftSelectReducer, initialState, props, + isDropdownsStateEqual ) const {isOpen, highlightedIndex, selectedItem, inputValue} = state diff --git a/src/hooks/utils.js b/src/hooks/utils.js index 162f25509..984c4a841 100644 --- a/src/hooks/utils.js +++ b/src/hooks/utils.js @@ -144,9 +144,10 @@ export function useLatestRef(val) { * @param {Function} reducer Reducer function from downshift. * @param {Object} initialState Initial state of the hook. * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. * @returns {Array} An array with the state and an action dispatcher. */ -export function useEnhancedReducer(reducer, initialState, props) { +export function useEnhancedReducer(reducer, initialState, props, isStateEqual) { const prevStateRef = useRef() const actionRef = useRef() const enhancedReducer = useCallback( @@ -170,7 +171,12 @@ export function useEnhancedReducer(reducer, initialState, props) { const action = actionRef.current useEffect(() => { - if (action && prevStateRef.current && prevStateRef.current !== state) { + const shouldCallOnChangeProps = + action && + prevStateRef.current && + !isStateEqual(prevStateRef.current, state) + + if (shouldCallOnChangeProps) { callOnChangeProps( action, getState(prevStateRef.current, action.props), @@ -179,7 +185,7 @@ export function useEnhancedReducer(reducer, initialState, props) { } prevStateRef.current = state - }, [state, props, action]) + }, [state, action, isStateEqual]) return [state, dispatchWithProps] } @@ -191,10 +197,11 @@ export function useEnhancedReducer(reducer, initialState, props) { * @param {Function} reducer Reducer function from downshift. * @param {Object} initialState Initial state of the hook. * @param {Object} props The hook props. + * @param {Function} isStateEqual Function that checks if a previous state is equal to the next. * @returns {Array} An array with the state and an action dispatcher. */ -export function useControlledReducer(reducer, initialState, props) { - const [state, dispatch] = useEnhancedReducer(reducer, initialState, props) +export function useControlledReducer(reducer, initialState, props, isStateEqual) { + const [state, dispatch] = useEnhancedReducer(reducer, initialState, props, isStateEqual) return [getState(state, props), dispatch] } @@ -441,3 +448,20 @@ export function useGetterPropsCalledChecker(...propKeys) { return setGetterPropCallInfo } + +/** + * Check if a state is equal for dropdowns, by comparing isOpen, inputValue, highlightedIndex and selected item. + * Used by useSelect and useCombobox. + * + * @param {Object} prevState + * @param {Object} newState + * @returns {boolean} Wheather the states are deeply equal. + */ + export function isDropdownsStateEqual(prevState, newState) { + return ( + prevState.isOpen === newState.isOpen && + prevState.inputValue === newState.inputValue && + prevState.highlightedIndex === newState.highlightedIndex && + prevState.selectedItem === newState.selectedItem + ) +}