diff --git a/packages/use-dataloader/src/__tests__/dataloader.test.ts b/packages/use-dataloader/src/__tests__/dataloader.test.ts index bd0d5c1af..9c6027b35 100644 --- a/packages/use-dataloader/src/__tests__/dataloader.test.ts +++ b/packages/use-dataloader/src/__tests__/dataloader.test.ts @@ -206,6 +206,7 @@ describe('Dataloader class', () => { await instance.load(true) await new Promise(resolve => setTimeout(resolve)) expect(method).toBeCalledTimes(6) + instance.setPollingInterval(PROMISE_TIMEOUT * 4) instance.destroy() }) diff --git a/packages/use-dataloader/src/__tests__/useDataLoader.test.tsx b/packages/use-dataloader/src/__tests__/useDataLoader.test.tsx index f08dd72b2..3096ae989 100644 --- a/packages/use-dataloader/src/__tests__/useDataLoader.test.tsx +++ b/packages/use-dataloader/src/__tests__/useDataLoader.test.tsx @@ -320,10 +320,7 @@ describe('useDataLoader', () => { }, method: method2, }) - act(() => { - // eslint-disable-next-line no-void - void result.current.reload() - }) + await waitForNextUpdate() expect(result.current.data).toBe(true) expect(result.current.isPolling).toBe(true) expect(result.current.isLoading).toBe(true) diff --git a/packages/use-dataloader/src/dataloader.ts b/packages/use-dataloader/src/dataloader.ts index 2d83d44a7..af925be51 100644 --- a/packages/use-dataloader/src/dataloader.ts +++ b/packages/use-dataloader/src/dataloader.ts @@ -19,6 +19,8 @@ class DataLoader { public key: string + private enabled: boolean + public status: StatusEnum public pollingInterval?: number @@ -53,27 +55,29 @@ class DataLoader { public constructor(args: DataLoaderConstructorArgs) { this.key = args.key + this.enabled = args.enabled ?? false this.status = args.enabled ? StatusEnum.LOADING : StatusEnum.IDLE this.method = args.method this.pollingInterval = args?.pollingInterval this.keepPreviousData = args?.keepPreviousData this.maxDataLifetime = args.maxDataLifetime if (args.enabled) { - const tryLaunch = () => { - if (DataLoader.started < DataLoader.maxConcurrent) { - // Because we want to launch the request directly without waiting the return - // eslint-disable-next-line no-void - void this.load() - } else { - setTimeout(tryLaunch) - } - } - tryLaunch() + this.tryLaunch() } else { this.notifyChanges() } } + private tryLaunch(): void { + if (DataLoader.started < DataLoader.maxConcurrent) { + // Because we want to launch the request directly without waiting the return + // eslint-disable-next-line no-void + void this.load() + } else { + setTimeout(() => this.tryLaunch()) + } + } + public getData(): T | undefined { return (DataLoader.cachedData[this.key] as T) ?? undefined } @@ -223,6 +227,13 @@ class DataLoader { public getObserversCount(): number { return this.observerListeners.length } + + public setPollingInterval(newPollingInterval?: number): void { + this.pollingInterval = newPollingInterval + if (this.enabled) { + this.tryLaunch() + } + } } export default DataLoader diff --git a/packages/use-dataloader/src/useDataLoader.ts b/packages/use-dataloader/src/useDataLoader.ts index 8a3d4804b..cfb587733 100644 --- a/packages/use-dataloader/src/useDataLoader.ts +++ b/packages/use-dataloader/src/useDataLoader.ts @@ -110,6 +110,12 @@ const useDataLoader = ( } }, [request, enabled, isIdle]) + useEffect(() => { + if (pollingInterval !== request.pollingInterval) { + request.setPollingInterval(pollingInterval) + } + }, [pollingInterval, request]) + useEffect(() => { isFetchingRef.current = isLoading || isPolling }, [isLoading, isPolling])