X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FMyGames.vue;h=c1430f89bb278b5cd626f525fc16baac765d26e0;hb=f9c36b2da005b596ad656f4b6cc4e09ef3c656f1;hp=41cced56f55d8ba78c1d85fe1f6fb8b0ef656483;hpb=e2590fa82708a57d89b3c60266b2eb1a6e31a9ce;p=vchess.git diff --git a/client/src/views/MyGames.vue b/client/src/views/MyGames.vue index 41cced56..c1430f89 100644 --- a/client/src/views/MyGames.vue +++ b/client/src/views/MyGames.vue @@ -23,6 +23,8 @@ main import { store } from "@/store"; import { GameStorage } from "@/utils/gameStorage"; import { ajax } from "@/utils/ajax"; +import params from "@/parameters"; +import { getRandString } from "@/utils/alea"; import GameList from "@/components/GameList.vue"; export default { name: "my-my-games", @@ -34,11 +36,13 @@ export default { st: store.state, display: "live", liveGames: [], - corrGames: [] + corrGames: [], + conn: null, + connexionString: "" }; }, created: function() { - GameStorage.getAll(localGames => { + GameStorage.getAll(true, localGames => { localGames.forEach(g => (g.type = this.classifyObject(g))); this.liveGames = localGames; }); @@ -48,17 +52,33 @@ export default { this.corrGames = res.games; }); } + // Initialize connection + this.connexionString = + params.socketUrl + + "/?sid=" + + this.st.user.sid + + "&tmpId=" + + getRandString() + + "&page=" + + encodeURIComponent(this.$route.path); + this.conn = new WebSocket(this.connexionString); + this.conn.onmessage = this.socketMessageListener; + this.conn.onclose = this.socketCloseListener; }, mounted: function() { const showType = localStorage.getItem("type-myGames") || "live"; this.setDisplay(showType); }, + beforeDestroy: function() { + this.conn.send(JSON.stringify({code: "disconnect"})); + }, methods: { setDisplay: function(type, e) { this.display = type; localStorage.setItem("type-myGames", type); let elt = e ? e.target : document.getElementById(type + "Games"); elt.classList.add("active"); + elt.classList.remove("somethingnew"); //in case of if (elt.previousElementSibling) elt.previousElementSibling.classList.remove("active"); else elt.nextElementSibling.classList.remove("active"); @@ -69,6 +89,30 @@ export default { }, showGame: function(g) { this.$router.push("/game/" + g.id); + }, + socketMessageListener: function(msg) { + const data = JSON.parse(msg.data); + if (data.code == "changeturn") { + let games = !!parseInt(data.gid) + ? this.corrGames + : this.liveGames; + // NOTE: new move itself is not received, because it wouldn't be used. + let g = games.find(g => g.id == data.gid); + this.$set(g, "movesCount", g.movesCount + 1); + if ( + (g.type == "live" && this.display == "corr") || + (g.type == "corr" && this.display == "live") + ) { + document + .getElementById(g.type + "Games") + .classList.add("somethingnew"); + } + } + }, + socketCloseListener: function() { + this.conn = new WebSocket(this.connexionString); + this.conn.addEventListener("message", this.socketMessageListener); + this.conn.addEventListener("close", this.socketCloseListener); } } }; @@ -83,4 +127,7 @@ export default { table.game-list max-height: 100% + +.somethingnew + background-color: #c5fefe !important