feat: add enabled option to useInfiniteMemos and PagedMemoList for conditional fetching

This commit is contained in:
Steven 2026-01-22 20:21:16 +08:00
parent 956ae0ebc5
commit c240b70591
3 changed files with 17 additions and 12 deletions

View File

@ -27,6 +27,7 @@ interface Props {
filter?: string;
pageSize?: number;
showCreator?: boolean;
enabled?: boolean;
}
function useAutoFetchWhenNotScrollable({
@ -88,13 +89,15 @@ const PagedMemoList = (props: Props) => {
// Show memo editor only on the root route
const showMemoEditor = Boolean(matchPath(Routes.ROOT, window.location.pathname));
// Use React Query's infinite query for pagination
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteMemos({
state: props.state || State.NORMAL,
orderBy: props.orderBy || "display_time desc",
filter: props.filter,
pageSize: props.pageSize || DEFAULT_LIST_MEMOS_PAGE_SIZE,
});
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteMemos(
{
state: props.state || State.NORMAL,
orderBy: props.orderBy || "display_time desc",
filter: props.filter,
pageSize: props.pageSize || DEFAULT_LIST_MEMOS_PAGE_SIZE,
},
{ enabled: props.enabled ?? true },
);
// Flatten pages into a single array of memos
const memos = useMemo(() => data?.pages.flatMap((page) => page.memos) || [], [data]);

View File

@ -26,7 +26,7 @@ export function useMemos(request: Partial<ListMemosRequest> = {}) {
});
}
export function useInfiniteMemos(request: Partial<ListMemosRequest> = {}) {
export function useInfiniteMemos(request: Partial<ListMemosRequest> = {}, options?: { enabled?: boolean }) {
return useInfiniteQuery({
queryKey: memoKeys.list(request),
queryFn: async ({ pageParam }) => {
@ -40,8 +40,9 @@ export function useInfiniteMemos(request: Partial<ListMemosRequest> = {}) {
},
initialPageParam: "",
getNextPageParam: (lastPage) => lastPage.nextPageToken || undefined,
staleTime: 1000 * 60, // Consider data fresh for 1 minute
gcTime: 1000 * 60 * 5, // Keep unused data in cache for 5 minutes
staleTime: 1000 * 60,
gcTime: 1000 * 60 * 5,
enabled: options?.enabled ?? true,
});
}

View File

@ -3,20 +3,20 @@ import MemoView from "@/components/MemoView";
import PagedMemoList from "@/components/PagedMemoList";
import { useMemoFilters, useMemoSorting } from "@/hooks";
import useCurrentUser from "@/hooks/useCurrentUser";
import { useInstance } from "@/contexts/InstanceContext";
import { State } from "@/types/proto/api/v1/common_pb";
import { Memo } from "@/types/proto/api/v1/memo_service_pb";
const Home = () => {
const user = useCurrentUser();
const { isInitialized } = useInstance();
// Build filter using unified hook
const memoFilter = useMemoFilters({
creatorName: user?.name,
includeShortcuts: true,
includePinned: true,
});
// Get sorting logic using unified hook
const { listSort, orderBy } = useMemoSorting({
pinnedFirst: true,
state: State.NORMAL,
@ -31,6 +31,7 @@ const Home = () => {
listSort={listSort}
orderBy={orderBy}
filter={memoFilter}
enabled={isInitialized && !!user} // Wait for contexts to stabilize before fetching
/>
</div>
);