import { HookParams } from '../types'; export function highlightSearch(value: string, searchQuery: string): string { const reg = new RegExp( searchQuery.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'), 'i' ); return value.replace( reg, str => `${str}` ); } export function filterFn>({ data = [], filters = {}, search = { query: '', fields: [], }, }: HookParams) { let result = Object.assign(data); if (search && search.query && search.query.trim()) { const queryLowerCase = search.query.toLowerCase(); if (search.enableHighlighting) { result = data.reduce((acc: Item[], item: Item) => { let hasSearchTerm = false; const itemToReturn = Object.assign({}, item); search.fields.forEach((field: string) => { const fieldVal = (item[field] as string).toString().toLowerCase(); if (fieldVal.includes(queryLowerCase)) { hasSearchTerm = true; // @ts-ignore itemToReturn[field] = highlightSearch(fieldVal, queryLowerCase); } }); if (hasSearchTerm) { return acc.concat(itemToReturn); } return acc; }, []); } else { result = data.filter((item: Item) => search.fields.some((field: string) => { const fieldLowerCase = (item[field] as string).toLowerCase(); return fieldLowerCase.includes(queryLowerCase); }) ); } } if (filters && Object.keys(filters).length) { Object.keys(filters).forEach((field: string) => { if (filters[field] && filters[field].length) { result = result.filter((item: Item) => filters[field].includes(item[field] as string) ); } }); } return result; }