Fix 1st move clocks don't move + add message to indicate that corr game started ...
[vchess.git] / client / src / views / Hall.vue
index fb3ed63..dadb597 100644 (file)
@@ -1,5 +1,11 @@
 <template lang="pug">
 main
+  input#modalInfo.modal(type="checkbox")
+  div(role="dialog" aria-labelledby="infoMessage")
+    .card.smallpad.small-modal.text-center
+      label.modal-close(for="modalInfo")
+      h3#infoMessage.section
+        p New game started: #[a(href="/game/" + {{ newGameId }})]
   input#modalNewgame.modal(type="checkbox")
   div(role="dialog" aria-labelledby="titleFenedit")
     .card.smallpad
@@ -85,6 +91,7 @@ export default {
       games: [],
       challenges: [],
       people: [], //(all) online players
+      newGameId: 0,
       newchallenge: {
         fen: "",
         vid: 0,
@@ -93,6 +100,20 @@ export default {
       },
     };
   },
+  watch: {
+    // st.variants changes only once, at loading from [] to [...]
+    "st.variants": function(variantArray) {
+      // Set potential challenges and games variant names:
+      this.challenges.forEach(c => {
+        if (c.vname == "")
+          c.vname = this.getVname(c.vid);
+      });
+      this.games.forEach(g => {
+        if (g.vname == "")
+          g.vname = this.getVname(g.vid)
+      });
+    },
+  },
   computed: {
     uniquePlayers: function() {
       // Show e.g. "@nonymous (5)", and do nothing on click on anonymous
@@ -148,8 +169,10 @@ export default {
           const uids = response.challenges.map(c => { return c.uid });
           ajax("/users",
             "GET",
-            { ids: uids },
-            names => {
+            { ids: uids.join(",") },
+            response2 => {
+              let names = {};
+              response2.users.forEach(u => {names[u.id] = u.name});
               this.challenges = this.challenges.concat(
                 response.challenges.map(c => {
                   // (just players names in fact)
@@ -207,7 +230,7 @@ export default {
     // TODO: ...filter(...)[0].name, one-line, just remove this function
     getVname: function(vid) {
       const vIdx = this.st.variants.findIndex(v => v.id == vid);
-      return this.st.variants[vIdx].name;
+      return vIdx >= 0 ? this.st.variants[vIdx].name : "";
     },
     getSid: function(pname) {
       const pIdx = this.people.findIndex(pl => pl.name == pname);
@@ -360,7 +383,10 @@ export default {
             this.startNewGame(data.gameInfo);
           else
           {
-            // TODO: notify with game link but do not redirect
+            this.newGameId = data.gameInfo.gameId;
+            let modalBox = document.getElementById("modalInfo");
+            modalBox.checked = true;
+            setTimeout(() => { modalBox.checked = false; }, 2500);
           }
           break;
         }
@@ -480,7 +506,7 @@ export default {
         }
         if (c.accepted)
         {
-          c.seat = this.people[0]; //avoid sending email
+          c.seat = this.people[0]; //== this.st.user, avoid revealing email
           this.launchGame(c);
         }
         else
@@ -490,15 +516,17 @@ export default {
             cid: c.id, target: c.from.sid}));
         }
       }
-      else
-        localStorage.removeItem("challenge");
-      if (c.type == "corr")
+      else //my challenge
       {
-        ajax(
-          "/challenges",
-          "DELETE",
-          {id: c.id}
-        );
+        localStorage.removeItem("challenge");
+        if (c.type == "corr")
+        {
+          ajax(
+            "/challenges",
+            "DELETE",
+            {id: c.id}
+          );
+        }
       }
     },
     // NOTE: when launching game, the challenge is already deleted
@@ -514,8 +542,18 @@ export default {
         vid: c.vid,
         timeControl: c.timeControl,
       };
-      this.st.conn.send(JSON.stringify({code:"newgame",
-        gameInfo:gameInfo, target:c.from.sid, cid:c.id}));
+      let target = c.from.sid; //may not be defined if corr + offline opp
+      if (!target)
+      {
+        const opponent = this.people.find(p => p.id == c.from.id);
+        if (!!opponent)
+          target = opponent.sid
+      }
+      if (!!target) //opponent is online
+      {
+        this.st.conn.send(JSON.stringify({code:"newgame",
+          gameInfo:gameInfo, target:target, cid:c.id}));
+      }
       if (c.type == "live")
         this.startNewGame(gameInfo);
       else //corr: game only on server
@@ -523,9 +561,9 @@ export default {
         ajax(
           "/games",
           "POST",
-          {gameInfo: gameInfo}
+          {gameInfo: gameInfo, cid: c.id}, //cid useful to delete challenge
+          response => { this.$router.push("/game/" + response.gameId); }
         );
-        // TODO: redirection here
       }
     },
     // NOTE: for live games only (corr games start on the server)
@@ -533,6 +571,7 @@ export default {
       const game = Object.assign({}, gameInfo, {
         // (other) Game infos: constant
         fenStart: gameInfo.fen,
+        created: Date.now(),
         // Game state (including FEN): will be updated
         moves: [],
         clocks: [-1, -1], //-1 = unstarted