fix(island): 🐛 multiple intervals are started at same time checkin is-online

This commit is contained in:
Julien Oculi 2024-07-19 15:24:14 +02:00
parent 82906907e2
commit 470467d8a8

View file

@ -32,7 +32,7 @@ export default function IsOnline(
? navigator.connection as NetworkConnection ? navigator.connection as NetworkConnection
: null : null
useEffect(() => { useEffect(() => {
openSocket(status, { id: undefined }) openSocket(status)
connection?.addEventListener('change', () => { connection?.addEventListener('change', () => {
fetch('/api/serviceworker/is-online') fetch('/api/serviceworker/is-online')
.then(() => status.value = true) .then(() => status.value = true)
@ -43,18 +43,19 @@ export default function IsOnline(
return <>{displayed}</> return <>{displayed}</>
} }
function openSocket(status: Signal<boolean>, ref: { id: number | undefined }) { function openSocket(status: Signal<boolean>) {
const socket = new WebSocket( const socket = new WebSocket(
`wss://${location.host}/api/serviceworker/is-online`, `wss://${location.host}/api/serviceworker/is-online`,
) )
socket.addEventListener('open', () => { socket.addEventListener('open', () => {
status.value = true status.value = true
clearInterval(ref.id) const id = Number(sessionStorage.getItem('$cohabit.is-online.id') ?? -1)
clearInterval(id)
}) })
socket.addEventListener('close', () => { socket.addEventListener('close', () => {
status.value = false status.value = false
// Try reconnect every 5s // Try reconnect every 5s
const id = setInterval(() => openSocket(status, ref), 5_000) const id = setInterval(() => openSocket(status), 5_000)
ref.id = id sessionStorage.setItem('$cohabit.is-online.id', id.toString())
}) })
} }