--- /dev/null
+// TODO: myname, opppnents (optional, different style), people
+// --> also show messages like "X offers draw ?" (probably not)
+// myname: localStorage["username"] || "anonymous",
+Vue.component("my-chat", {
+ props: ["conn","myname","opponents","people"],
+ data: function() {
+ return {
+ chats: [], //chat messages after human game
+ };
+ },
+ // TODO: Chat modal sur petit écran, dans la page pour grand écran
+ template: `
+ <div>
+ <input id="modal-chat" type="checkbox" class="modal">
+ <div role="dialog" aria-labelledby="titleChat">
+ <div class="card smallpad">
+ <label id="close-chat" for="modal-chat" class="modal-close"></label>
+ <h3 v-if="!!opponents" id="titleChat" class="section">
+ <span>{{ translate("Chat with ") }}</span>
+ <span v-for="o in opponents">{{ o.name }}</span>
+ </h3>
+ <p v-for="chat in chats" :class={
+ "my-chatmsg": "chat.uid==user.id",
+ "opp-chatmsg": "opponents.any(o => o.id == chat.uid)"}
+ v-html="chat.msg"
+ >
+ TODO: why chat.msg fails here?
+ </p>
+ <input id="input-chat" type="text" placeholder="translate('Type here')"
+ @keyup.enter="sendChat"/>
+ <button id="sendChatBtn" @click="sendChat">{{ translate("Send") }}</button>
+ </div>
+ </div>
+ </div>
+ `,
+ created: function() {
+ const socketMessageListener = msg => {
+ const data = JSON.parse(msg.data);
+ switch (data.code)
+ {
+ case "newchat":
+ // TODO: new chat just arrived: data contain all informations
+ // (uid, name, message; no need for timestamp, we can use local time here)
+ this.chats.push({msg:data.msg, author:this.oppid});
+ break;
+ // TODO: distinguish these (dis)connect events from their analogs in game.js
+ // TODO: implement and harmonize: opponents and people are arrays, not objects ?!
+ case "connect":
+ this.players.push({name:data.name, id:data.uid});
+ break;
+ case "disconnect":
+ const pIdx = this.players.findIndex(p => p.id == data.uid);
+ this.players.splice(pIdx);
+ break;
+ }
+ };
+ const socketCloseListener = () => {
+ this.conn.addEventListener('message', socketMessageListener);
+ this.conn.addEventListener('close', socketCloseListener);
+ };
+ this.conn.onmessage = socketMessageListener;
+ this.conn.onclose = socketCloseListener;
+ },
+ methods: {
+ translate: translate,
+ // TODO: complete this component
+ sendChat: function() {
+ let chatInput = document.getElementById("input-chat");
+ const chatTxt = chatInput.value;
+ chatInput.value = "";
+ this.chats.push({msg:chatTxt, author:this.myid});
+ this.conn.send(JSON.stringify({
+ code:"newchat", oppid: this.oppid, msg: chatTxt}));
+ },
+// startChat: function(e) {
+// document.getElementById("modal-chat").checked = true;
+// },
+ },
+});