11import { useEffect , useRef } from "react" ;
2+ import intervalWorkerJS from "./use-interval-worker" ;
23
34export const useInterval = ( callback , delay ) => {
5+ const code = intervalWorkerJS . toString ( ) ;
6+
47 const savedCallback = useRef < any > ( null ) ;
58
69 // Remember the last callback ref
@@ -15,8 +18,24 @@ export const useInterval = (callback, delay) => {
1518 }
1619
1720 if ( delay !== null ) {
18- let id = setInterval ( tick , delay ) ;
19- return ( ) => clearInterval ( id ) ;
21+ // Check for Worker available in modern browsers. If not, provide degraded experience (primarily for unit tests)
22+ if ( window . Worker ) {
23+ // Create an Object URL for the Worker JS file
24+ const blobUrl = URL . createObjectURL ( new Blob ( [ "(" + code + ")()" ] ) ) ;
25+ const intervalWorker = new Worker ( blobUrl ) ;
26+ // tell the to start and pass the delay
27+ intervalWorker . postMessage ( { action : "start" , delay} ) ;
28+ // add a listener on worker to call the callback
29+ intervalWorker . addEventListener ( "message" , tick ) ;
30+ // tell the worker to stop the interval and remove listener
31+ return ( ) => {
32+ intervalWorker . postMessage ( { action : "stop" } ) ;
33+ intervalWorker . removeEventListener ( "message" , tick ) ;
34+ } ;
35+ } else {
36+ let id = setInterval ( tick , delay ) ;
37+ return ( ) => clearInterval ( id ) ;
38+ }
2039 }
2140 } , [ delay ] ) ;
2241} ;
0 commit comments