UNPKG

@braineet/ui

Version:

Braineet design system

75 lines 2.86 kB
var _excluded = ["filter"], _excluded2 = ["initialQuery"]; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } import React from 'react'; import Fuse from 'fuse.js/dist/fuse.min'; import isEqual from 'lodash/isEqual'; var searchBy = function searchBy(array, searchValue, fields, options) { if (array === void 0) { array = []; } var filter = options.filter, fuseOptions = _objectWithoutPropertiesLoose(options, _excluded); if (typeof searchValue === 'undefined' || (searchValue == null ? void 0 : searchValue.length) === 0) { if (filter) return array.filter(filter); return array; } var fuseConfig = _extends({ includeScore: true, shouldSort: true, includeMatches: true, ignoreLocation: true, threshold: 0.4 }, fuseOptions); if ((fields == null ? void 0 : fields.length) > 0) { fuseConfig.keys = fields; } var fuse = new Fuse(array, fuseConfig); var result = fuse.search(searchValue).map(function (res) { return res.item; }); if (filter) return result.filter(filter); return result; }; var usePrevious = function usePrevious(value) { var ref = React.useRef(); React.useEffect(function () { ref.current = value; }, [value]); return ref.current; }; export var useSearch = function useSearch(collection, predicate, options) { if (collection === void 0) { collection = []; } if (options === void 0) { options = { initialQuery: '' }; } var _options = options, initialQuery = _options.initialQuery, searchConfig = _objectWithoutPropertiesLoose(_options, _excluded2); var _React$useState = React.useState(initialQuery), value = _React$useState[0], setValue = _React$useState[1]; var prevCollection = usePrevious(collection); var prevPredicate = usePrevious(predicate); var prevValue = usePrevious(value); var _React$useState2 = React.useState(function () { return searchBy(collection, value, predicate, searchConfig); }), filteredCollection = _React$useState2[0], setFilteredCollection = _React$useState2[1]; React.useEffect(function () { if (!isEqual(collection, prevCollection) || !isEqual(predicate, prevPredicate) || !isEqual(value, prevValue)) { setFilteredCollection(searchBy(collection, value, predicate, searchConfig)); } }, [collection, predicate, value, searchConfig]); return { items: filteredCollection, value: value, setValue: setValue }; };