UNPKG

938 BJavaScriptView Raw
1import { dataText } from './Accessors';
2import { useMemo } from 'react';
3export const presets = {
4 eq: (a, b) => a === b,
5 contains: (a, b) => a.indexOf(b) !== -1,
6 startsWith: (a, b) => a.lastIndexOf(b, 0) === 0
7};
8
9function normalizeFilter(filter, textField) {
10 if (filter === false) return null;
11 if (typeof filter === 'function') return filter;
12 const filterPreset = presets[filter === true ? 'startsWith' : filter || 'eq'];
13 return (item, searchTerm) => {
14 let textValue = dataText(item, textField);
15 return filterPreset(textValue.toLowerCase(), searchTerm.toLowerCase());
16 };
17}
18
19export function useFilteredData(data, filterer, searchTerm = '', textAccessor) {
20 return useMemo(() => {
21 const filter = normalizeFilter(filterer, textAccessor);
22 if (!filter || !searchTerm.trim()) return data;
23 return data.filter((item, idx) => filter(item, searchTerm, idx));
24 }, [data, filterer, searchTerm, textAccessor]);
25}
\No newline at end of file