mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-20 06:53:38 +02:00
- Add uload project with apps/web structure
- Reorganize from flat to monorepo structure
- Remove PocketBase binary and local data
- Update to pnpm and @uload/web namespace
- Add picture project to monorepo
- Remove embedded git repository
- Unify all package names to @{project}/{app} schema:
- @maerchenzauber/* (was @storyteller/*)
- @manacore/* (was manacore-*, manacore)
- @manadeck/* (was web, backend, manadeck)
- @memoro/* (was memoro-web, landing, memoro)
- @picture/* (already unified)
- @uload/web
- Add convenient dev scripts for all apps:
- pnpm dev:{project}:web
- pnpm dev:{project}:landing
- pnpm dev:{project}:mobile
- pnpm dev:{project}:backend
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
79 lines
1.8 KiB
TypeScript
79 lines
1.8 KiB
TypeScript
import { useState, useCallback } from 'react';
|
|
|
|
type UsePaginationOptions = {
|
|
pageSize: number;
|
|
initialPage?: number;
|
|
};
|
|
|
|
type UsePaginationReturn<T> = {
|
|
items: T[];
|
|
page: number;
|
|
hasMore: boolean;
|
|
loading: boolean;
|
|
loadingMore: boolean;
|
|
refreshing: boolean;
|
|
setItems: (items: T[] | ((prev: T[]) => T[])) => void;
|
|
appendItems: (newItems: T[]) => void;
|
|
setHasMore: (hasMore: boolean) => void;
|
|
setLoading: (loading: boolean) => void;
|
|
setLoadingMore: (loading: boolean) => void;
|
|
setRefreshing: (refreshing: boolean) => void;
|
|
nextPage: () => void;
|
|
resetPage: () => void;
|
|
reset: () => void;
|
|
};
|
|
|
|
export function usePagination<T>({
|
|
pageSize,
|
|
initialPage = 0,
|
|
}: UsePaginationOptions): UsePaginationReturn<T> {
|
|
const [items, setItems] = useState<T[]>([]);
|
|
const [page, setPage] = useState(initialPage);
|
|
const [hasMore, setHasMore] = useState(true);
|
|
const [loading, setLoading] = useState(true);
|
|
const [loadingMore, setLoadingMore] = useState(false);
|
|
const [refreshing, setRefreshing] = useState(false);
|
|
|
|
const appendItems = useCallback((newItems: T[]) => {
|
|
setItems(prev => [...prev, ...newItems]);
|
|
// Check if we have more items to load
|
|
if (newItems.length < pageSize) {
|
|
setHasMore(false);
|
|
}
|
|
}, [pageSize]);
|
|
|
|
const nextPage = useCallback(() => {
|
|
setPage(prev => prev + 1);
|
|
}, []);
|
|
|
|
const resetPage = useCallback(() => {
|
|
setPage(initialPage);
|
|
}, [initialPage]);
|
|
|
|
const reset = useCallback(() => {
|
|
setItems([]);
|
|
setPage(initialPage);
|
|
setHasMore(true);
|
|
setLoading(true);
|
|
setLoadingMore(false);
|
|
setRefreshing(false);
|
|
}, [initialPage]);
|
|
|
|
return {
|
|
items,
|
|
page,
|
|
hasMore,
|
|
loading,
|
|
loadingMore,
|
|
refreshing,
|
|
setItems,
|
|
appendItems,
|
|
setHasMore,
|
|
setLoading,
|
|
setLoadingMore,
|
|
setRefreshing,
|
|
nextPage,
|
|
resetPage,
|
|
reset,
|
|
};
|
|
}
|