Attempt for better connection indicators
[vchess.git] / client / src / views / Hall.vue
index 4d830bb..d113da7 100644 (file)
@@ -73,10 +73,14 @@ main
           )
         fieldset(v-if="st.user.id > 0")
           label(for="selectPlayers") {{ st.tr["Play with"] }}
-          select#selectPlayersInList(v-model="newchallenge.to")
+          select#selectPlayersInList(
+            v-model="newchallenge.to"
+            @change="changeChallTarget()"
+          )
             option(value="")
             option(
               v-for="p in Object.values(people)"
+              v-if="!!p.name"
               :value="p.name"
             )
               | {{ p.name }}
@@ -263,9 +267,14 @@ export default {
       });
       if (!this.newchallenge.V && this.newchallenge.vid > 0)
         this.loadNewchallVariant();
+    },
+    $route: function(to, from) {
+      if (to.path != "/") this.cleanBeforeDestroy();
     }
   },
   created: function() {
+    document.addEventListener('visibilitychange', this.visibilityChange);
+    window.addEventListener("beforeunload", this.cleanBeforeDestroy);
     if (this.st.variants.length > 0 && this.newchallenge.vid > 0)
       this.loadNewchallVariant();
     const my = this.st.user;
@@ -296,11 +305,10 @@ export default {
       encodeURIComponent(this.$route.path);
     this.conn = new WebSocket(this.connexionString);
     this.conn.onopen = connectAndPoll;
-    this.conn.onmessage = this.socketMessageListener;
-    this.conn.onclose = this.socketCloseListener;
+    this.conn.addEventListener("message", this.socketMessageListener);
+    this.conn.addEventListener("close", this.socketCloseListener);
   },
   mounted: function() {
-    document.addEventListener('visibilitychange', this.visibilityChange);
     ["peopleWrap", "infoDiv", "newgameDiv"].forEach(eltName => {
       document.getElementById(eltName)
         .addEventListener("click", processModalClick);
@@ -384,10 +392,14 @@ export default {
     );
   },
   beforeDestroy: function() {
-    document.removeEventListener('visibilitychange', this.visibilityChange);
-    this.send("disconnect");
+    this.cleanBeforeDestroy();
   },
   methods: {
+    cleanBeforeDestroy: function() {
+      document.removeEventListener('visibilitychange', this.visibilityChange);
+      window.removeEventListener("beforeunload", this.cleanBeforeDestroy);
+      this.send("disconnect");
+    },
     getRandomnessClass: function(pc) {
       return {
         ["random-" + pc.randomness]: true
@@ -453,6 +465,13 @@ export default {
       if (!!this.curChallToAccept.fen) return { "margin-top": "10px" };
       return {};
     },
+    changeChallTarget: function() {
+      if (!this.newchallenge.to) {
+        // Reset potential FEN + diagram
+        this.newchallenge.fen = "";
+        this.newchallenge.diag = "";
+      }
+    },
     cadenceFocusIfOpened: function() {
       if (event.target.checked)
         document.getElementById("cadence").focus();
@@ -594,8 +613,11 @@ export default {
             this.people[data.from] = { pages: [{ path: page, focus: true }] };
           else {
             // Append page if not already in list
-            if (!(this.people[data.from].pages.find(p => p.path == page)))
+            let ppage = this.people[data.from].pages.find(p => p.path == page);
+            if (!ppage)
               this.people[data.from].pages.push({ path: page, focus: true });
+            else ppage.focus = true;
+            this.$forceUpdate(); //TODO: shouldn't be required
           }
           if (!this.people[data.from].name && this.people[data.from].id !== 0) {
             // Identity not known yet
@@ -614,6 +636,7 @@ export default {
           ArrayFun.remove(this.people[data.from].pages, p => p.path == page);
           if (this.people[data.from].pages.length == 0)
             this.$delete(this.people, data.from);
+          else this.$forceUpdate(); //TODO: shouldn't be required
           // Disconnect means no more tmpIds:
           if (data.code == "disconnect") {
             // Remove the live challenges sent by this player:
@@ -653,6 +676,8 @@ export default {
           break;
         case "killed":
           // I logged in elsewhere:
+          this.conn.removeEventListener("message", this.socketMessageListener);
+          this.conn.removeEventListener("close", this.socketCloseListener);
           this.conn = null;
           alert(this.st.tr["New connexion detected: tab now offline"]);
           break;
@@ -901,7 +926,7 @@ export default {
           position: parsedFen.position,
           orientation: parsedFen.turn
         });
-      }
+      } else this.newchallenge.diag = "";
     },
     newChallFromPreset(pchall) {
       this.partialResetNewchallenge();
@@ -1190,7 +1215,6 @@ export default {
           // Game state (including FEN): will be updated
           moves: [],
           clocks: [-1, -1], //-1 = unstarted
-          initime: [0, 0], //initialized later
           score: "*"
         }
       );