]> rtime.felk.cvut.cz Git - coffee/coffee-flask.git/blobdiff - templates/main.js
When replaying offline queue, use the original event time rather than now()
[coffee/coffee-flask.git] / templates / main.js
index 23f1992309f997e2c16a732ea29595347e095b7c..7f63cc52f8e41fc2adb54302eb81055ed9e306b6 100644 (file)
@@ -15,25 +15,14 @@ function update(id, msg) {
     document.getElementById(id).innerHTML = msg;
 }
 
-function loadLocalStorage() {
+function replayOfflineQueue() {
     if (localStorage) {
-        if (localStorage.length) {
-            var entries = [];
-            for (var i = 0; i < localStorage.length; i++) {
-                var value = localStorage.getItem(localStorage.key(i));
-                try {
-                    var key = localStorage.key(i);
-                    var value = localStorage.getItem(key);
-                    entries.push({ key: key, value: value });
-                } catch (err) {
-                    console.log("no json: " + value)
-                }
-            }
-            localStorage.clear();
-            entries.sort((entry1, entry2) => { return entry1.key > entry2.key;});
-            for (var i = 0; i < entries.length; i++) {
-                updateRemote(entries[i].value);
-            }
+        let queue = JSON.parse(localStorage.getItem("offlineQueue")) || [];
+        if (Array.isArray(queue)) {
+            queue.forEach(function (entry) {
+                updateRemote(entry.data, new Date(entry.time));
+            });
+            localStorage.removeItem("offlineQueue");
         }
     }
 }
@@ -45,12 +34,16 @@ var flavorChosen;
 // call this function. This function updates the UI to match the state.
 function updateUI()
 {
-    if (updateRemote === undefined) {
-        update("remote", "<center>Server offline...</center>");
-        document.getElementById("local").style.display = "block";
-        loadRemote();
-    } else {
-        document.getElementById("local").style.display = "none";
+    try {
+        let offline = updateRemote === undefined;
+
+        document.getElementById("local").style.display = !offline ? "none" : "block";
+        document.getElementById("remote").style.display = offline ? "none" : "block";
+
+        if (offline) {
+            loadRemote();       // Try to contact the server periodically
+            return;
+        }
 
         if (id_user !== undefined) {
             document.getElementById("nextStep").innerHTML = "Now select a beverage on the coffee machineā€¦";
@@ -61,34 +54,27 @@ function updateUI()
         if (timeToLogout !== undefined)
             document.getElementById("logout_button").innerHTML = '<br>logout<br>(' + timeToLogout + ' s)';
     }
+    catch (err) {
+        console.log("Error: ", err);
+    }
 }
 
-function hiddenUpdateRemote(json) {
+function hiddenUpdateRemote(json, time = new Date()) {
     var msg = JSON.parse(json);
 
-    //update("json", "json: " + JSON.stringify(msg))
-
     switch(msg.type) {
         case "empty":
-            //update("json","");
             break;
         case "rfid":
-            /*update("json",
-                "uid: " + msg.uid + "<br>" +
-                "card type: " + msg.card_type + "<br>" +
-                "uid size: " + msg.size + " bytes<br>" +
-                "sak: " + msg.sak
-            );*/
             login(msg.uid);
             break;
         case "keys":
-            //update("json", "key: " + msg.key);
             var flavor = getFlavor(msg.key);
             if (flavor !== "") {
-                addCoffee(flavor);
+                addCoffee(flavor, time);
             }
             break;
-        case "fuck":
+        case "ajax_failure":
             ajax(msg.method, msg.route, msg.data, msg.id);
             break;
     }
@@ -102,7 +88,7 @@ function loadRemote(string) {
             if (this.status == 200) {
                 update("remote", this.responseText);
                 updateRemote = hiddenUpdateRemote;
-                loadLocalStorage();
+                replayOfflineQueue();
                 updateUI();
                 clearTimeout(reloadTimer);
             } else {
@@ -128,16 +114,21 @@ function ajax(method, route, data, id) {
                 updateUI();
 
                 if (localStorage) {
-                    var now = Date.now();
-                    var fuck = JSON.stringify({
-                        type: "fuck",
+                    var ajax_failure = JSON.stringify({
+                        type: "ajax_failure",
                         method: method,
                         route: route,
                         data: data,
                         id: id
                     });
-                    localStorage.setItem(now, fuck);
-                    console.log(now + ": " + fuck);
+                    let queue = JSON.parse(localStorage.getItem("offlineQueue")) || [];
+                    queue.push({ time: Date.now(), data: ajax_failure });
+                    try {
+                        localStorage.setItem("offlineQueue", JSON.stringify(queue));
+                    }
+                    catch (err) {
+                        console.log(err);
+                    }
                 }
             }
         }
@@ -156,8 +147,7 @@ function ajax(method, route, data, id) {
 function login(id) {
     ajax("POST", "login", id, "user");
     id_user = id;
-    clearTimeout(logoutTimer);
-    timeToLogout = undefined;
+    countingTimeLogout(120);
 }
 
 function logout() {
@@ -169,6 +159,7 @@ function logout() {
 
 function countingTimeLogout(count_time)
 {
+    clearTimeout(logoutTimer);
     timeToLogout = count_time;
     updateUI();
     if (count_time == 0) {
@@ -192,9 +183,9 @@ function getFlavor(letter) {
     }
 }
 
-function addCoffee(flavor) {
+function addCoffee(flavor, time = new Date()) {
     var data = JSON.stringify({
-        time: new Date().toISOString(),
+        time: time.toISOString(),
         flavor: flavor,
         uid: id_user
     });