shoc-frontend-new/src/hooks/usePaginatedList.js

33 lines
1.1 KiB
JavaScript
Raw Normal View History

2026-01-11 17:35:46 -06:00
import { useCallback, useEffect, useMemo, useState } from "react";
export default function usePaginatedList(fetchFn, extraParams = {}) {
2026-01-11 17:35:46 -06:00
const [rows, setRows] = useState([]);
const [search, setSearch] = useState("");
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(12);
const [totalCount, setTotalCount] = useState(0);
const [loading, setLoading] = useState(true);
const [err, setErr] = useState("");
const extraKey = JSON.stringify(extraParams);
2026-01-11 17:35:46 -06:00
const reload = useCallback(() => {
setLoading(true);
setErr("");
fetchFn({ search, page, pageSize, ...extraParams })
2026-01-11 17:35:46 -06:00
.then(({ rows, totalCount }) => {
setRows(rows);
setTotalCount(totalCount);
})
.catch((e) => setErr(e.message || "Failed to load"))
.finally(() => setLoading(false));
}, [fetchFn, search, page, pageSize, extraKey]);
2026-01-11 17:35:46 -06:00
useEffect(() => { reload(); }, [reload]);
return useMemo(() => ({
rows, search, setSearch, page, setPage, pageSize, setPageSize,
totalCount, loading, err, reload
}), [rows, search, page, pageSize, totalCount, loading, err, reload]);
}