diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 770631fcb5..cbf9ad811a 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -32,7 +32,7 @@ import DataTreeToggle from "./components/common/data-tree-toggle.vue"; import TreeView from "./components/TreeView.vue"; import FilterTable from "./components/shared/FilterTable.vue"; import PaginationTable from "./components/shared/PaginationTable.vue"; -import PMDropdownSuggest from './components/PMDropdownSuggest'; +import PMDropdownSuggest from "./components/PMDropdownSuggest"; import "@processmaker/screen-builder/dist/vue-form-builder.css"; window.__ = translator; @@ -345,7 +345,14 @@ if (userID) { window.ProcessMaker.AccountTimeoutWarnSeconds = parseInt(document.head.querySelector("meta[name=\"timeout-warn-seconds\"]")?.content); window.ProcessMaker.AccountTimeoutEnabled = document.head.querySelector("meta[name=\"timeout-enabled\"]") ? parseInt(document.head.querySelector("meta[name=\"timeout-enabled\"]")?.content) : 1; window.ProcessMaker.AccountTimeoutWorker = new Worker(timeoutScript); - window.ProcessMaker.AccountTimeoutWorker.addEventListener("message", (e) => { + + const payloadAccountTimeoutWorker = { + timeout: window.ProcessMaker.AccountTimeoutLength, + warnSeconds: window.ProcessMaker.AccountTimeoutWarnSeconds, + enabled: window.ProcessMaker.AccountTimeoutEnabled, + }; + + window.ProcessMaker.AccountTimeoutWorker.onmessage = (e) => { if (e.data.method === "countdown") { window.ProcessMaker.sessionModal( "Session Warning", @@ -357,18 +364,27 @@ if (userID) { if (e.data.method === "timedOut") { window.location = "/logout?timeout=true"; } - }); + }; // in some cases it's necessary to start manually window.ProcessMaker.AccountTimeoutWorker.postMessage({ method: "start", - data: { - timeout: window.ProcessMaker.AccountTimeoutLength, - warnSeconds: window.ProcessMaker.AccountTimeoutWarnSeconds, - enabled: window.ProcessMaker.AccountTimeoutEnabled, - }, + data: payloadAccountTimeoutWorker, }); + // Restart the timeout worker (when the user interacts with the page) + const eventsTimeoutWorker = ["click", "keypress"]; + + eventsTimeoutWorker.forEach((event) => { + document.addEventListener(event, () => { + window.ProcessMaker.AccountTimeoutWorker.postMessage({ + method: "restart", + }); + }); + }); + + // End -> Restart the timeout worker (when the user interacts with the page) + const isSameDevice = (e) => { const localDeviceId = Vue.$cookies.get(e.device_variable); const remoteDeviceId = e.device_id; diff --git a/resources/js/components/Session.vue b/resources/js/components/Session.vue index 52d7e46230..42cc587dc1 100644 --- a/resources/js/components/Session.vue +++ b/resources/js/components/Session.vue @@ -1,75 +1,98 @@ - diff --git a/resources/js/timeout.js b/resources/js/timeout.js index be086f612f..d4d43b2f3f 100644 --- a/resources/js/timeout.js +++ b/resources/js/timeout.js @@ -1,5 +1,6 @@ self.time = 0; self.interval = null; +self.restartWorker = false; self.addEventListener("message", (e) => { if (self.hasOwnProperty(e.data.method)) { @@ -18,8 +19,10 @@ self.start = function (data) { const timestampAtStart = Math.floor(Date.now() / 1000); const timeoutAt = timestampAtStart + (data.timeout * 60); + self.restartWorker = false; + clearInterval(self.interval); - self.interval = setInterval(function () { + self.interval = setInterval(() => { const currentTimestamp = Math.floor(Date.now() / 1000); const timeRemaining = timeoutAt - currentTimestamp; @@ -27,6 +30,13 @@ self.start = function (data) { self.postMessage({ method: "countdown", data: { time: timeRemaining } }); } + if (timeRemaining > data.warnSeconds && self.restartWorker) { + clearInterval(self.interval); + self.start(data); + self.restartWorker = false; + return; + } + if (timeRemaining < 1) { clearInterval(self.interval); self.postMessage({ method: "timedOut", data: { time: timeRemaining } }); @@ -35,5 +45,10 @@ self.start = function (data) { }; self.stop = function () { + self.restartWorker = false; clearInterval(self.interval); }; + +self.restart = function (data) { + self.restartWorker = true; +};