From 261f4dca4a474192028f26f4130a054f9fc31aa2 Mon Sep 17 00:00:00 2001 From: slynn1324 Date: Fri, 29 Jan 2021 09:07:24 -0600 Subject: [PATCH] fixed up visibility change detection --- server.js | 3 +++ static/app.js | 26 +++++++++++++++++++++----- static/utils.js | 15 +++++++++++++++ static/ws.js | 32 +++++++++++++++----------------- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/server.js b/server.js index 33cfe35..e7cd132 100644 --- a/server.js +++ b/server.js @@ -134,6 +134,9 @@ app.ws('/ws/:uid', (ws, req) => { ws.on("message", (msg) => { //console.log("received messsage: " + msg); }); + ws.on("close", () => { + console.log("socket closed for user " + req.params.uid); + }); console.log("socket opened for user " + req.params.uid); }); diff --git a/static/app.js b/static/app.js index 4a57cab..147d636 100644 --- a/static/app.js +++ b/static/app.js @@ -278,9 +278,25 @@ store.do('hash.update'); appComponent.render(); -// refresh on focus -window.addEventListener("focus", () => { - store.do("load.boards"); - store.do("load.board"); - dispatchSocketConnect(); +// refresh on load. +window.lastVisibilityChange = new Date().getTime(); +document.addEventListener("visibilitychange", async () => { + + let now = new Date().getTime(); + + // only run if we haven't run in the last second.. prevent double updates + if ( document.visibilityState === 'visible' && (now - window.lastVisibilityChange) > 1000) { + window.lastVisibilityChange = now; + + let connected = false; + if ( dispatchSocketConnect ){ // maybe we stripped out web sockets + connected = await dispatchSocketConnect(); + } + + if ( !connected ){ + store.do("load.boards"); + store.do("load.board"); + } + } + }); \ No newline at end of file diff --git a/static/utils.js b/static/utils.js index 32ced82..244b1d0 100644 --- a/static/utils.js +++ b/static/utils.js @@ -61,6 +61,21 @@ function getPinById(id){ return store.data.board.pins[getPinIndexById(id)]; } +async function sleep(ms){ return new Promise((resolve) => setTimeout(resolve, ms)); } + +// async function runAfter(f, ms){ +// return new Promise( (resolve,reject) => { +// setTimeout( () => { +// try { +// await f(); +// resolve(); +// } catch (e){ +// reject(e); +// } +// }, ms); +// }); +// } + // feature detection if ( 'ontouchstart' in window ){ window.isTouch = true; diff --git a/static/ws.js b/static/ws.js index 8d9b381..2762a24 100644 --- a/static/ws.js +++ b/static/ws.js @@ -23,39 +23,37 @@ window.addEventListener("socket-connect", () => { socketConnect(); }); -function socketConnect(){ +async function socketConnect(){ if ( !window.uid ){ console.log("no user id, can't open a socket"); - return; + return false; } if ( window.socketConnected ){ console.log("web socket already connected"); - return; + return true; } window.socketConnected = false; let s = new WebSocket(getSocketUrl()); - s.onopen = (e) => { + s.onopen = async (e) => { console.log("web socket connected"); - // wait 10ms to see if the socket stays connected - setTimeout( () => { - if ( s.readyState == WebSocket.OPEN ){ - console.log("web socket appears operational"); - document.body.classList.add("socketConnected"); - window.socketConnected = true; - window.socketConnectFailureCount = 0; + // wait 50ms to see if the socket stays connected + await sleep(50); - store.do("load.boards"); - store.do("load.board"); - } else { - console.log("web socket connect failed"); - } - }, 10); + if ( s.readyState == WebSocket.OPEN ){ + console.log("web socket appears operational"); + document.body.classList.add("socketConnected"); + window.socketConnected = true; + return true; + } else { + console.log("web socket connect failed"); + return false; + } }; s.onmessage = (e) => {