diff --git a/games-vue-client/src/App.vue b/games-vue-client/src/App.vue index 31d2e215..4dcf4937 100644 --- a/games-vue-client/src/App.vue +++ b/games-vue-client/src/App.vue @@ -38,6 +38,7 @@ + + + + + + {{ chat.chatName }} + + + + + + + Chat {{ currentChat.chatName }} + + + + mdi-close + + + + + + + + + {{ message.from }} + + {{ message.message }} + + + + + + + + + + Chat + + + + + diff --git a/games-vue-client/src/components/chat/chatStore.js b/games-vue-client/src/components/chat/chatStore.js new file mode 100644 index 00000000..ae5a714f --- /dev/null +++ b/games-vue-client/src/components/chat/chatStore.js @@ -0,0 +1,90 @@ +import Vue from "vue"; + +import Socket from "@/socket"; + +const chatStore = { + namespaced: true, + state: { + chats: { + 'server': { + chatId: 'server', + chatName: 'server', + users: [], + messages: [], + }, + } + }, + getters: { + chats: state => { return state.chats } + }, + mutations: { + addChat(state, data) { + const { chatId, users } = data; + Vue.set(state.chats, chatId, { + chatId, + chatName: chatId.replace("game-", ""), + users, + messages: [], + }); + }, + removeChat(state, data) { + const { chatId } = data; + Vue.delete(state.chats, chatId); + }, + addUserToChat(state, data) { + const { chatId, user } = data; + const chat = state.chats[chatId]; + chat.users.push(user); + }, + removeUserFromChat(state, data) { + const { chatId, user } = data; + const chat = state.chats[chatId]; + chat.users = chat.users.filter(existingUser => existingUser.playerId !== user.playerId) + }, + addMessageToChat(state, data) { + const { chatId, message, from, date } = data; + const chat = state.chats[chatId]; + chat.messages.push({ message, from, date }); + }, + }, + actions: { + join(context, data) { + const { chatId } = data.chat; + // context.commit("addChat", { chatId, users: [] }); + Socket.route(`chat/${chatId}/join`, {}); + }, + leave(context, data) { + const { chatId } = data.chat; + // context.commit("removeChat", { chatId }); + Socket.route(`chat/${chatId}/leave`, {}); + }, + message(context, data) { + const { chatId, message } = data.chat; + // context.commit("addMessageToChat", { chatId, from: 'Santa', message, date: Date.now() }); + Socket.route(`chat/${chatId}/message`, { message }); + }, + onSocketMessage(context, data) { + if (data.type === "Chat") { + if (data.chat === "join") { + const { chatId, user, users } = data; + if (user) { + context.commit("addUserToChat", { chatId, user }); + } else if (users) { + context.commit("addChat", { chatId, users }); + } + } + if (data.chat === "leave") { + context.commit("removeChat", data); + } + if (data.chat === "left") { + context.commit("removeUserFromChat", data); + } + if (data.chat === "message") { + context.commit("addMessageToChat", data); + } + } + } + } +}; + +export default chatStore; diff --git a/games-vue-client/src/components/lobby/LobbyGameType.vue b/games-vue-client/src/components/lobby/LobbyGameType.vue index 7d23a3dc..0d2ed20c 100644 --- a/games-vue-client/src/components/lobby/LobbyGameType.vue +++ b/games-vue-client/src/components/lobby/LobbyGameType.vue @@ -21,6 +21,12 @@ > New Game + + Chat + Users @@ -96,7 +102,10 @@ export default { }, invite(gameType, playerId) { Socket.route("invites/invite", { gameType: gameType, invite: [playerId] }); - } + }, + joinChat(gameType) { + this.$store.dispatch("chat/join", { chat: { chatId: `game-${gameType}` } }); + }, }, computed: { gameTypeCssName() { diff --git a/games-vue-client/src/store.js b/games-vue-client/src/store.js index deff3ebe..2c41d268 100644 --- a/games-vue-client/src/store.js +++ b/games-vue-client/src/store.js @@ -3,6 +3,7 @@ import Vuex from "vuex"; import supportedGames from "@/supportedGames" import Socket from "@/socket"; import lobbyStore from "./components/lobby/lobbyStore"; +import chatStore from "./components/chat/chatStore"; import router from "@/router/index"; import settingsStore from "./components/settings/settingsStore"; @@ -13,6 +14,7 @@ let titlePrefix = "Zomis' Games" const store = new Vuex.Store({ modules: { lobby: lobbyStore, + chat: chatStore, settings: settingsStore, ...supportedGames.storeModules() }, @@ -97,6 +99,9 @@ const store = new Vuex.Store({ if (data.type.startsWith("Invite") || data.type.startsWith("Lobby") || data.type === 'GameStarted') { context.dispatch("lobby/onSocketMessage", data); } + if (data.type === "Chat") { + context.dispatch("chat/onSocketMessage", data); + } if (data.gameType) { let game = supportedGames.games[data.gameType] if (game.dsl) {