UNPKG

react-select-search-nextjs

Version:

Lightweight select component for React with support for NextJS

165 lines (157 loc) 4.56 kB
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); } import { forwardRef, memo } from 'react'; import PropTypes from 'prop-types'; import useSelect from './useSelect'; import { optionType, valueType } from './types'; import Options from './Components/Options'; import useClassName from './useClassName'; import classes from './lib/classes'; import { jsx as _jsx } from "react/jsx-runtime"; import { jsxs as _jsxs } from "react/jsx-runtime"; const SelectSearch = /*#__PURE__*/forwardRef(({ value: defaultValue, disabled, placeholder, multiple, search, autoFocus, autoComplete, options: defaultOptions, id, onChange, onFocus, onBlur, printOptions, closeOnSelect, className, renderValue, renderOption, renderGroupHeader, getOptions, filterOptions, debounce, emptyMessage }, ref) => { const cls = useClassName(className); const [snapshot, valueProps, optionProps] = useSelect({ options: defaultOptions, value: defaultValue === null && (placeholder || multiple) ? '' : defaultValue, multiple, disabled, search, onChange, onFocus, onBlur, closeOnSelect: closeOnSelect && (!multiple || ['on-focus', 'always'].includes(printOptions)), getOptions, filterOptions, debounce }); const wrapperClass = classes({ [cls('container')]: true, [cls('is-disabled')]: disabled, [cls('is-loading')]: snapshot.fetching, [cls('has-focus')]: snapshot.focus }); let shouldRenderOptions; switch (printOptions) { case 'never': shouldRenderOptions = false; break; case 'always': shouldRenderOptions = true; break; case 'on-focus': shouldRenderOptions = snapshot.focus; break; default: shouldRenderOptions = !disabled && (snapshot.focus || multiple); break; } const shouldRenderValue = !multiple || placeholder || search; const props = _extends({}, valueProps, { placeholder, autoFocus, autoComplete, value: snapshot.focus && search ? snapshot.search : snapshot.displayValue }); return /*#__PURE__*/_jsxs("div", { ref: ref, className: wrapperClass, id: id, children: [shouldRenderValue && /*#__PURE__*/_jsxs("div", { className: cls('value'), children: [renderValue && renderValue(props, snapshot, cls('input')), !renderValue && /*#__PURE__*/_jsx("input", _extends({}, props, { className: cls('input') }))] }), shouldRenderOptions && /*#__PURE__*/_jsx(Options, { options: snapshot.options, optionProps: optionProps, snapshot: snapshot, cls: cls, emptyMessage: emptyMessage, renderOption: renderOption, renderGroupHeader: renderGroupHeader })] }); }); SelectSearch.defaultProps = { // Data getOptions: null, filterOptions: null, value: null, // Interaction multiple: false, search: false, disabled: false, printOptions: 'auto', closeOnSelect: true, debounce: 0, // Attributes placeholder: null, id: null, autoFocus: false, autoComplete: 'on', // Design className: 'select-search', // Renderers renderOption: undefined, renderGroupHeader: undefined, renderValue: undefined, emptyMessage: null, // Events onChange: () => {}, onFocus: () => {}, onBlur: () => {} }; SelectSearch.propTypes = process.env.NODE_ENV !== "production" ? { // Data options: PropTypes.arrayOf(optionType).isRequired, getOptions: PropTypes.func, filterOptions: PropTypes.func, value: valueType, // Interaction multiple: PropTypes.bool, search: PropTypes.bool, disabled: PropTypes.bool, printOptions: PropTypes.oneOf(['auto', 'always', 'never', 'on-focus']), closeOnSelect: PropTypes.bool, debounce: PropTypes.number, // Attributes placeholder: PropTypes.string, id: PropTypes.string, autoComplete: PropTypes.string, autoFocus: PropTypes.bool, // Design className: PropTypes.oneOfType([PropTypes.string, PropTypes.func]), // Renderers renderOption: PropTypes.func, renderGroupHeader: PropTypes.func, renderValue: PropTypes.func, emptyMessage: PropTypes.oneOfType([PropTypes.string, PropTypes.func]), // Events onChange: PropTypes.func, onFocus: PropTypes.func, onBlur: PropTypes.func } : {}; export default /*#__PURE__*/memo(SelectSearch);