Fix parseInt() usage, rename Doubleorda --> Ordamirror, implement Clorange variant
[vchess.git] / client / src / views / Hall.vue
index 133a5f9..451299b 100644 (file)
@@ -113,7 +113,7 @@ main
             v-for="sid in Object.keys(people)"
             v-if="!!people[sid].name"
           )
-            span {{ people[sid].name }}
+            UserBio.user-bio(:uid="people[sid].id" :uname="people[sid].name")
             button.player-action(
               v-if="isGamer(sid)"
               @click="watchGame(sid)"
@@ -166,7 +166,7 @@ main
           button.tabbtn#btnClive(@click="setDisplay('c','live',$event)")
             | {{ st.tr["Live challenges"] }}
           button.tabbtn#btnCcorr(@click="setDisplay('c','corr',$event)")
-            | {{ st.tr["Correspondance challenges"] }}
+            | {{ st.tr["Correspondence challenges"] }}
         ChallengeList(
           v-show="cdisplay=='live'"
           :challenges="filterChallenges('live')"
@@ -182,7 +182,7 @@ main
           button.tabbtn#btnGlive(@click="setDisplay('g','live',$event)")
             | {{ st.tr["Live games"] }}
           button.tabbtn#btnGcorr(@click="setDisplay('g','corr',$event)")
-            | {{ st.tr["Correspondance games"] }}
+            | {{ st.tr["Correspondence games"] }}
         GameList(
           v-show="gdisplay=='live'"
           :games="filterGames('live')"
@@ -212,6 +212,7 @@ import params from "@/parameters";
 import { getRandString, shuffle, randInt } from "@/utils/alea";
 import { getDiagram } from "@/utils/printDiagram";
 import Chat from "@/components/Chat.vue";
+import UserBio from "@/components/UserBio.vue";
 import GameList from "@/components/GameList.vue";
 import ChallengeList from "@/components/ChallengeList.vue";
 import { GameStorage } from "@/utils/gameStorage";
@@ -220,6 +221,7 @@ export default {
   name: "my-hall",
   components: {
     Chat,
+    UserBio,
     GameList,
     ChallengeList
   },
@@ -238,12 +240,12 @@ export default {
       infoMessage: "",
       newchallenge: {
         fen: "",
-        vid: parseInt(localStorage.getItem("vid")) || 0,
+        vid: parseInt(localStorage.getItem("vid"), 10) || 0,
         to: "", //name of challenged player (if any)
         cadence: localStorage.getItem("cadence") || "",
         randomness:
           // Warning: randomness can be 0, then !!randomness is false
-          (parseInt(localStorage.getItem("challRandomness"))+1 || 3) - 1,
+          (parseInt(localStorage.getItem("challRandomness"),10)+1 || 3) - 1,
         // VariantRules object, stored to not interfere with
         // diagrams of targetted challenges:
         V: null,
@@ -572,14 +574,12 @@ export default {
         }
       });
       const gid = gids[Math.floor(Math.random() * gids.length)];
-      const game = this.games.find(g => g.id == gid);
-      if (!!game) this.showGame(game);
-      else this.$router.push("/game/" + gid); //game vs. me
+      window.open("/#/game/" + gid, "_blank");
     },
     showGame: function(g) {
       // NOTE: we are an observer, since only games I don't play are shown here
       // ==> Moves sent by connected remote player(s) if live game
-      this.$router.push("/game/" + g.id);
+      window.open("/#/game/" + g.id, "_blank");
     },
     toggleSocialColor: function(action) {
       if (!action && document.getElementById("modalPeople").checked)
@@ -822,12 +822,13 @@ export default {
           // Ignore games where I play (will go in MyGames page),
           // and also games that I already received.
           if (
+            this.games.findIndex(g => g.id == game.id) == -1 &&
             game.players.every(p => {
               return (
                 p.sid != this.st.user.sid &&
                 (p.id == 0 || p.id != this.st.user.id)
               );
-            }) && this.games.findIndex(g => g.id == game.id) == -1
+            })
           ) {
             let newGame = game;
             newGame.type = this.classifyObject(game);
@@ -837,6 +838,7 @@ export default {
               newGame.score = "*";
             this.games.push(newGame);
             if (
+              newGame.score == '*' &&
               (newGame.type == "live" && this.gdisplay == "corr") ||
               (newGame.type == "corr" && this.gdisplay == "live")
             ) {
@@ -859,7 +861,7 @@ export default {
             this.startNewGame(gameInfo);
           else {
             this.infoMessage =
-              this.st.tr["New correspondance game:"] + " " +
+              this.st.tr["New correspondence game:"] + " " +
               "<a href='#/game/" + gameInfo.id + "'>" +
               "#/game/" + gameInfo.id + "</a>";
             document.getElementById("modalInfo").checked = true;
@@ -888,7 +890,8 @@ export default {
               if (
                 this.cursor == Number.MAX_SAFE_INTEGER &&
                 this.games.length == 0 &&
-                this.gdisplay == "live"
+                this.gdisplay == "live" &&
+                res.games.some(g => g.score == '*')
               ) {
                 // First loading: show indicators
                 document
@@ -994,7 +997,7 @@ export default {
       if (!this.newchallenge.vid)
         error = this.st.tr["Please select a variant"];
       else if (ctype == "corr" && this.st.user.id <= 0)
-        error = this.st.tr["Please log in to play correspondance games"];
+        error = this.st.tr["Please log in to play correspondence games"];
       else if (!!this.newchallenge.to) {
         if (this.newchallenge.to == this.st.user.name)
           error = this.st.tr["Self-challenge is forbidden"];
@@ -1102,7 +1105,7 @@ export default {
         // Live challenges have a random ID
         finishAddChallenge(null);
       } else {
-        // Correspondance game: send challenge to server
+        // Correspondence game: send challenge to server
         ajax(
           "/challenges",
           "POST",
@@ -1287,13 +1290,13 @@ export default {
         () => {
           const myIdx = (game.players[0].sid == this.st.user.sid ? 0 : 1);
           GameStorage.add(game, (err) => {
-            // If an error occurred, game is not added: a tab already
-            // added the game. Maybe a focused one, maybe not.
-            // We know for sure that it emitted the gong start sound.
-            // ==> Do not play it again.
-            if (!err && this.st.settings.sound)
-              new Audio("/sounds/newgame.flac").play().catch(() => {});
+            // If an error occurred, game is not added: the focused tab
+            // already added the game.
             if (!this.focus) {
+              if (this.st.settings.sound)
+                // This will be played several times if several hidden tabs
+                // on Hall... TODO: fix that (how ?!)
+                new Audio("/sounds/newgame.flac").play().catch(() => {});
               notify(
                 "New live game",
                 { body: "vs " + game.players[1-myIdx].name || "@nonymous" }
@@ -1302,7 +1305,7 @@ export default {
             this.$router.push("/game/" + gameInfo.id);
           });
         },
-        this.focus ? 500 + 1000 * Math.random() : 0
+        this.focus ? 0 : 500 + 1000 * Math.random()
       );
     }
   }
@@ -1311,7 +1314,7 @@ export default {
 
 <style lang="sass" scoped>
 .active
-  color: #42a983
+  color: #388e3c
 
 #infoDiv > .card
   padding: 15px 0
@@ -1365,7 +1368,7 @@ button.player-action
   margin-left: 32px
 
 .somethingnew
-  background-color: #c5fefe !important
+  background-color: #90C4EC !important
 
 .tabbtn
   background-color: #f9faee
@@ -1399,6 +1402,9 @@ button.refuseBtn
   #div2, #div3
     margin-top: 0
 
+.user-bio
+  display: inline
+
 tr > td
   &.random-0
     background-color: #FF5733