@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
22 lines (21 loc) • 1.57 kB
JavaScript
import { useState, useMemo, useCallback } from 'react';
import { DEFAULT_PAGE_SIZE, DEFAULT_INITIAL_PAGE } from './react.constants';
import { getPageData, createPaginationResult, validatePageNumber, validatePageSize, } from '../shared';
import { useFilterCore, useIsFiltering } from './react.utils';
export function usePaginatedFilter(data, expression, initialPageSize = DEFAULT_PAGE_SIZE, options) {
const [pg, setPg] = useState(DEFAULT_INITIAL_PAGE);
const [sz, setSz] = useState(validatePageSize(initialPageSize));
const filtered = useFilterCore(data, expression, options);
const isFiltering = useIsFiltering(filtered, data);
const pgState = useMemo(() => ({ currentPage: pg, pageSize: sz, totalItems: filtered.length }), [pg, sz, filtered.length]);
const pgData = useMemo(() => getPageData(filtered, pg, sz), [filtered, pg, sz]);
const pgResult = useMemo(() => createPaginationResult(pgData, filtered, pgState), [pgData, filtered, pgState]);
const nextPage = useCallback(() => setPg((p) => validatePageNumber(p + 1, pgResult.totalPages)), [pgResult.totalPages]);
const previousPage = useCallback(() => setPg((p) => validatePageNumber(p - 1, pgResult.totalPages)), [pgResult.totalPages]);
const goToPage = useCallback((p) => setPg(validatePageNumber(p, pgResult.totalPages)), [pgResult.totalPages]);
const setPageSize = useCallback((s) => {
setSz(validatePageSize(s));
setPg(DEFAULT_INITIAL_PAGE);
}, []);
return { ...pgResult, filtered, isFiltering, nextPage, previousPage, goToPage, setPageSize };
}