From d9ce4c9a628d1a14a6021b3ce056b2ec6384e466 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 6 Feb 2018 19:33:01 -0200 Subject: [PATCH] Read receipts modal --- client/main.js | 1 + imports/message-read-receipt/client/index.js | 1 + .../client/readReceipts.html | 8 +++++ .../client/readReceipts.js | 29 +++++++++++++++++++ .../server/api/methods/getReadReceipts.js | 11 +++++++ imports/message-read-receipt/server/index.js | 2 ++ .../server/lib/ReadReceipt.js | 11 ++++++- .../server/models/ReadReceipts.js | 6 +++- imports/startup/client/index.js | 1 + .../rocketchat-ui/client/views/app/room.js | 14 +++++++++ 10 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 client/main.js create mode 100644 imports/message-read-receipt/client/index.js create mode 100644 imports/message-read-receipt/client/readReceipts.html create mode 100644 imports/message-read-receipt/client/readReceipts.js create mode 100644 imports/message-read-receipt/server/api/methods/getReadReceipts.js create mode 100644 imports/startup/client/index.js diff --git a/client/main.js b/client/main.js new file mode 100644 index 00000000000..090ed9e3792 --- /dev/null +++ b/client/main.js @@ -0,0 +1 @@ +import '/imports/startup/client'; diff --git a/imports/message-read-receipt/client/index.js b/imports/message-read-receipt/client/index.js new file mode 100644 index 00000000000..d6e76a58e07 --- /dev/null +++ b/imports/message-read-receipt/client/index.js @@ -0,0 +1 @@ +import './readReceipts'; diff --git a/imports/message-read-receipt/client/readReceipts.html b/imports/message-read-receipt/client/readReceipts.html new file mode 100644 index 00000000000..dde1677a394 --- /dev/null +++ b/imports/message-read-receipt/client/readReceipts.html @@ -0,0 +1,8 @@ + diff --git a/imports/message-read-receipt/client/readReceipts.js b/imports/message-read-receipt/client/readReceipts.js new file mode 100644 index 00000000000..afc5506b6e3 --- /dev/null +++ b/imports/message-read-receipt/client/readReceipts.js @@ -0,0 +1,29 @@ +import { ReactiveVar } from 'meteor/reactive-var'; +import moment from 'moment'; + +import './readReceipts.html'; + +Template.readReceipts.helpers({ + receipts() { + return Template.instance().readReceipts.get(); + }, + user() { + return this.user.name || this.user.username; + }, + time() { + return moment(this.ts).format('L LTS'); + } +}); + +Template.readReceipts.onCreated(function readReceiptsOnCreated() { + this.loading = new ReactiveVar(false); + this.readReceipts = new ReactiveVar([]); +}); + +Template.readReceipts.onRendered(function readReceiptsOnRendered() { + this.loading.set(true); + Meteor.call('getReadReceipts', { messageId: this.data.messageId }, (error, result) => { + this.loading.set(false); + this.readReceipts.set(result); + }); +}); diff --git a/imports/message-read-receipt/server/api/methods/getReadReceipts.js b/imports/message-read-receipt/server/api/methods/getReadReceipts.js new file mode 100644 index 00000000000..887c1a53f34 --- /dev/null +++ b/imports/message-read-receipt/server/api/methods/getReadReceipts.js @@ -0,0 +1,11 @@ +import { Meteor } from 'meteor/meteor'; + +import { ReadReceipt } from '../../lib/ReadReceipt'; + +Meteor.methods({ + getReadReceipts({ messageId }) { + const message = RocketChat.models.Messages.findOneById(messageId); + + return ReadReceipt.getReceipts(message); + } +}); diff --git a/imports/message-read-receipt/server/index.js b/imports/message-read-receipt/server/index.js index b0a36ad00ee..7061d5e4f66 100644 --- a/imports/message-read-receipt/server/index.js +++ b/imports/message-read-receipt/server/index.js @@ -1,2 +1,4 @@ import './dbIndexes'; import './settings'; + +import './api/methods/getReadReceipts'; diff --git a/imports/message-read-receipt/server/lib/ReadReceipt.js b/imports/message-read-receipt/server/lib/ReadReceipt.js index fe033a8e872..879dff368ba 100644 --- a/imports/message-read-receipt/server/lib/ReadReceipt.js +++ b/imports/message-read-receipt/server/lib/ReadReceipt.js @@ -34,12 +34,14 @@ export const ReadReceipt = { // if firstSubscription on room didn't change if (RocketChat.settings.get('Message_Read_Receipt_Store_Users')) { + const ts = new Date(); const receipts = RocketChat.models.Messages.findUnreadMessagesByRoomAndDate(roomId, userLastSeen).map(message => { return { _id: Random.id(), roomId, userId, - messageId: message._id + messageId: message._id, + ts }; }); @@ -51,5 +53,12 @@ export const ReadReceipt = { } RocketChat.models.Messages.setAsRead(roomId, firstSubscription.ls); + }, + + getReceipts(message) { + return ModelReadReceipts.findByMessageId(message._id).map(receipt => ({ + ...receipt, + user: RocketChat.models.Users.findOneById(receipt.userId, { fields: { username: 1, name: 1 }}) + })); } }; diff --git a/imports/message-read-receipt/server/models/ReadReceipts.js b/imports/message-read-receipt/server/models/ReadReceipts.js index b5031aa3a8d..4749ae5bb28 100644 --- a/imports/message-read-receipt/server/models/ReadReceipts.js +++ b/imports/message-read-receipt/server/models/ReadReceipts.js @@ -10,6 +10,10 @@ class ModelReadReceipts extends RocketChat.models._Base { unique: 1 }); } + + findByMessageId(messageId) { + return this.find({ messageId }); + } } -export default new ModelReadReceipts('message_read_receipt', true); +export default new ModelReadReceipts('message_read_receipt'); diff --git a/imports/startup/client/index.js b/imports/startup/client/index.js new file mode 100644 index 00000000000..d61ded85f56 --- /dev/null +++ b/imports/startup/client/index.js @@ -0,0 +1 @@ +import '../../message-read-receipt/client'; diff --git a/packages/rocketchat-ui/client/views/app/room.js b/packages/rocketchat-ui/client/views/app/room.js index 30a446740c3..cc378bd43ee 100644 --- a/packages/rocketchat-ui/client/views/app/room.js +++ b/packages/rocketchat-ui/client/views/app/room.js @@ -718,6 +718,20 @@ Template.room.events({ showCancelButton: true, cancelButtonText: t('Close') }); + }, + 'click .read-receipt'(event) { + const data = Blaze.getData(event.currentTarget); + const messageId = data && data._arguments && data._arguments[1] && data._arguments[1]._id; + modal.open({ + title: 'Read receipts', + content: 'readReceipts', + data: { + messageId + }, + showConfirmButton: true, + showCancelButton: false, + confirmButtonText: t('Close') + }); } });