diff --git a/.changeset/spotty-words-flow.md b/.changeset/spotty-words-flow.md new file mode 100644 index 000000000..61a3fa0d1 --- /dev/null +++ b/.changeset/spotty-words-flow.md @@ -0,0 +1,5 @@ +--- +"@scaleway/use-dataloader": patch +--- + +Fix bug on infinity data loader diff --git a/packages/fuzzy-search/src/__tests__/index.test.tsx b/packages/fuzzy-search/src/__tests__/index.test.tsx index 99b28105d..c69437771 100644 --- a/packages/fuzzy-search/src/__tests__/index.test.tsx +++ b/packages/fuzzy-search/src/__tests__/index.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, test } from 'vitest' -import { isFuzzyMatch, levenshteinDistance, normalizeString } from ".." +import { isFuzzyMatch, levenshteinDistance, normalizeString } from '..' describe('fuzzySearch', () => { describe('normalizeString', () => { diff --git a/packages/use-dataloader/src/useInfiniteDataLoader.ts b/packages/use-dataloader/src/useInfiniteDataLoader.ts index 9956af472..86bd5aa3d 100644 --- a/packages/use-dataloader/src/useInfiniteDataLoader.ts +++ b/packages/use-dataloader/src/useInfiniteDataLoader.ts @@ -55,13 +55,12 @@ export const useInfiniteDataLoader = < getNextPage ? getNextPage(...params) : undefined, ) - const paramsRef = useRef({ + const paramsArgs = { ...baseParams, [pageParamKey]: page, - }) - - const getMethodRef = useRef(() => method(paramsRef.current)) + } + const getMethodRef = useRef(() => method(paramsArgs)) const getOnSuccessRef = useRef( (...params: Parameters>) => onSuccess?.(...params), @@ -99,23 +98,28 @@ export const useInfiniteDataLoader = < 'infinite', page as string | number, ]) + // Clean bad requests in the array requestRefs.current = requestRefs.current.filter(request => { if (request.key.startsWith(computeKey(baseQueryKey))) { return true } + request.removeObserver(forceRerender.current) return false }) + const requestInRef = requestRefs.current.find(request => request.key.endsWith(currentQueryKey), ) + if (!requestInRef) { const request = getOrAddRequest(currentQueryKey, { enabled, method: getMethodRef.current, }) + if (!request.observers.includes(forceRerender.current)) { request.addObserver(forceRerender.current) } @@ -176,16 +180,13 @@ export const useInfiniteDataLoader = < const loadMoreRef = useRef(() => { if (nextPageRef.current) { - paramsRef.current = { - ...baseParams, - [pageParamKey]: nextPageRef.current, - } setPage(curr => nextPageRef.current ?? curr) } }) useEffect(() => { - request.method = () => method(paramsRef.current) + request.method = () => method(paramsArgs) + // eslint-disable-next-line react-hooks/exhaustive-deps }, [method, request]) useEffect(() => { @@ -210,28 +211,24 @@ export const useInfiniteDataLoader = < .then(async result => { nextPageRef.current = getNextPageFnRef.current( result, - paramsRef.current, + paramsArgs, ) as typeof page await onSuccessLoad(result) }) .catch(onFailedLoad) } optimisticIsLoadingRef.current = false + // eslint-disable-next-line react-hooks/exhaustive-deps }, [needLoad, request]) - useEffect(() => { - paramsRef.current = { - ...baseParams, - [pageParamKey]: page, - } - /* eslint-disable-next-line react-hooks/exhaustive-deps */ - }, [baseParams, pageParamKey]) useEffect(() => { getOnSuccessRef.current = (...params) => onSuccess?.(...params) }, [onSuccess]) + useEffect(() => { getOnErrorRef.current = err => onError?.(err) ?? onGlobalError?.(err) }, [onError, onGlobalError]) + useEffect(() => { getNextPageFnRef.current = (...params) => getNextPage ? getNextPage(...params) : undefined