UNPKG

@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
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 }; }