From 3b2ca26444ccadbc544995b5538e6dfd12261070 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Sat, 25 Apr 2020 19:01:39 +0200 Subject: [PATCH 1/4] use queryRef to avoid infinite loop in refetch interval effect --- src/useBaseQuery.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/useBaseQuery.js b/src/useBaseQuery.js index 4a7be77404..df0a82bd5d 100644 --- a/src/useBaseQuery.js +++ b/src/useBaseQuery.js @@ -89,6 +89,7 @@ export function useBaseQuery(queryKey, queryVariables, queryFn, config = {}) { // Handle refetch interval React.useEffect(() => { + const query = queryRef.current if ( config.refetchInterval && (!query.refetchInterval || config.refetchInterval < query.refetchInterval) @@ -105,12 +106,7 @@ export function useBaseQuery(queryKey, queryVariables, queryFn, config = {}) { delete query.refetchInterval } } - }, [ - config.refetchInterval, - config.refetchIntervalInBackground, - query.refetchInterval, - refetch, - ]) + }, [config.refetchInterval, config.refetchIntervalInBackground, refetch]) return { ...query.state, From 63a6c6fd6cdd6a8bd605784b5aafe4938cb6617b Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Thu, 30 Apr 2020 23:38:14 +0200 Subject: [PATCH 2/4] fix original config being mutated by config from another hook instance --- src/queryCache.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/queryCache.js b/src/queryCache.js index 6f17a24077..6c2ae57512 100644 --- a/src/queryCache.js +++ b/src/queryCache.js @@ -110,7 +110,7 @@ export function makeQueryCache() { if (query) { Object.assign(query, { queryVariables, queryFn }) - Object.assign(query.config, config) + query.config = {...query.config, ...config }; } else { query = makeQuery({ queryKey, From 10b6e5248f1183eba42a51a575e3818c5f723800 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Thu, 30 Apr 2020 23:49:27 +0200 Subject: [PATCH 3/4] store refetchIntervalId and fix refetchInterval comparison --- src/queryCache.js | 2 +- src/useBaseQuery.js | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/queryCache.js b/src/queryCache.js index 6c2ae57512..13d74151fe 100644 --- a/src/queryCache.js +++ b/src/queryCache.js @@ -110,7 +110,7 @@ export function makeQueryCache() { if (query) { Object.assign(query, { queryVariables, queryFn }) - query.config = {...query.config, ...config }; + query.config = { ...query.config, ...config } } else { query = makeQuery({ queryKey, diff --git a/src/useBaseQuery.js b/src/useBaseQuery.js index df0a82bd5d..163cd0ac09 100644 --- a/src/useBaseQuery.js +++ b/src/useBaseQuery.js @@ -92,18 +92,21 @@ export function useBaseQuery(queryKey, queryVariables, queryFn, config = {}) { const query = queryRef.current if ( config.refetchInterval && - (!query.refetchInterval || config.refetchInterval < query.refetchInterval) + (!query.currentRefetchInterval || + // shorter interval should override previous one + config.refetchInterval < query.currentRefetchInterval) ) { - clearInterval(query.refetchInterval) - query.refetchInterval = setInterval(() => { + query.currentRefetchInterval = config.refetchInterval + clearInterval(query.refetchIntervalId) + query.refetchIntervalId = setInterval(() => { if (isDocumentVisible() || config.refetchIntervalInBackground) { refetch().catch(Console.error) } }, config.refetchInterval) return () => { - clearInterval(query.refetchInterval) - delete query.refetchInterval + clearInterval(query.refetchIntervalId) + delete query.refetchIntervalId } } }, [config.refetchInterval, config.refetchIntervalInBackground, refetch]) From cc9fd67bdb95f8f610aec9cae2b3ad20e91b4b84 Mon Sep 17 00:00:00 2001 From: Andrew Cherniavskii Date: Fri, 1 May 2020 00:01:03 +0200 Subject: [PATCH 4/4] clear query.currentRefetchInterval on cleanup --- src/useBaseQuery.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/useBaseQuery.js b/src/useBaseQuery.js index 163cd0ac09..4d47d78f01 100644 --- a/src/useBaseQuery.js +++ b/src/useBaseQuery.js @@ -107,6 +107,7 @@ export function useBaseQuery(queryKey, queryVariables, queryFn, config = {}) { return () => { clearInterval(query.refetchIntervalId) delete query.refetchIntervalId + delete query.currentRefetchInterval } } }, [config.refetchInterval, config.refetchIntervalInBackground, refetch])