overleaf/services/web/frontend/js/shared/hooks/use-browser-window.js
Alf Eaton 8c3578e74b Merge pull request #4041 from overleaf/ae-use-ref-with-autofocus
Rename hooks files and move to shared folder

GitOrigin-RevId: 9659247b5e767197c3e11acc9a3922ecaab49162
2021-05-19 02:05:50 +00:00

68 lines
1.5 KiB
JavaScript

import { useEffect, useState } from 'react'
let titleIsFlashing = false
let originalTitle
let flashIntervalHandle
function flashTitle(message) {
if (document.hasFocus() || titleIsFlashing) {
return
}
function swapTitle() {
if (window.document.title === originalTitle) {
window.document.title = message
} else {
window.document.title = originalTitle
}
}
originalTitle = window.document.title
window.document.title = message
titleIsFlashing = true
flashIntervalHandle = setInterval(swapTitle, 800)
}
function stopFlashingTitle() {
if (!titleIsFlashing) {
return
}
clearInterval(flashIntervalHandle)
window.document.title = originalTitle
originalTitle = undefined
titleIsFlashing = false
}
function setTitle(title) {
if (titleIsFlashing) {
originalTitle = title
} else {
window.document.title = title
}
}
function useBrowserWindow() {
const [hasFocus, setHasFocus] = useState(document.hasFocus())
useEffect(() => {
function handleFocusEvent() {
setHasFocus(true)
}
function handleBlurEvent() {
setHasFocus(false)
}
window.addEventListener('focus', handleFocusEvent)
window.addEventListener('blur', handleBlurEvent)
return () => {
window.removeEventListener('focus', handleFocusEvent)
window.removeEventListener('blur', handleBlurEvent)
}
}, [])
return { hasFocus, flashTitle, stopFlashingTitle, setTitle }
}
export default useBrowserWindow