export function usePagination(initialState: Partial<PaginationState> = {}): UsePaginationReturn {
const [state, setState] = useState<PaginationState>({
currentPage: initialState.currentPage || 1,
totalPages: initialState.totalPages || 1,
totalItems: initialState.totalItems || 0,
itemsPerPage: initialState.itemsPerPage || 20
});
const goToPage = useCallback((page: number) => {
setState(prev => ({
...prev,
currentPage: Math.max(1, Math.min(page, prev.totalPages))
}));
}, []);
const nextPage = useCallback(() => {
setState(prev => ({
...prev,
currentPage: Math.min(prev.currentPage + 1, prev.totalPages)
}));
}, []);
const prevPage = useCallback(() => {
setState(prev => ({
...prev,
currentPage: Math.max(prev.currentPage - 1, 1)
}));
}, []);
// Calculated values
const hasNextPage = useMemo(() => state.currentPage < state.totalPages, [state]);
const hasPrevPage = useMemo(() => state.currentPage > 1, [state]);
const startItem = useMemo(() => (state.currentPage - 1) * state.itemsPerPage + 1, [state]);
const endItem = useMemo(() => Math.min(state.currentPage * state.itemsPerPage, state.totalItems), [state]);
return {
currentPage: state.currentPage,
totalPages: state.totalPages,
goToPage,
nextPage,
prevPage,
hasNextPage,
hasPrevPage,
startItem,
endItem
};
}