react-select
Version:
A Select control built with and for ReactJS
204 lines (168 loc) • 6.88 kB
JavaScript
import React, { Component } from 'react';
import 'memoize-one';
import '@emotion/core';
import 'react-dom';
import 'prop-types';
import { k as handleInputChange } from '../../dist/utils-06b0d5a4.browser.esm.js';
import '../../dist/index-4322c0ed.browser.esm.js';
import { S as Select } from '../../dist/Select-9fdb8cd0.browser.esm.js';
import '@emotion/css';
import 'react-input-autosize';
import { m as manageState } from '../../dist/stateManager-04f734a2.browser.esm.js';
function _extends() { _extends = Object.assign || 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 _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 _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var defaultProps = {
cacheOptions: false,
defaultOptions: false,
filterOption: null,
isLoading: false
};
var makeAsyncSelect = function makeAsyncSelect(SelectComponent) {
var _class, _temp;
return _temp = _class =
/*#__PURE__*/
function (_Component) {
_inheritsLoose(Async, _Component);
function Async(props) {
var _this;
_this = _Component.call(this) || this;
_this.select = void 0;
_this.lastRequest = void 0;
_this.mounted = false;
_this.optionsCache = {};
_this.handleInputChange = function (newValue, actionMeta) {
var _this$props = _this.props,
cacheOptions = _this$props.cacheOptions,
onInputChange = _this$props.onInputChange; // TODO
var inputValue = handleInputChange(newValue, actionMeta, onInputChange);
if (!inputValue) {
delete _this.lastRequest;
_this.setState({
inputValue: '',
loadedInputValue: '',
loadedOptions: [],
isLoading: false,
passEmptyOptions: false
});
return;
}
if (cacheOptions && _this.optionsCache[inputValue]) {
_this.setState({
inputValue: inputValue,
loadedInputValue: inputValue,
loadedOptions: _this.optionsCache[inputValue],
isLoading: false,
passEmptyOptions: false
});
} else {
var request = _this.lastRequest = {};
_this.setState({
inputValue: inputValue,
isLoading: true,
passEmptyOptions: !_this.state.loadedInputValue
}, function () {
_this.loadOptions(inputValue, function (options) {
if (!_this.mounted) return;
if (options) {
_this.optionsCache[inputValue] = options;
}
if (request !== _this.lastRequest) return;
delete _this.lastRequest;
_this.setState({
isLoading: false,
loadedInputValue: inputValue,
loadedOptions: options || [],
passEmptyOptions: false
});
});
});
}
return inputValue;
};
_this.state = {
defaultOptions: Array.isArray(props.defaultOptions) ? props.defaultOptions : undefined,
inputValue: typeof props.inputValue !== 'undefined' ? props.inputValue : '',
isLoading: props.defaultOptions === true,
loadedOptions: [],
passEmptyOptions: false
};
return _this;
}
var _proto = Async.prototype;
_proto.componentDidMount = function componentDidMount() {
var _this2 = this;
this.mounted = true;
var defaultOptions = this.props.defaultOptions;
var inputValue = this.state.inputValue;
if (defaultOptions === true) {
this.loadOptions(inputValue, function (options) {
if (!_this2.mounted) return;
var isLoading = !!_this2.lastRequest;
_this2.setState({
defaultOptions: options || [],
isLoading: isLoading
});
});
}
};
_proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(nextProps) {
// if the cacheOptions prop changes, clear the cache
if (nextProps.cacheOptions !== this.props.cacheOptions) {
this.optionsCache = {};
}
if (nextProps.defaultOptions !== this.props.defaultOptions) {
this.setState({
defaultOptions: Array.isArray(nextProps.defaultOptions) ? nextProps.defaultOptions : undefined
});
}
};
_proto.componentWillUnmount = function componentWillUnmount() {
this.mounted = false;
};
_proto.focus = function focus() {
this.select.focus();
};
_proto.blur = function blur() {
this.select.blur();
};
_proto.loadOptions = function loadOptions(inputValue, callback) {
var loadOptions = this.props.loadOptions;
if (!loadOptions) return callback();
var loader = loadOptions(inputValue, callback);
if (loader && typeof loader.then === 'function') {
loader.then(callback, function () {
return callback();
});
}
};
_proto.render = function render() {
var _this3 = this;
var _this$props2 = this.props,
loadOptions = _this$props2.loadOptions,
isLoadingProp = _this$props2.isLoading,
props = _objectWithoutPropertiesLoose(_this$props2, ["loadOptions", "isLoading"]);
var _this$state = this.state,
defaultOptions = _this$state.defaultOptions,
inputValue = _this$state.inputValue,
isLoading = _this$state.isLoading,
loadedInputValue = _this$state.loadedInputValue,
loadedOptions = _this$state.loadedOptions,
passEmptyOptions = _this$state.passEmptyOptions;
var options = passEmptyOptions ? [] : inputValue && loadedInputValue ? loadedOptions : defaultOptions || [];
return React.createElement(SelectComponent, _extends({}, props, {
ref: function ref(_ref) {
_this3.select = _ref;
},
options: options,
isLoading: isLoading || isLoadingProp,
onInputChange: this.handleInputChange
}));
};
return Async;
}(Component), _class.defaultProps = defaultProps, _temp;
};
var SelectState = manageState(Select);
var Async = makeAsyncSelect(SelectState);
export default Async;
export { defaultProps, makeAsyncSelect };