Fix notifications in case of new corr move
[vchess.git] / client / src / views / Game.vue
index a61655a..d6c8599 100644 (file)
@@ -1,7 +1,7 @@
 <template lang="pug">
 main
-  input#modalChat.modal(type="checkbox" @click="resetChatColor")
-  div#chatWrap(role="dialog" data-checkbox="modalChat" aria-labelledby="inputChat")
+  input#modalChat.modal(type="checkbox" @click="resetChatColor()")
+  div#chatWrap(role="dialog" data-checkbox="modalChat")
     #chat.card
       label.modal-close(for="modalChat")
       #participants
@@ -17,10 +17,10 @@ main
       span.variant-info {{ game.vname }}
       button#chatBtn(onClick="doClick('modalChat')") Chat
       #actions(v-if="game.score=='*'")
-        button(@click="clickDraw" :class="{['draw-' + drawOffer]: true}")
+        button(@click="clickDraw()" :class="{['draw-' + drawOffer]: true}")
           | {{ st.tr["Draw"] }}
-        button(v-if="!!game.mycolor" @click="abortGame") {{ st.tr["Abort"] }}
-        button(v-if="!!game.mycolor" @click="resign") {{ st.tr["Resign"] }}
+        button(v-if="!!game.mycolor" @click="abortGame()") {{ st.tr["Abort"] }}
+        button(v-if="!!game.mycolor" @click="resign()") {{ st.tr["Resign"] }}
       #playersInfo
         p
           span.name(:class="{connected: isConnected(0)}")
@@ -30,8 +30,7 @@ main
           span.name(:class="{connected: isConnected(1)}")
             | {{ game.players[1].name || "@nonymous" }}
           span.time(v-if="game.score=='*'") {{ virtualClocks[1] }}
-  BaseGame(:game="game" :vr="vr" ref="basegame"
-    @newmove="processMove" @gameover="gameOver")
+  BaseGame(:game="game" :vr="vr" @newmove="processMove" @gameover="gameOver")
 </template>
 
 <script>
@@ -62,6 +61,7 @@ export default {
       },
       game: { //passed to BaseGame
         players:[{name:""},{name:""}],
+        chats: [],
         rendered: false,
       },
       virtualClocks: [0, 0], //initialized with true game.clocks
@@ -133,7 +133,11 @@ export default {
       if (!!this.conn && this.conn.readyState == 1) //1 == OPEN state
         callback();
       else //socket not ready yet (initial loading)
-        this.conn.onopen = callback;
+      {
+        // NOTE: it's important to call callback without arguments,
+        // otherwise first arg is Websocket object and loadGame fails.
+        this.conn.onopen = () => { return callback() };
+      }
     };
     if (!this.gameRef.rid) //game stored locally or on server
       this.loadGame(null, () => socketInit(this.roomInit));
@@ -339,13 +343,10 @@ export default {
           this.drawOffer = "received";
           break;
         case "newchat":
-        {
-          const chat = data.data;
-          this.newChat = chat;
+          this.newChat = data.data;
           if (!document.getElementById("modalChat").checked)
             document.getElementById("chatBtn").style.backgroundColor = "#c5fefe";
           break;
-        }
       }
     },
     socketCloseListener: function() {
@@ -419,6 +420,8 @@ export default {
         this.vr = new V(game.fen);
         const gtype = (game.cadence.indexOf('d') >= 0 ? "corr" : "live");
         const tc = extractTime(game.cadence);
+        if (!game.chats)
+          game.chats = []; //live games don't have chat history
         if (gtype == "corr")
         {
           if (game.players[0].color == "b")
@@ -537,7 +540,8 @@ export default {
         });
         if (this.repeat[repIdx] >= 3)
           this.drawOffer = "threerep";
-        callback();
+        if (!!callback)
+          callback();
       };
       if (!!game)
         return afterRetrieval(game);
@@ -552,8 +556,13 @@ export default {
         GameStorage.get(this.gameRef.id, afterRetrieval);
       }
     },
-    // Post-process a move (which was just played)
+    // Post-process a move (which was just played in BaseGame)
     processMove: function(move) {
+      if (this.game.type == "corr" && move.color == this.game.mycolor)
+      {
+        if (!confirm(this.st.tr["Move played:"] + " " + move.notation + "\n" + this.st.tr["Are you sure?"]))
+          return this.$set(this.game, "moveToUndo", move);
+      }
       // Update storage (corr or live) if I play in the game
       const colorIdx = ["w","b"].indexOf(move.color);
       const nextIdx = ["w","b"].indexOf(this.vr.turn);
@@ -678,6 +687,8 @@ export default {
       {
         GameStorage.update(this.gameRef.id,
           {score: score, scoreMsg: scoreMsg});
+        // Notify the score to main Hall. TODO: only one player (currently double send)
+        this.send("result", {gid:this.game.id, score:score});
       }
     },
   },
@@ -695,6 +706,9 @@ export default {
   color: grey
   font-style: italic
 
+#playersInfo > p
+  margin: 0
+
 @media screen and (min-width: 768px)
   #actions
     width: 300px
@@ -704,7 +718,7 @@ export default {
 
 #actions
   display: inline-block
-  margin-top: 10px
+  margin: 0
   button
     display: inline-block
     margin: 0
@@ -735,7 +749,7 @@ export default {
 
 #chat
   padding-top: 20px
-  max-width: 600px
+  max-width: 767px
   border: none;
 
 #chatBtn