X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FHall.vue;h=fd4bd2da90c99220e84ab78916785ec256308360;hb=077ba3446c4ea3c6553c325fc8d16a96b7a9ff4f;hp=48fd68e6f6fa88adda2dfc91c0db66ba09fbc3a4;hpb=f5768809ae96cf4565c0bc3d2747ffc206837e20;p=vchess.git diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 48fd68e6..fd4bd2da 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -99,7 +99,7 @@ main button(@click="issueNewChallenge()") {{ st.tr["Send challenge"] }} input#modalPeople.modal( type="checkbox" - @click="resetSocialColor()" + @click="toggleSocialColor()" ) div#peopleWrap( role="dialog" @@ -135,7 +135,7 @@ main .row .col-sm-12.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2 .button-group - button#peopleBtn(@click="openModalPeople()") + button#peopleBtn(onClick="window.doClick('modalPeople')") | {{ st.tr["Who's there?"] }} button(@click="showNewchallengeForm()") | {{ st.tr["New game"] }} @@ -257,8 +257,7 @@ export default { connexionString: "", socketCloseListener: 0, // Related to (killing of) self multi-connects: - newConnect: {}, - killed: {} + newConnect: {} }; }, watch: { @@ -323,7 +322,13 @@ export default { ); }, mounted: function() { - ["peopleWrap", "infoDiv", "newgameDiv"].forEach(eltName => { + document.getElementById("peopleWrap") + .addEventListener("click", (e) => { + processModalClick(e, () => { + this.toggleSocialColor("close") + }); + }); + ["infoDiv", "newgameDiv"].forEach(eltName => { document.getElementById(eltName) .addEventListener("click", processModalClick); }); @@ -424,10 +429,6 @@ export default { ["random-" + pc.randomness]: true }; }, - openModalPeople: function() { - window.doClick("modalPeople"); - document.getElementById("inputChat").focus(); - }, anonymousCount: function() { let count = 0; Object.values(this.people).forEach(p => { @@ -481,7 +482,8 @@ export default { }, removePresetChall: function(e, pchall) { e.stopPropagation(); - const pchallIdx = this.presetChalls.findIndex(pc => pc.index == pchall.index); + const pchallIdx = + this.presetChalls.findIndex(pc => pc.index == pchall.index); this.presetChalls.splice(pchallIdx, 1); localStorage.setItem("presetChalls", JSON.stringify(this.presetChalls)); }, @@ -501,7 +503,7 @@ export default { document.getElementById("cadence").focus(); }, send: function(code, obj) { - if (!!this.conn) { + if (!!this.conn && this.conn.readyState == 1) { this.conn.send(JSON.stringify(Object.assign({ code: code }, obj))); } }, @@ -516,8 +518,10 @@ export default { filterGames: function(type) { return this.games.filter(g => g.type == type); }, + // o: challenge or game classifyObject: function(o) { - // o: challenge or game + // Consider imports as live games (TODO) + if (!!o.id && !!o.id.toString().match(/^i/)) return "live"; return o.cadence.indexOf("d") === -1 ? "live" : "corr"; }, setDisplay: function(letter, type, e) { @@ -544,7 +548,8 @@ export default { // This is meant to challenge people, thus the next 2 conditions: this.st.user.id > 0 && sid != this.st.user.sid && - Object.values(this.people[sid].tmpIds).some(v => v.focus && v.page == "/") + Object.values(this.people[sid].tmpIds) + .some(v => v.focus && v.page == "/") ); }, challenge: function(sid) { @@ -574,9 +579,11 @@ export default { // ==> Moves sent by connected remote player(s) if live game this.$router.push("/game/" + g.id); }, - resetSocialColor: function() { - // TODO: this is called twice, once on opening an once on closing - document.getElementById("peopleBtn").classList.remove("somethingnew"); + toggleSocialColor: function(action) { + if (!action && document.getElementById("modalPeople").checked) + document.getElementById("inputChat").focus(); + else + document.getElementById("peopleBtn").classList.remove("somethingnew"); }, processChat: function(chat) { this.send("newchat", { data: chat }); @@ -636,13 +643,13 @@ export default { const page = data.page || "/"; if (data.code == "connect") { // Ask challenges only on first connexion: - if (!this.people[data.from]) + if (!this.people[data.from[0]]) this.send("askchallenges", { target: data.from[0] }); } // Ask game only if live: else if (!page.match(/\/[0-9]+$/)) this.send("askgame", { target: data.from[0], page: page }); - if (!this.people[data.from]) { + if (!this.people[data.from[0]]) { this.$set( this.people, data.from[0], @@ -652,7 +659,8 @@ export default { } } ); - this.newConnect[data.from] = true; //for self multi-connects tests + // For self multi-connects tests: + this.newConnect[data.from[0]] = true; this.send("askidentity", { target: data.from[0], page: page }); } else { this.people[data.from[0]].tmpIds[data.from[1]] = @@ -663,8 +671,9 @@ export default { } case "disconnect": case "gdisconnect": { - // If the user reloads the page twice very quickly (experienced with Firefox), - // the first reload won't have time to connect but will trigger a "close" event anyway. + // If the user reloads the page twice very quickly + // (experienced with Firefox), the first reload won't have time to + // connect but will trigger a "close" event anyway. // ==> Next check is required. if (!this.people[data.from[0]]) return; delete this.people[data.from[0]].tmpIds[data.from[1]]; @@ -683,7 +692,7 @@ export default { const gid = data.page.match(/[a-zA-Z0-9]+$/)[0]; // Corr games are always reachable: if (!gid.match(/^[0-9]+$/)) { - // Live games are reachable as long as someone is on the game page + // Live games are reachable if someone is on the game page if (Object.values(this.people).every(p => Object.values(p.tmpIds).every(v => v.page != data.page)) ) { @@ -710,13 +719,6 @@ 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; case "askidentity": { // Request for identification const me = { @@ -739,16 +741,16 @@ export default { this.$forceUpdate(); // If I multi-connect, kill current connexion if no mark (I'm older) if (this.newConnect[user.sid]) { + delete this.newConnect[user.sid]; if ( user.id > 0 && user.id == this.st.user.id && - user.sid != this.st.user.sid && - !this.killed[this.st.user.sid] + user.sid != this.st.user.sid ) { - this.send("killme", { sid: this.st.user.sid }); - this.killed[this.st.user.sid] = true; + // I logged in elsewhere: + this.cleanBeforeDestroy(); + alert(this.st.tr["New connexion detected: tab now offline"]); } - delete this.newConnect[user.sid]; } break; } @@ -759,9 +761,9 @@ export default { c.from.sid == this.st.user.sid && c.type == "live" ) .map(c => { - // NOTE: in principle, should only send targeted challenge to the target. - // But we may not know yet the identity of the target (just name), - // so cannot decide if data.from is the target or not. + // NOTE: in principle, should only send targeted challenge to the + // target. But we may not know yet the identity of the target + // (just name), so can't decide if data.from is the target. return { id: c.id, from: this.st.user.sid, @@ -792,7 +794,8 @@ export default { case "deletechallenge_s": { // NOTE: the challenge(s) may be already removed const cref = data.data; - if (!!cref.cid) ArrayFun.remove(this.challenges, c => c.id == cref.cid); + if (!!cref.cid) + ArrayFun.remove(this.challenges, c => c.id == cref.cid); else if (!!cref.sids) { cref.sids.forEach(s => { ArrayFun.remove( @@ -923,6 +926,15 @@ export default { .getElementById("btnC" + newChall.type) .classList.add("somethingnew"); } + if (!!chall.to) { + notify( + "New challenge", + // fromValues.name should exist since the player is online, but + // let's consider there is some chance that the challenge arrives + // right after we connected and before receiving the poll result: + { body: "from " + (fromValues.name || "unknown yet...") } + ); + } } }, loadNewchallVariant: async function(cb) { @@ -1050,7 +1062,7 @@ export default { name: this.st.user.name }; chall.added = Date.now(); - // NOTE: vname and type are redundant (can be deduced from cadence + vid) + // NOTE: vname and type are redundant (deduced from cadence + vid) chall.type = ctype; chall.vname = this.newchallenge.vname; this.challenges.push(chall); @@ -1099,9 +1111,13 @@ export default { name: this.st.user.name }; this.launchGame(c); - if (c.type == "live") + if (c.type == "live") { // Remove all live challenges of both players - this.send("deletechallenge_s", { data: { sids: [c.from.sid, c.seat.sid] } }); + this.send( + "deletechallenge_s", + { data: { sids: [c.from.sid, c.seat.sid] } } + ); + } else // Corr challenge: just remove the challenge this.send("deletechallenge_s", { data: { cid: c.id } });