diff --git a/web/cashtab/src/hooks/useAsyncTimeout.js b/web/cashtab/src/hooks/useAsyncTimeout.js deleted file mode 100644 --- a/web/cashtab/src/hooks/useAsyncTimeout.js +++ /dev/null @@ -1,34 +0,0 @@ -import { useEffect, useRef } from 'react'; - -const useAsyncTimeout = (callback, delay) => { - const savedCallback = useRef(callback); - - useEffect(() => { - savedCallback.current = callback; - }); - - useEffect(() => { - let id = null; - const tick = () => { - const promise = savedCallback.current(); - - if (promise instanceof Promise) { - promise.then(() => { - id = setTimeout(tick, delay); - }); - } else { - id = setTimeout(tick, delay); - } - }; - - if (id !== null) { - id = setTimeout(tick, delay); - return () => clearTimeout(id); - } else { - tick(); - return; - } - }, [delay]); -}; - -export default useAsyncTimeout; diff --git a/web/cashtab/src/hooks/useInterval.js b/web/cashtab/src/hooks/useInterval.js --- a/web/cashtab/src/hooks/useInterval.js +++ b/web/cashtab/src/hooks/useInterval.js @@ -1,20 +1,25 @@ -import { useRef, useEffect } from 'react'; +import { useEffect, useRef } from 'react'; -const useInterval = (callback, delay) => { +// https://overreacted.io/making-setinterval-declarative-with-react-hooks/ + +function useInterval(callback, delay) { const savedCallback = useRef(); + // Remember the latest callback. useEffect(() => { savedCallback.current = callback; - }); + }, [callback]); + // Set up the interval. useEffect(() => { function tick() { savedCallback.current(); } - - let id = setInterval(tick, delay); - return () => clearInterval(id); + if (delay !== null) { + let id = setInterval(tick, delay); + return () => clearInterval(id); + } }, [delay]); -}; +} export default useInterval; diff --git a/web/cashtab/src/hooks/useWallet.js b/web/cashtab/src/hooks/useWallet.js --- a/web/cashtab/src/hooks/useWallet.js +++ b/web/cashtab/src/hooks/useWallet.js @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; -import useAsyncTimeout from 'hooks/useAsyncTimeout'; import usePrevious from 'hooks/usePrevious'; +import useInterval from './useInterval'; import useBCH from 'hooks/useBCH'; import BigNumber from 'bignumber.js'; import { @@ -1232,7 +1232,7 @@ }; // Parse for incoming XEC transactions - // hasUpdated is set to true in the useAsyncTimeout function, and re-sets to false during activateWallet + // hasUpdated is set to true in the useInterval function, and re-sets to false during activateWallet // Do not show this notification if websocket connection is live; in this case the websocket will handle it if ( !isActiveWebsocket(chronikWebsocket) && @@ -1353,7 +1353,7 @@ } // Update wallet according to defined interval - useAsyncTimeout(async () => { + useInterval(async () => { const wallet = await getWallet(); update({ wallet,