/
githubmirror
/
socket.io
Обзор
Документация
Войти
/
githubmirror
/
socket.io
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
examples/private-messaging/src/components/Chat.vue
165 строк
4 KB
Damien Arrachequesne
docs(examples): 3rd part of the "private messaging" example
17 фев 2021, 02:22
Не верифицирован
17 фев 2021, 02:22
7247b40
Код
Авторство
О чём код?
<template> <div> <div class="left-panel"> <user v-for="user in users" :key="user.userID" :user="user" :selected="selectedUser === user" @select="onSelectUser(user)" /> </div> <message-panel v-if="selectedUser" :user="selectedUser" @input="onMessage" class="right-panel" /> </div> </template> <script> import socket from "../socket"; import User from "./User"; import MessagePanel from "./MessagePanel"; export default { name: "Chat", components: { User, MessagePanel }, data() { return { selectedUser: null, users: [], }; }, methods: { onMessage(content) { if (this.selectedUser) { socket.emit("private message", { content, to: this.selectedUser.userID, }); this.selectedUser.messages.push({ content, fromSelf: true, }); } }, onSelectUser(user) { this.selectedUser = user; user.hasNewMessages = false; }, }, created() { socket.on("connect", () => { this.users.forEach((user) => { if (user.self) { user.connected = true; } }); }); socket.on("disconnect", () => { this.users.forEach((user) => { if (user.self) { user.connected = false; } }); }); const initReactiveProperties = (user) => { user.hasNewMessages = false; }; socket.on("users", (users) => { users.forEach((user) => { user.messages.forEach((message) => { message.fromSelf = message.from === socket.userID; }); for (let i = 0; i < this.users.length; i++) { const existingUser = this.users[i]; if (existingUser.userID === user.userID) { existingUser.connected = user.connected; existingUser.messages = user.messages; return; } } user.self = user.userID === socket.userID; initReactiveProperties(user); this.users.push(user); }); // put the current user first, and sort by username this.users.sort((a, b) => { if (a.self) return -1; if (b.self) return 1; if (a.username < b.username) return -1; return a.username > b.username ? 1 : 0; }); }); socket.on("user connected", (user) => { for (let i = 0; i < this.users.length; i++) { const existingUser = this.users[i]; if (existingUser.userID === user.userID) { existingUser.connected = true; return; } } initReactiveProperties(user); this.users.push(user); }); socket.on("user disconnected", (id) => { for (let i = 0; i < this.users.length; i++) { const user = this.users[i]; if (user.userID === id) { user.connected = false; break; } } }); socket.on("private message", ({ content, from, to }) => { for (let i = 0; i < this.users.length; i++) { const user = this.users[i]; const fromSelf = socket.userID === from; if (user.userID === (fromSelf ? to : from)) { user.messages.push({ content, fromSelf, }); if (user !== this.selectedUser) { user.hasNewMessages = true; } break; } } }); }, destroyed() { socket.off("connect"); socket.off("disconnect"); socket.off("users"); socket.off("user connected"); socket.off("user disconnected"); socket.off("private message"); }, }; </script> <style scoped> .left-panel { position: fixed; left: 0; top: 0; bottom: 0; width: 260px; overflow-x: hidden; background-color: #3f0e40; color: white; } .right-panel { margin-left: 260px; } </style>