feat: titles page
This commit is contained in:
parent
6836cfa057
commit
b976c35b8e
44 changed files with 1539 additions and 107 deletions
37
modules/frontend/src/components/ListView/useListView.tsx
Normal file
37
modules/frontend/src/components/ListView/useListView.tsx
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
import { useState, useEffect } from "react";
|
||||
import type { FetchFunction } from "../../types/list";
|
||||
|
||||
export function useListView<TItem>(fetchFn: FetchFunction<TItem>) {
|
||||
const [items, setItems] = useState<TItem[]>([]);
|
||||
const [cursor, setCursor] = useState<string | undefined>();
|
||||
const [search, setSearch] = useState("");
|
||||
const [viewMode, setViewMode] = useState<"horizontal" | "square">("horizontal");
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
loadItems(true);
|
||||
}, [search]);
|
||||
|
||||
const loadItems = async (reset = false) => {
|
||||
setIsLoading(true);
|
||||
const result = await fetchFn({
|
||||
search,
|
||||
cursor: reset ? undefined : cursor,
|
||||
});
|
||||
|
||||
setItems(prev => reset ? result.items : [...prev, ...result.items]);
|
||||
setCursor(result.nextCursor);
|
||||
setIsLoading(false);
|
||||
};
|
||||
|
||||
return {
|
||||
items,
|
||||
search,
|
||||
setSearch,
|
||||
viewMode,
|
||||
setViewMode,
|
||||
loadMore: () => loadItems(),
|
||||
hasMore: Boolean(cursor),
|
||||
isLoading,
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue