3 changed files with 84 additions and 2 deletions
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
/** |
||||
* This component is responsible for updating the title of the page when |
||||
* different state changes occur. |
||||
* If the stream live state changes, or chat messages come in while the |
||||
* page is backgrounded, this component will update the title to reflect it. * |
||||
* @component |
||||
*/ |
||||
import { FC, useEffect } from 'react'; |
||||
import { useRecoilValue } from 'recoil'; |
||||
import { serverStatusState, chatMessagesAtom } from '../stores/ClientConfigStore'; |
||||
|
||||
export const TitleNotifier: FC = () => { |
||||
const chatMessages = useRecoilValue(chatMessagesAtom); |
||||
const serverStatus = useRecoilValue(serverStatusState); |
||||
|
||||
let backgrounded = false; |
||||
let defaultTitle = ''; |
||||
|
||||
const onBlur = () => { |
||||
console.log('onBlur'); |
||||
backgrounded = true; |
||||
defaultTitle = document.title; |
||||
}; |
||||
|
||||
const onFocus = () => { |
||||
console.log('onFocus'); |
||||
backgrounded = false; |
||||
window.document.title = defaultTitle; |
||||
}; |
||||
|
||||
const listenForEvents = () => { |
||||
// Listen for events that should update the title
|
||||
console.log('listenForEvents'); |
||||
window.addEventListener('blur', onBlur); |
||||
window.addEventListener('focus', onFocus); |
||||
}; |
||||
|
||||
useEffect(() => { |
||||
defaultTitle = window.document.title; |
||||
listenForEvents(); |
||||
|
||||
return () => { |
||||
window.removeEventListener('focus', onFocus); |
||||
window.removeEventListener('blur', onBlur); |
||||
}; |
||||
}, []); |
||||
|
||||
useEffect(() => { |
||||
const { online } = serverStatus; |
||||
|
||||
if (!backgrounded || !online) { |
||||
return; |
||||
} |
||||
|
||||
window.document.title = `💬 :: ${defaultTitle}`; |
||||
}, [chatMessages]); |
||||
|
||||
useEffect(() => { |
||||
if (!backgrounded) { |
||||
return; |
||||
} |
||||
|
||||
const { online } = serverStatus; |
||||
|
||||
if (online) { |
||||
window.document.title = ` 🟢 :: ${defaultTitle}`; |
||||
} else if (!online) { |
||||
window.document.title = ` 🔴 :: ${defaultTitle}`; |
||||
} |
||||
}, [serverStatusState]); |
||||
|
||||
return null; |
||||
}; |
||||
Loading…
Reference in new issue