@@ -4,26 +4,49 @@ import {AUTO_REFRESH_INTERVAL} from '../constants';
44
55import { useSetting } from './useSetting' ;
66
7+ const IMMEDIATE_UPDATE_INTERVAL = 1 ;
8+ const DISABLED_INTERVAL = 0 ;
9+
710export function useAutoRefreshInterval ( ) : [ number , ( value : number ) => void ] {
8- const [ settingValue , setSettingValue ] = useSetting ( AUTO_REFRESH_INTERVAL , 0 ) ;
11+ const [ settingValue , setSettingValue ] = useSetting ( AUTO_REFRESH_INTERVAL , DISABLED_INTERVAL ) ;
912 const [ effectiveInterval , setEffectiveInterval ] = React . useState (
10- document . visibilityState === 'visible' ? settingValue : 0 ,
13+ document . visibilityState === 'visible' ? settingValue : DISABLED_INTERVAL ,
1114 ) ;
1215
16+ const lastHiddenTimeRef = React . useRef < number | null > ( null ) ;
17+
1318 React . useEffect ( ( ) => {
14- // Update the effective interval when the setting changes
1519 setEffectiveInterval ( document . visibilityState === 'visible' ? settingValue : 0 ) ;
1620
17- // Handle visibility change events
1821 const handleVisibilityChange = ( ) => {
19- setEffectiveInterval ( document . visibilityState === 'visible' ? settingValue : 0 ) ;
22+ const isVisible = document . visibilityState === 'visible' ;
23+ if ( isVisible ) {
24+ // If more than settingValue milliseconds have passed since the page was hidden,
25+ // trigger an immediate update
26+ const shouldTriggerImmediate =
27+ lastHiddenTimeRef . current &&
28+ settingValue !== DISABLED_INTERVAL &&
29+ Date . now ( ) - lastHiddenTimeRef . current >= settingValue ;
30+
31+ if ( shouldTriggerImmediate ) {
32+ setEffectiveInterval ( IMMEDIATE_UPDATE_INTERVAL ) ;
33+
34+ setTimeout ( ( ) => {
35+ setEffectiveInterval ( settingValue ) ;
36+ } , 0 ) ;
37+ } else {
38+ setEffectiveInterval ( settingValue ) ;
39+ }
40+
41+ lastHiddenTimeRef . current = null ;
42+ } else {
43+ lastHiddenTimeRef . current = Date . now ( ) ;
44+ setEffectiveInterval ( DISABLED_INTERVAL ) ;
45+ }
2046 } ;
2147
2248 document . addEventListener ( 'visibilitychange' , handleVisibilityChange ) ;
23-
24- return ( ) => {
25- document . removeEventListener ( 'visibilitychange' , handleVisibilityChange ) ;
26- } ;
49+ return ( ) => document . removeEventListener ( 'visibilitychange' , handleVisibilityChange ) ;
2750 } , [ settingValue ] ) ;
2851
2952 return [ effectiveInterval , setSettingValue ] ;
0 commit comments