diff --git a/packages/rocketchat-lib/client/MessageAction.js b/packages/rocketchat-lib/client/MessageAction.js index 8038c7d92f5..e07096f5047 100644 --- a/packages/rocketchat-lib/client/MessageAction.js +++ b/packages/rocketchat-lib/client/MessageAction.js @@ -3,6 +3,14 @@ import _ from 'underscore'; import moment from 'moment'; import toastr from 'toastr'; +const call = (method, ...args) => new Promise((resolve, reject) => { + Meteor.call(method, ...args, function(err, data) { + if (err) { + return reject(err); + } + resolve(data); + }); +}); const success = function success(fn) { return function(error, result) { @@ -93,14 +101,23 @@ RocketChat.MessageAction = new class { return this.buttons.set({}); } - getPermaLink(msgId) { - const roomData = ChatSubscription.findOne({ - rid: Session.get('openedRoom') + async getPermaLink(msgId) { + if (!msgId) { + throw new Error('invalid-parameter'); + } + + const msg = RocketChat.models.Messages.findOne(msgId) || await call('getSingleMessage', msgId); + if (!msg) { + throw new Error('message-not-found'); + } + const roomData = RocketChat.models.Rooms.findOne({ + _id: msg.rid }); - let routePath = document.location.pathname; - if (roomData) { - routePath = RocketChat.roomTypes.getRouteLink(roomData.t, roomData); + + if (!roomData) { + throw new Error('room-not-found'); } + const routePath = RocketChat.roomTypes.getRouteLink(roomData.t, roomData); return `${ Meteor.absoluteUrl().replace(/\/$/, '') + routePath }?msg=${ msgId }`; } }; @@ -220,9 +237,9 @@ Meteor.startup(function() { label: 'Permalink', classes: 'clipboard', context: ['message', 'message-mobile'], - action(event) { + async action(event) { const message = this._arguments[1]; - const permalink = RocketChat.MessageAction.getPermaLink(message._id); + const permalink = await RocketChat.MessageAction.getPermaLink(message._id); if (Meteor.isCordova) { cordova.plugins.clipboard.copy(permalink); } else { diff --git a/packages/rocketchat-message-pin/client/actionButton.js b/packages/rocketchat-message-pin/client/actionButton.js index 02ff9b566a7..407904b6dfe 100644 --- a/packages/rocketchat-message-pin/client/actionButton.js +++ b/packages/rocketchat-message-pin/client/actionButton.js @@ -79,9 +79,9 @@ Meteor.startup(function() { label: 'Permalink', classes: 'clipboard', context: ['pinned'], - action(event) { + async action(event) { const message = this._arguments[1]; - $(event.currentTarget).attr('data-clipboard-text', RocketChat.MessageAction.getPermaLink(message._id)); + $(event.currentTarget).attr('data-clipboard-text', await RocketChat.MessageAction.getPermaLink(message._id)); toastr.success(TAPi18n.__('Copied')); }, condition(message) { diff --git a/packages/rocketchat-message-star/client/actionButton.js b/packages/rocketchat-message-star/client/actionButton.js index dd08536ff6a..00f68c9e226 100644 --- a/packages/rocketchat-message-star/client/actionButton.js +++ b/packages/rocketchat-message-star/client/actionButton.js @@ -80,9 +80,9 @@ Meteor.startup(function() { label: 'Permalink', classes: 'clipboard', context: ['starred'], - action(event) { + async action(event) { const message = this._arguments[1]; - $(event.currentTarget).attr('data-clipboard-text', RocketChat.MessageAction.getPermaLink(message._id)); + $(event.currentTarget).attr('data-clipboard-text', await RocketChat.MessageAction.getPermaLink(message._id)); toastr.success(TAPi18n.__('Copied')); }, condition(message) { diff --git a/packages/rocketchat-ui-message/client/message.js b/packages/rocketchat-ui-message/client/message.js index 86c1382da62..65014fce1f6 100644 --- a/packages/rocketchat-ui-message/client/message.js +++ b/packages/rocketchat-ui-message/client/message.js @@ -8,7 +8,7 @@ Template.message.helpers({ }, broadcast() { const instance = Template.instance(); - return this.u._id !== Meteor.userId() && instance.room && instance.room.broadcast; + return !this.t && this.u._id !== Meteor.userId() && instance.room && instance.room.broadcast; }, isIgnored() { return this.ignored; diff --git a/packages/rocketchat-ui/client/lib/chatMessages.js b/packages/rocketchat-ui/client/lib/chatMessages.js index 0014a78189b..e11058f8468 100644 --- a/packages/rocketchat-ui/client/lib/chatMessages.js +++ b/packages/rocketchat-ui/client/lib/chatMessages.js @@ -3,8 +3,6 @@ import s from 'underscore.string'; import moment from 'moment'; import toastr from 'toastr'; -const reply = id => id && `[ ](${ RocketChat.MessageAction.getPermaLink(id) }) `; - this.ChatMessages = class ChatMessages { init(node) { this.editing = {}; @@ -179,7 +177,7 @@ this.ChatMessages = class ChatMessages { * * @param {Element} input DOM element * * @param {function?} done callback */ - send(rid, input, done = function() {}) { + async send(rid, input, done = function() {}) { if (s.trim(input.value) !== '') { readMessage.enable(); readMessage.readNow(); @@ -190,8 +188,7 @@ this.ChatMessages = class ChatMessages { const mentionUser = $(input).data('mention-user') || false; if (reply !== undefined) { - const url = RocketChat.MessageAction.getPermaLink(reply._id); - msg = `[ ](${ url }) `; + msg = `[ ](${ await RocketChat.MessageAction.getPermaLink(reply._id) }) `; const roomInfo = RocketChat.models.Rooms.findOne(reply.rid, { fields: { t: 1 } }); if (roomInfo.t !== 'd' && reply.u.username !== Meteor.user().username && mentionUser) { msg += `@${ reply.u.username } `; @@ -404,10 +401,21 @@ this.ChatMessages = class ChatMessages { } restoreText(rid) { - const text = reply(FlowRouter.getQueryParam('reply')) || localStorage.getItem(`messagebox_${ rid }`); + const text = localStorage.getItem(`messagebox_${ rid }`); if (typeof text === 'string' && this.input) { this.input.value = text; } + const msgId = FlowRouter.getQueryParam('reply'); + if (!msgId) { + return; + } + const message = RocketChat.models.Messages.findOne(msgId); + if (message) { + return this.$input.data('reply', message).trigger('dataChange'); + } + Meteor.call('getSingleMessage', msgId, (err, msg) => { + return !err && this.$input.data('reply', msg).trigger('dataChange'); + }); } keyup(rid, event) {