UNPKG

use-searchable-list

Version:

A hook to filter an array/list of objects.

96 lines (94 loc) 3.21 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { default: () => src_default }); module.exports = __toCommonJS(src_exports); var import_react = require("react"); var defaults = { clearOnEmpty: false, firstLetterCheck: true, debounce: true, delay: 300 }; var useSearchableList = (property, props = defaults) => { const { clearOnEmpty, firstLetterCheck, debounce, delay } = (0, import_react.useMemo)( () => ({ ...defaults, ...props }), [props] ); if (!isPrimitive(property)) { throw new Error("Invalid property used to filter. Only primitive types are allowed."); } const [origin, setOrigin] = (0, import_react.useState)([]); const [state, setState] = (0, import_react.useState)([]); const [searchTerm, setSearchTerm] = (0, import_react.useState)(""); const [initialized, setInitialized] = (0, import_react.useState)(false); const setValue = (value) => { setOrigin(value); setState(value); }; const filter = (value) => { setSearchTerm(value.toString()); }; (0, import_react.useEffect)(() => { if (initialized) { if (debounce) { const delayTimeout = setTimeout(() => { applyFilter(); }, delay); return () => clearTimeout(delayTimeout); } else { applyFilter(); } } else { setState(origin); setInitialized(true); } }, [searchTerm]); const applyFilter = () => { if (searchTerm === "" || searchTerm === void 0) { reset(); } else if (searchTerm.length === 1 && firstLetterCheck) { const filteredList = origin.filter((element) => { const propertyValue = element[property]; return isPrimitive(propertyValue) && propertyValue.toString().toLowerCase().startsWith(searchTerm.toLowerCase()); }); setState(filteredList); } else { const filteredList = origin.filter((element) => { const propertyValue = element[property]; return isPrimitive(propertyValue) && propertyValue.toString().toLowerCase().includes(searchTerm.toLowerCase()); }); setState(filteredList); } }; const reset = () => { if (clearOnEmpty) { setState([]); } else { setState(origin); } }; return [state, setValue, filter]; }; var isPrimitive = (value) => { return typeof value === "string" || typeof value === "number" || typeof value === "boolean"; }; var src_default = useSearchableList;