mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
properly handle list refetch on query change
This commit is contained in:
@@ -93,28 +93,6 @@ export const useItemListInfiniteLoader = ({
|
|||||||
[serverId, itemType, query],
|
[serverId, itemType, query],
|
||||||
);
|
);
|
||||||
|
|
||||||
// Reset the loaded pages when the query changes
|
|
||||||
useEffect(() => {
|
|
||||||
queryClient.setQueryData(dataQueryKey, (oldData: any) => {
|
|
||||||
if (!oldData) return oldData;
|
|
||||||
return {
|
|
||||||
...oldData,
|
|
||||||
pagesLoaded: {},
|
|
||||||
};
|
|
||||||
});
|
|
||||||
lastFetchedPageRef.current = -1;
|
|
||||||
currentVisibleRangeRef.current = null;
|
|
||||||
}, [query, queryClient, dataQueryKey]);
|
|
||||||
|
|
||||||
const { data } = useQuery<{ data: unknown[]; pagesLoaded: Record<string, boolean> }>({
|
|
||||||
enabled: false,
|
|
||||||
initialData: getInitialData(totalItemCount),
|
|
||||||
queryFn: () => {
|
|
||||||
return getInitialData(totalItemCount);
|
|
||||||
},
|
|
||||||
queryKey: dataQueryKey,
|
|
||||||
});
|
|
||||||
|
|
||||||
const fetchPage = useCallback(
|
const fetchPage = useCallback(
|
||||||
async (pageNumber: number) => {
|
async (pageNumber: number) => {
|
||||||
const startIndex = pageNumber * itemsPerPage;
|
const startIndex = pageNumber * itemsPerPage;
|
||||||
@@ -124,8 +102,7 @@ export const useItemListInfiniteLoader = ({
|
|||||||
...query,
|
...query,
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = await queryClient.ensureQueryData({
|
const result = await queryClient.fetchQuery({
|
||||||
gcTime: 1000 * 15,
|
|
||||||
queryFn: async ({ signal }) => {
|
queryFn: async ({ signal }) => {
|
||||||
const result = await listQueryFn({
|
const result = await listQueryFn({
|
||||||
apiClientProps: { serverId, signal },
|
apiClientProps: { serverId, signal },
|
||||||
@@ -135,7 +112,6 @@ export const useItemListInfiniteLoader = ({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
queryKey: queryKeys[getQueryKeyName(itemType)].list(serverId, queryParams),
|
queryKey: queryKeys[getQueryKeyName(itemType)].list(serverId, queryParams),
|
||||||
staleTime: 1000 * 15,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const endIndex = startIndex + itemsPerPage;
|
const endIndex = startIndex + itemsPerPage;
|
||||||
@@ -167,6 +143,41 @@ export const useItemListInfiniteLoader = ({
|
|||||||
[itemsPerPage, query, queryClient, serverId, dataQueryKey, listQueryFn, itemType],
|
[itemsPerPage, query, queryClient, serverId, dataQueryKey, listQueryFn, itemType],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Reset the loaded pages and refetch current page when the query changes
|
||||||
|
useEffect(() => {
|
||||||
|
// Capture the current visible range before resetting
|
||||||
|
const visibleRange = currentVisibleRangeRef.current;
|
||||||
|
|
||||||
|
// Determine which page to fetch based on current visible range
|
||||||
|
let pageToFetch = 0;
|
||||||
|
if (visibleRange) {
|
||||||
|
pageToFetch = Math.floor(visibleRange.startIndex / itemsPerPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the loaded pages
|
||||||
|
queryClient.setQueryData(dataQueryKey, (oldData: any) => {
|
||||||
|
if (!oldData) return oldData;
|
||||||
|
return {
|
||||||
|
...oldData,
|
||||||
|
pagesLoaded: {},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
lastFetchedPageRef.current = -1;
|
||||||
|
currentVisibleRangeRef.current = null;
|
||||||
|
|
||||||
|
fetchPage(pageToFetch);
|
||||||
|
}, [query, queryClient, dataQueryKey, fetchPage, itemsPerPage]);
|
||||||
|
|
||||||
|
const { data } = useQuery<{ data: unknown[]; pagesLoaded: Record<string, boolean> }>({
|
||||||
|
enabled: false,
|
||||||
|
initialData: getInitialData(totalItemCount),
|
||||||
|
queryFn: () => {
|
||||||
|
return getInitialData(totalItemCount);
|
||||||
|
},
|
||||||
|
queryKey: dataQueryKey,
|
||||||
|
});
|
||||||
|
|
||||||
const onRangeChangedBase = useCallback(
|
const onRangeChangedBase = useCallback(
|
||||||
async (range: { startIndex: number; stopIndex: number }) => {
|
async (range: { startIndex: number; stopIndex: number }) => {
|
||||||
// Track the current visible range
|
// Track the current visible range
|
||||||
|
|||||||
Reference in New Issue
Block a user