You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
825 B
32 lines
825 B
import { useEffect, useRef, useState } from 'react'; |
|
|
|
export function useIsDocumentVisible({ |
|
onChange, |
|
}: { |
|
onChange?: (isVisible: boolean) => void; |
|
} = {}) { |
|
const [isDocumentVisible, setIsDocumentVisible] = useState( |
|
() => document.visibilityState === 'visible', |
|
); |
|
|
|
const onChangeRef = useRef(onChange); |
|
useEffect(() => { |
|
onChangeRef.current = onChange; |
|
}, [onChange]); |
|
|
|
useEffect(() => { |
|
function handleVisibilityChange() { |
|
const isVisible = document.visibilityState === 'visible'; |
|
|
|
setIsDocumentVisible(isVisible); |
|
onChangeRef.current?.(isVisible); |
|
} |
|
window.addEventListener('visibilitychange', handleVisibilityChange); |
|
|
|
return () => { |
|
window.removeEventListener('visibilitychange', handleVisibilityChange); |
|
}; |
|
}, []); |
|
|
|
return isDocumentVisible; |
|
}
|
|
|