import { hooks } from '@repo/crud';
import { useState } from 'react';
function usePagination(resource, perPage = 10) {
const [page, setPage] = useState(1);
const { data, total, loading, error } = hooks.useGetList(resource, {
pagination: { page, perPage }
});
const totalPages = Math.ceil(total / perPage);
const hasNextPage = page < totalPages;
const hasPrevPage = page > 1;
const nextPage = () => {
if (hasNextPage) {
setPage(prev => prev + 1);
}
};
const prevPage = () => {
if (hasPrevPage) {
setPage(prev => prev - 1);
}
};
const goToPage = (pageNumber) => {
if (pageNumber >= 1 && pageNumber <= totalPages) {
setPage(pageNumber);
}
};
return {
data,
total,
loading,
error,
page,
perPage,
totalPages,
hasNextPage,
hasPrevPage,
nextPage,
prevPage,
goToPage
};
}
// Usage
function PaginatedUserList() {
const {
data,
loading,
error,
page,
totalPages,
hasNextPage,
hasPrevPage,
nextPage,
prevPage,
goToPage
} = usePagination('users', 5);
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<div>
<ul>
{data.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
<div>
<button onClick={prevPage} disabled={!hasPrevPage}>
Previous
</button>
<span>
Page {page} of {totalPages}
</span>
<button onClick={nextPage} disabled={!hasNextPage}>
Next
</button>
</div>
</div>
);
}