Skip to content

C. usePagination

hook/usePagination
import { ChangeEvent, useEffect, useState } from "react";

interface PaginationParams {
  page: number;
  pageSize: number;
}

export const usePagination = <T extends PaginationParams>(defaultParams: T) => {
  let [params, setParams] = useState<T>(defaultParams);
  let [keyword, setKeyword] = useState("");
  let [filterParams, setFilterParams] = useState<T>(defaultParams);
  const handleKeyword = (keyword: string) => {
    setFilterParams(() => {
      return { ...params, keyword: keyword, page: 1 };
    });
    setParams(() => {
      return { ...params, keyword: keyword, page: 1 };
    });
  };

  const handleFilter = () => {
    setFilterParams(() => {
      return {
        ...params,
        page: 1,
      };
    });
    setParams((prevParams) => {
      return {
        ...prevParams,
        page: 1,
      };
    });
  };

  const handleSearch = (e: ChangeEvent<any>) => {
    setKeyword(e.target.value);
  };
  useEffect(() => {
    const interval = setTimeout(() => {
      handleKeyword(keyword);
    }, 500);

    return () => clearTimeout(interval);
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [keyword]);

  const handleClear = () => {
    setFilterParams(defaultParams);
    setParams(defaultParams);
  };

  const handlePageSize = (e: ChangeEvent<any>) => {
    setParams((params) => ({ ...params, pageSize: e.target.value, page: 1 }));
    setFilterParams((params) => ({
      ...params,
      pageSize: e.target.value,
      page: 1,
    }));
  };

  const handlePage = (page: number) => {
    setParams((params) => ({ ...params, page: page }));
    setFilterParams((params) => ({ ...params, page: page }));
  };

  return {
    params,
    setParams,
    handleFilter,
    handleClear,
    handlePageSize,
    handlePage,
    filterParams,
    handleSearch
  };
};