@mcabreradev/filter
Version:
A powerful, SQL-like array filtering library for TypeScript and JavaScript with advanced pattern matching, MongoDB-style operators, deep object comparison, and zero dependencies
28 lines (27 loc) • 1.1 kB
JavaScript
import { useState, useEffect, useRef } from 'react';
import { DEFAULT_DEBOUNCE_DELAY } from './react.constants';
import { debounce } from '../shared';
import { useFilterCore, useIsFiltering } from './react.utils';
export function useDebouncedFilter(data, expression, options) {
const { delay = DEFAULT_DEBOUNCE_DELAY, ...filterOptions } = options || {};
const [debouncedExpr, setDebouncedExpr] = useState(expression);
const [isPending, setIsPending] = useState(false);
const debouncedSet = useRef(null);
useEffect(() => {
const fn = debounce((e) => {
setDebouncedExpr(e);
setIsPending(false);
}, delay);
debouncedSet.current = fn;
return () => fn.cancel();
}, [delay]);
useEffect(() => {
if (!debouncedSet.current)
return;
setIsPending(true);
debouncedSet.current(expression);
}, [expression]);
const filtered = useFilterCore(data, debouncedExpr, filterOptions);
const isFiltering = useIsFiltering(filtered, data);
return { filtered, isFiltering, isPending };
}