3511 |
stevensc |
1 |
import { useEffect, useState } from 'react';
|
|
|
2 |
|
|
|
3 |
import { useFetch } from './useFetch';
|
|
|
4 |
|
|
|
5 |
export function usePagination({ initialPage = 1, initialLimit = 10, apiUrl, initialParams = {} }) {
|
|
|
6 |
const [page, setPage] = useState(initialPage);
|
|
|
7 |
const [limit, setLimit] = useState(initialLimit);
|
|
|
8 |
|
|
|
9 |
// Creamos un nuevo objeto de parámetros que incluye la página y el límite
|
|
|
10 |
const currentParams = { ...initialParams, page, limit };
|
|
|
11 |
|
|
|
12 |
// Usamos nuestro useFetch hook
|
|
|
13 |
const { data, loading, error, refetch } = useFetch(apiUrl, { params: currentParams });
|
|
|
14 |
|
|
|
15 |
// Opcional: Estado para el total de elementos (si la API lo devuelve en la respuesta)
|
|
|
16 |
const [total, setTotal] = useState(0);
|
|
|
17 |
|
|
|
18 |
// Efecto para actualizar el total si los datos cambian (asumiendo que la API devuelve el total en la data o en headers)
|
|
|
19 |
// Esto dependerá de cómo tu API implemente la paginación y devuelva el total.
|
|
|
20 |
// Ejemplo asumiendo que 'totalCount' viene en los datos:
|
|
|
21 |
useEffect(() => {
|
|
|
22 |
if (data) {
|
|
|
23 |
setPage(data.current.page);
|
|
|
24 |
setTotal(data.total.count);
|
|
|
25 |
}
|
|
|
26 |
}, [data]);
|
|
|
27 |
|
|
|
28 |
const nextPage = () => {
|
|
|
29 |
setPage((prevPage) => prevPage + 1);
|
|
|
30 |
};
|
|
|
31 |
|
|
|
32 |
const prevPage = () => {
|
|
|
33 |
setPage((prevPage) => Math.max(1, prevPage - 1));
|
|
|
34 |
};
|
|
|
35 |
|
|
|
36 |
const goToPage = (newPage) => {
|
|
|
37 |
setPage(newPage);
|
|
|
38 |
};
|
|
|
39 |
|
|
|
40 |
const setPageLimit = (newLimit) => {
|
|
|
41 |
setLimit(newLimit);
|
|
|
42 |
setPage(1); // Resetear a la primera página al cambiar el límite
|
|
|
43 |
};
|
|
|
44 |
|
|
|
45 |
// No necesitamos una función de "fetch" explícita aquí,
|
|
|
46 |
// useFetch se encarga de hacer la petición cuando apiUrl o currentParams cambian.
|
|
|
47 |
|
|
|
48 |
return {
|
|
|
49 |
page,
|
|
|
50 |
limit,
|
|
|
51 |
data,
|
|
|
52 |
loading,
|
|
|
53 |
error,
|
|
|
54 |
total, // Opcional
|
|
|
55 |
nextPage,
|
|
|
56 |
prevPage,
|
|
|
57 |
goToPage,
|
|
|
58 |
setPageLimit,
|
|
|
59 |
refetch // Exponemos la función refetch de useFetch por si el componente la necesita
|
|
|
60 |
};
|
|
|
61 |
}
|