From 7ea39e9ecffb6c1ddd76657d3018ced1d30b3b70 Mon Sep 17 00:00:00 2001 From: Miroslav Pejic Date: Mon, 15 Nov 2021 11:55:14 +0100 Subject: [PATCH] [mirotalksfu] - add send private message --- app/src/Server.js | 9 +++---- public/css/Room.css | 6 +++-- public/images/message.png | Bin 0 -> 7540 bytes public/js/Room.js | 6 +++++ public/js/RoomClient.js | 49 ++++++++++++++++++++++++++++++++++---- 5 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 public/images/message.png diff --git a/app/src/Server.js b/app/src/Server.js index fe2add7..a095248 100644 --- a/app/src/Server.js +++ b/app/src/Server.js @@ -470,10 +470,11 @@ io.on('connection', (socket) => { socket.on('message', (data) => { log.debug('message', data); - roomList.get(socket.room_id).broadCast(socket.id, 'message', { - peer_name: data.peer_name, - peer_msg: data.peer_msg, - }); + if (data.to_peer_id == 'all') { + roomList.get(socket.room_id).broadCast(socket.id, 'message', data); + } else { + roomList.get(socket.room_id).sendTo(data.to_peer_id, 'message', data); + } }); socket.on('disconnect', () => { diff --git a/public/css/Room.css b/public/css/Room.css index f69148c..35f79d0 100644 --- a/public/css/Room.css +++ b/public/css/Room.css @@ -43,6 +43,7 @@ --wb-bg: linear-gradient(to left, #1f1e1e, #000000); --left-msg-bg: #222328; --right-msg-bg: #0a0b0c; + --private-msg-bg: #510717; --box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); --btns-hover-scale: scale(1.1); /* buttons bar horizontal */ @@ -334,7 +335,7 @@ body { color: #fff; } -.left-msg .private-msg-bubble { +.left-msg .msg-bubble-private { background: var(--private-msg-bg); border-bottom-left-radius: 0; color: #fff; @@ -354,7 +355,7 @@ body { color: #fff; } -.right-msg .private-msg-bubble { +.right-msg .msg-bubble-private { background: var(--private-msg-bg); border-bottom-right-radius: 0; color: #fff; @@ -377,6 +378,7 @@ body { background-size: cover; } +.msg-bubble-private, .msg-bubble { max-width: 200px; padding: 15px; diff --git a/public/images/message.png b/public/images/message.png new file mode 100644 index 0000000000000000000000000000000000000000..c12b38e1e97e2049e3b6094bf8df2d11c1d424e8 GIT binary patch literal 7540 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 aPgq6s-xT-x2+00ZJl`m3DAv5P2>Tz!KYJkn literal 0 HcmV?d00001 diff --git a/public/js/Room.js b/public/js/Room.js index 64c5991..d0b0fb2 100644 --- a/public/js/Room.js +++ b/public/js/Room.js @@ -21,6 +21,7 @@ const _PEER = { lowerHand: '', ejectPeer: '', sendFile: '', + sendMsg: '', }; let participantsCount = 0; @@ -1367,6 +1368,7 @@ async function getParticipantsTable(peers) { + `; table += ` @@ -1376,6 +1378,7 @@ async function getParticipantsTable(peers) { + `; @@ -1388,6 +1391,7 @@ async function getParticipantsTable(peers) { let peer_hand = peer_info.peer_hand ? _PEER.raiseHand : _PEER.lowerHand; let peer_eject = _PEER.ejectPeer; let peer_sendFile = _PEER.sendFile; + let peer_sendMsg = _PEER.sendMsg; let peer_id = peer_info.peer_id; if (rc.peer_id === peer_id) { table += ` @@ -1398,6 +1402,7 @@ async function getParticipantsTable(peers) { + `; } else { @@ -1408,6 +1413,7 @@ async function getParticipantsTable(peers) { + `; diff --git a/public/js/RoomClient.js b/public/js/RoomClient.js index 7f563f6..9a83754 100644 --- a/public/js/RoomClient.js +++ b/public/js/RoomClient.js @@ -21,6 +21,7 @@ const image = { users: '../images/participants.png', user: '../images/participant.png', youtube: '../images/youtube.png', + message: '../images/message.png', }; const mediaType = { @@ -1437,19 +1438,55 @@ class RoomClient { if (!peer_msg) return; let data = { peer_name: this.peer_name, + to_peer_id: 'all', peer_msg: peer_msg, }; console.log('Send message:', data); this.socket.emit('message', data); this.setMsgAvatar('right', this.peer_name); - this.appendMessage('right', this.rightMsgAvatar, this.peer_name, peer_msg); + this.appendMessage('right', this.rightMsgAvatar, this.peer_name, peer_msg, 'all'); chatMessage.value = ''; } + sendMessageTo(to_peer_id) { + if (!this.thereIsParticipants()) { + chatMessage.value = ''; + this.userLog('info', 'No participants in the room expect you', 'top-end'); + return; + } + Swal.fire({ + background: swalBackground, + position: 'center', + imageUrl: image.message, + input: 'text', + inputPlaceholder: '💬 Enter your message...', + showCancelButton: true, + confirmButtonText: `Send`, + showClass: { + popup: 'animate__animated animate__fadeInDown', + }, + hideClass: { + popup: 'animate__animated animate__fadeOutUp', + }, + }).then((result) => { + let peer_msg = this.formatMsg(result.value); + if (!peer_msg) return; + let data = { + peer_name: this.peer_name, + to_peer_id: to_peer_id, + peer_msg: peer_msg, + }; + console.log('Send message:', data); + this.socket.emit('message', data); + this.setMsgAvatar('right', this.peer_name); + this.appendMessage('right', this.rightMsgAvatar, this.peer_name, peer_msg, to_peer_id); + }); + } + showMessage(data) { if (!this.isChatOpen) this.toggleChat(); this.setMsgAvatar('left', data.peer_name); - this.appendMessage('left', this.leftMsgAvatar, data.peer_name, data.peer_msg); + this.appendMessage('left', this.leftMsgAvatar, data.peer_name, data.peer_msg, data.to_peer_id); this.sound('message'); } @@ -1458,17 +1495,19 @@ class RoomClient { avatar === 'left' ? (this.leftMsgAvatar = avatarImg) : (this.rightMsgAvatar = avatarImg); } - appendMessage(side, img, from, msg) { + appendMessage(side, img, from, msg, to) { let time = this.getTimeNow(); + let msgBubble = to == 'all' ? 'msg-bubble' : 'msg-bubble-private'; + let message = to == 'all' ? msg : msg + '
(private message)'; let msgHTML = `
-
+
${from}
${time}
-
${msg}
+
${message}
`;