]> rtime.felk.cvut.cz Git - coffee/coffee-flask.git/blob - templates/main.js
Use new data structure for offline-collected data
[coffee/coffee-flask.git] / templates / main.js
1 var flask = "{{ url_for('hello', _external=True) }}"
2
3 // State variables
4
5 var updateRemote = undefined;   // defined iff remote server accessible
6 var timeToLogout = undefined;   // defined during logout countdown
7 var logoutTimer;
8 var reloadTimer = undefined;
9 var id_user;                    // ID of the user who is to be accounted for the next coffee
10
11 console.log("hello from flask");
12 //sendJSON("{\"type\":\"empty\"}");
13
14 function update(id, msg) {
15     document.getElementById(id).innerHTML = msg;
16 }
17
18 function replayOfflineQueue() {
19     if (localStorage) {
20         let queue = JSON.parse(localStorage.getItem("offlineQueue")) || [];
21         if (Array.isArray(queue)) {
22             queue.forEach(function (entry) {
23                 updateRemote(entry.data);
24             });
25             localStorage.removeItem("offlineQueue");
26         }
27     }
28 }
29
30 var flavorChosen;
31
32 // Central function to update UI elements. To ensure that the UI is
33 // consistent, other code should only change state variables and then
34 // call this function. This function updates the UI to match the state.
35 function updateUI()
36 {
37     if (updateRemote === undefined) {
38         update("remote", "<center>Server offline...</center>");
39         document.getElementById("local").style.display = "block";
40         loadRemote();
41     } else {
42         document.getElementById("local").style.display = "none";
43
44         if (id_user !== undefined) {
45             document.getElementById("nextStep").innerHTML = "Now select a beverage on the coffee machineā€¦";
46         } else {
47             document.getElementById("nextStep").innerHTML = "Enjoy your " + flavorChosen + "!";
48         }
49
50         if (timeToLogout !== undefined)
51             document.getElementById("logout_button").innerHTML = '<br>logout<br>(' + timeToLogout + ' s)';
52     }
53 }
54
55 function hiddenUpdateRemote(json) {
56     var msg = JSON.parse(json);
57
58     switch(msg.type) {
59         case "empty":
60             break;
61         case "rfid":
62             login(msg.uid);
63             break;
64         case "keys":
65             var flavor = getFlavor(msg.key);
66             if (flavor !== "") {
67                 addCoffee(flavor);
68             }
69             break;
70         case "fuck":
71             ajax(msg.method, msg.route, msg.data, msg.id);
72             break;
73     }
74     sendLog(json);
75 }
76
77 function loadRemote(string) {
78     var xhr = new XMLHttpRequest();
79     xhr.onreadystatechange = function() {
80         if (this.readyState == 4) {
81             if (this.status == 200) {
82                 update("remote", this.responseText);
83                 updateRemote = hiddenUpdateRemote;
84                 replayOfflineQueue();
85                 updateUI();
86                 clearTimeout(reloadTimer);
87             } else {
88                 reloadTimer = setTimeout(loadRemote, 1000);
89             }
90         }
91     };
92     xhr.open("GET", flask, true);
93     xhr.send();
94 }
95
96 loadRemote();
97
98 function ajax(method, route, data, id) {
99     var now = Date.now();
100     var xhr = new XMLHttpRequest();
101     xhr.onreadystatechange = function() {
102         if (this.readyState == 4) {
103             if (this.status == 200) {
104                 update(id, this.responseText);
105                 updateUI();
106             } else {
107                 updateRemote = undefined;
108                 updateUI();
109
110                 if (localStorage) {
111                     var fuck = JSON.stringify({
112                         type: "fuck",
113                         method: method,
114                         route: route,
115                         data: data,
116                         id: id
117                     });
118                     let queue = JSON.parse(localStorage.getItem("offlineQueue")) || [];
119                     queue.push({ time: Date.now(), data: fuck });
120                     try {
121                         localStorage.setItem("offlineQueue", JSON.stringify(queue));
122                     }
123                     catch (err) {
124                         console.log(err);
125                     }
126                 }
127             }
128         }
129     };
130     xhr.open(method, flask + route, true);
131     xhr.withCredentials = true;
132     xhr.setRequestHeader("Content-type", "application/json");
133     if (method === "POST") {
134         xhr.send(data);
135     } else {
136         xhr.send();
137     }
138 }
139
140
141 function login(id) {
142     ajax("POST", "login", id, "user");
143     id_user = id;
144     clearTimeout(logoutTimer);
145     timeToLogout = undefined;
146 }
147
148 function logout() {
149     sendReset();
150     ajax("GET", "logout", "", "user");
151     id_user = undefined;
152     timeToLogout = undefined;
153 }
154
155 function countingTimeLogout(count_time)
156 {
157     timeToLogout = count_time;
158     updateUI();
159     if (count_time == 0) {
160         logout();
161     } else {
162         logoutTimer = setTimeout(function() { countingTimeLogout(count_time - 1); }, 1000);
163     }
164 }
165
166 function renameUser() {
167     ajax("GET", "user/rename?name=" +  document.getElementById("username").value, "", "user");
168 }
169
170 function getFlavor(letter) {
171     switch (letter) {
172         case "E": return "espresso";
173         case "C": return "cappuccino";
174         case "B": return "latte macchiato";
175         case "D": return "espresso lungo";
176         default: return "";
177     }
178 }
179
180 function addCoffee(flavor) {
181     var data = JSON.stringify({
182         time: new Date().toISOString(),
183         flavor: flavor,
184         uid: id_user
185     });
186     if (id_user) {
187         ajax("POST", "coffee/add", data, "user");
188         flavorChosen = flavor;
189         id_user = undefined;
190         countingTimeLogout(10); //mean 10 seconds
191     }
192 }
193
194 function sendLog(json) {
195     ajax("POST", "log", json, "log");
196 }