@anb98/react-hooks
Version:
Custom hooks for react
55 lines • 2.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var React = require("react");
/**
* This hook filters results when searching.
* @param props Initial options
* @example
* ```
const { setSourceData, setSearchValue, filtered, sourceData }
= useSearch({ allowFields: [], denyFields: [] sourceData: [] });
* ```
* @see https://www.npmjs.com/package/@anb98/react-hooks#useSearch
*/
var useSearch = function (props) {
if (props === void 0) { props = {}; }
var _a = props.allowFields, allowFields = _a === void 0 ? [] : _a, _b = props.denyFields, denyFields = _b === void 0 ? [] : _b;
var _c = React.useState(''), searchValue = _c[0], setSearchValue = _c[1];
var _d = React.useState([]), filtered = _d[0], setFiltered = _d[1];
var _e = React.useState([]), sourceData = _e[0], setSourceData = _e[1];
var filter = function () {
var searchValues = searchValue.toLowerCase().trim().split(' ');
var filteredData = sourceData.filter(function (item) {
var _loop_1 = function (prop) {
if (Object.prototype.hasOwnProperty.call(item, prop)) {
if (denyFields.includes(prop)
|| (allowFields.length && !allowFields.includes(prop))) {
return "continue";
}
var value_1 = String(item[prop]).toLocaleLowerCase();
var coincidences = searchValues.reduce(function (acc, search) { return (value_1.includes(search) ? acc + 1 : acc); }, 0);
if (coincidences >= searchValues.length)
return { value: true };
}
};
// eslint-disable-next-line no-restricted-syntax
for (var prop in item) {
var state_1 = _loop_1(prop);
if (typeof state_1 === "object")
return state_1.value;
}
return false;
});
setFiltered(filteredData);
};
React.useEffect(function () { setSourceData(props.sourceData || []); }, [props.sourceData]);
React.useEffect(function () { filter(); }, [searchValue, sourceData]);
return {
filtered: filtered,
setSearchValue: setSearchValue,
setSourceData: setSourceData,
sourceData: sourceData,
};
};
exports.default = useSearch;
//# sourceMappingURL=useSearch.js.map