You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
5.8 KiB
142 lines
5.8 KiB
3 years ago
|
'use strict';
|
||
|
|
||
|
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
||
|
var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
|
||
|
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
||
|
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
|
||
|
var React = require('react');
|
||
|
var index = require('./index-5b950e59.cjs.dev.js');
|
||
|
|
||
|
var _excluded = ["defaultOptions", "cacheOptions", "loadOptions", "options", "isLoading", "onInputChange", "filterOption"];
|
||
|
function useAsync(_ref) {
|
||
|
var _ref$defaultOptions = _ref.defaultOptions,
|
||
|
propsDefaultOptions = _ref$defaultOptions === void 0 ? false : _ref$defaultOptions,
|
||
|
_ref$cacheOptions = _ref.cacheOptions,
|
||
|
cacheOptions = _ref$cacheOptions === void 0 ? false : _ref$cacheOptions,
|
||
|
propsLoadOptions = _ref.loadOptions;
|
||
|
_ref.options;
|
||
|
var _ref$isLoading = _ref.isLoading,
|
||
|
propsIsLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
|
||
|
propsOnInputChange = _ref.onInputChange,
|
||
|
_ref$filterOption = _ref.filterOption,
|
||
|
filterOption = _ref$filterOption === void 0 ? null : _ref$filterOption,
|
||
|
restSelectProps = _objectWithoutProperties(_ref, _excluded);
|
||
|
var propsInputValue = restSelectProps.inputValue;
|
||
|
var lastRequest = React.useRef(undefined);
|
||
|
var mounted = React.useRef(false);
|
||
|
var _useState = React.useState(Array.isArray(propsDefaultOptions) ? propsDefaultOptions : undefined),
|
||
|
_useState2 = _slicedToArray(_useState, 2),
|
||
|
defaultOptions = _useState2[0],
|
||
|
setDefaultOptions = _useState2[1];
|
||
|
var _useState3 = React.useState(typeof propsInputValue !== 'undefined' ? propsInputValue : ''),
|
||
|
_useState4 = _slicedToArray(_useState3, 2),
|
||
|
stateInputValue = _useState4[0],
|
||
|
setStateInputValue = _useState4[1];
|
||
|
var _useState5 = React.useState(propsDefaultOptions === true),
|
||
|
_useState6 = _slicedToArray(_useState5, 2),
|
||
|
isLoading = _useState6[0],
|
||
|
setIsLoading = _useState6[1];
|
||
|
var _useState7 = React.useState(undefined),
|
||
|
_useState8 = _slicedToArray(_useState7, 2),
|
||
|
loadedInputValue = _useState8[0],
|
||
|
setLoadedInputValue = _useState8[1];
|
||
|
var _useState9 = React.useState([]),
|
||
|
_useState10 = _slicedToArray(_useState9, 2),
|
||
|
loadedOptions = _useState10[0],
|
||
|
setLoadedOptions = _useState10[1];
|
||
|
var _useState11 = React.useState(false),
|
||
|
_useState12 = _slicedToArray(_useState11, 2),
|
||
|
passEmptyOptions = _useState12[0],
|
||
|
setPassEmptyOptions = _useState12[1];
|
||
|
var _useState13 = React.useState({}),
|
||
|
_useState14 = _slicedToArray(_useState13, 2),
|
||
|
optionsCache = _useState14[0],
|
||
|
setOptionsCache = _useState14[1];
|
||
|
var _useState15 = React.useState(undefined),
|
||
|
_useState16 = _slicedToArray(_useState15, 2),
|
||
|
prevDefaultOptions = _useState16[0],
|
||
|
setPrevDefaultOptions = _useState16[1];
|
||
|
var _useState17 = React.useState(undefined),
|
||
|
_useState18 = _slicedToArray(_useState17, 2),
|
||
|
prevCacheOptions = _useState18[0],
|
||
|
setPrevCacheOptions = _useState18[1];
|
||
|
if (cacheOptions !== prevCacheOptions) {
|
||
|
setOptionsCache({});
|
||
|
setPrevCacheOptions(cacheOptions);
|
||
|
}
|
||
|
if (propsDefaultOptions !== prevDefaultOptions) {
|
||
|
setDefaultOptions(Array.isArray(propsDefaultOptions) ? propsDefaultOptions : undefined);
|
||
|
setPrevDefaultOptions(propsDefaultOptions);
|
||
|
}
|
||
|
React.useEffect(function () {
|
||
|
mounted.current = true;
|
||
|
return function () {
|
||
|
mounted.current = false;
|
||
|
};
|
||
|
}, []);
|
||
|
var loadOptions = React.useCallback(function (inputValue, callback) {
|
||
|
if (!propsLoadOptions) return callback();
|
||
|
var loader = propsLoadOptions(inputValue, callback);
|
||
|
if (loader && typeof loader.then === 'function') {
|
||
|
loader.then(callback, function () {
|
||
|
return callback();
|
||
|
});
|
||
|
}
|
||
|
}, [propsLoadOptions]);
|
||
|
React.useEffect(function () {
|
||
|
if (propsDefaultOptions === true) {
|
||
|
loadOptions(stateInputValue, function (options) {
|
||
|
if (!mounted.current) return;
|
||
|
setDefaultOptions(options || []);
|
||
|
setIsLoading(!!lastRequest.current);
|
||
|
});
|
||
|
}
|
||
|
// NOTE: this effect is designed to only run when the component mounts,
|
||
|
// so we don't want to include any hook dependencies
|
||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||
|
}, []);
|
||
|
var onInputChange = React.useCallback(function (newValue, actionMeta) {
|
||
|
var inputValue = index.handleInputChange(newValue, actionMeta, propsOnInputChange);
|
||
|
if (!inputValue) {
|
||
|
lastRequest.current = undefined;
|
||
|
setStateInputValue('');
|
||
|
setLoadedInputValue('');
|
||
|
setLoadedOptions([]);
|
||
|
setIsLoading(false);
|
||
|
setPassEmptyOptions(false);
|
||
|
return;
|
||
|
}
|
||
|
if (cacheOptions && optionsCache[inputValue]) {
|
||
|
setStateInputValue(inputValue);
|
||
|
setLoadedInputValue(inputValue);
|
||
|
setLoadedOptions(optionsCache[inputValue]);
|
||
|
setIsLoading(false);
|
||
|
setPassEmptyOptions(false);
|
||
|
} else {
|
||
|
var request = lastRequest.current = {};
|
||
|
setStateInputValue(inputValue);
|
||
|
setIsLoading(true);
|
||
|
setPassEmptyOptions(!loadedInputValue);
|
||
|
loadOptions(inputValue, function (options) {
|
||
|
if (!mounted) return;
|
||
|
if (request !== lastRequest.current) return;
|
||
|
lastRequest.current = undefined;
|
||
|
setIsLoading(false);
|
||
|
setLoadedInputValue(inputValue);
|
||
|
setLoadedOptions(options || []);
|
||
|
setPassEmptyOptions(false);
|
||
|
setOptionsCache(options ? _objectSpread(_objectSpread({}, optionsCache), {}, _defineProperty({}, inputValue, options)) : optionsCache);
|
||
|
});
|
||
|
}
|
||
|
}, [cacheOptions, loadOptions, loadedInputValue, optionsCache, propsOnInputChange]);
|
||
|
var options = passEmptyOptions ? [] : stateInputValue && loadedInputValue ? loadedOptions : defaultOptions || [];
|
||
|
return _objectSpread(_objectSpread({}, restSelectProps), {}, {
|
||
|
options: options,
|
||
|
isLoading: isLoading || propsIsLoading,
|
||
|
onInputChange: onInputChange,
|
||
|
filterOption: filterOption
|
||
|
});
|
||
|
}
|
||
|
|
||
|
exports.useAsync = useAsync;
|