From 681d2904c37446517475c53dd1161415ead251db Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Fri, 26 Apr 2019 18:16:22 -0300 Subject: [PATCH 1/8] Wip: update message actions --- .../client/actionButton.js | 4 +- app/message-pin/client/actionButton.js | 10 +- app/message-snippet/client/actionButton.js | 137 +++++------ app/message-star/client/actionButton.js | 8 +- app/threads/client/index.js | 2 + app/threads/client/messageAction/follow.js | 72 +++--- .../client/messageAction/replyInThread.js | 41 ++++ app/threads/client/messageAction/unfollow.js | 72 +++--- app/ui-master/public/icons/reply-directly.svg | 3 + app/ui-master/public/icons/report.svg | 3 + app/ui-sidenav/client/sidebarItem.js | 4 +- app/ui-utils/client/lib/MessageAction.js | 228 +++++++++--------- app/ui-utils/client/lib/popover.js | 43 +--- app/ui/client/views/app/room.js | 11 +- imports/message-read-receipt/client/room.js | 6 +- packages/rocketchat-i18n/i18n/en.i18n.json | 10 + private/public/icons.svg | 11 +- public/public/icons.html | 10 +- 18 files changed, 356 insertions(+), 319 deletions(-) create mode 100644 app/threads/client/messageAction/replyInThread.js create mode 100644 app/ui-master/public/icons/reply-directly.svg create mode 100644 app/ui-master/public/icons/report.svg diff --git a/app/message-mark-as-unread/client/actionButton.js b/app/message-mark-as-unread/client/actionButton.js index ae6afef256bc..620e97abec65 100644 --- a/app/message-mark-as-unread/client/actionButton.js +++ b/app/message-mark-as-unread/client/actionButton.js @@ -9,7 +9,7 @@ Meteor.startup(() => { MessageAction.addButton({ id: 'mark-message-as-unread', icon: 'flag', - label: 'Mark_as_unread', + label: 'Mark_unread', context: ['message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -30,7 +30,7 @@ Meteor.startup(() => { condition(message) { return Meteor.userId() && message.u._id !== Meteor.userId(); }, - order: 22, + order: 10, group: 'menu', }); }); diff --git a/app/message-pin/client/actionButton.js b/app/message-pin/client/actionButton.js index 38fb313ac9af..9f17bd36f890 100644 --- a/app/message-pin/client/actionButton.js +++ b/app/message-pin/client/actionButton.js @@ -13,7 +13,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'pin-message', icon: 'pin', - label: 'Pin_Message', + label: 'Pin', context: ['pinned', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -31,14 +31,14 @@ Meteor.startup(function() { return hasAtLeastOnePermission('pin-message', message.rid); }, - order: 20, + order: 7, group: 'menu', }); MessageAction.addButton({ id: 'unpin-message', icon: 'pin', - label: 'Unpin_Message', + label: 'Unpin', context: ['pinned', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -56,7 +56,7 @@ Meteor.startup(function() { return hasAtLeastOnePermission('pin-message', message.rid); }, - order: 21, + order: 8, group: 'menu', }); @@ -85,7 +85,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'permalink-pinned', icon: 'permalink', - label: 'Permalink', + label: 'Get_link', classes: 'clipboard', context: ['pinned'], async action(event) { diff --git a/app/message-snippet/client/actionButton.js b/app/message-snippet/client/actionButton.js index e50c89c767ca..342ff2b2854d 100644 --- a/app/message-snippet/client/actionButton.js +++ b/app/message-snippet/client/actionButton.js @@ -1,68 +1,69 @@ -import { Meteor } from 'meteor/meteor'; -import { MessageAction, modal } from '../../ui-utils'; -import { messageArgs } from '../../ui-utils/client/lib/messageArgs'; -import { t, handleError } from '../../utils'; -import { settings } from '../../settings'; -import { Subscriptions } from '../../models'; -import { hasAtLeastOnePermission } from '../../authorization'; - -Meteor.startup(function() { - MessageAction.addButton({ - id: 'snippeted-message', - icon: 'code', - label: 'Snippet', - context: [ - 'snippeted', - 'message', - 'message-mobile', - ], - order: 10, - group: 'menu', - action() { - const { msg: message } = messageArgs(this); - - modal.open({ - title: 'Create a Snippet', - text: 'The name of your snippet (with file extension):', - type: 'input', - showCancelButton: true, - closeOnConfirm: false, - inputPlaceholder: 'Snippet name', - }, function(filename) { - if (filename === false) { - return false; - } - if (filename === '') { - modal.showInputError('You need to write something!'); - return false; - } - message.snippeted = true; - Meteor.call('snippetMessage', message, filename, function(error) { - if (error) { - return handleError(error); - } - modal.open({ - title: t('Nice'), - text: `Snippet '${ filename }' created.`, - type: 'success', - timer: 2000, - }); - }); - }); - - }, - condition(message) { - if (Subscriptions.findOne({ rid: message.rid, 'u._id': Meteor.userId() }) === undefined) { - return false; - } - - if (message.snippeted || ((settings.get('Message_AllowSnippeting') === undefined) || - (settings.get('Message_AllowSnippeting') === null) || - (settings.get('Message_AllowSnippeting')) === false)) { - return false; - } - - return hasAtLeastOnePermission('snippet-message', message.rid); - }, - }); -}); +// import { Meteor } from 'meteor/meteor'; +// import { MessageAction, modal } from '../../ui-utils'; +// import { messageArgs } from '../../ui-utils/client/lib/messageArgs'; +// import { t, handleError } from '../../utils'; +// import { settings } from '../../settings'; +// import { Subscriptions } from '../../models'; +// import { hasAtLeastOnePermission } from '../../authorization'; +// +// Meteor.startup(function() { +// MessageAction.addButton({ +// id: 'snippeted-message', +// icon: 'code', +// label: 'Snippet', +// context: [ +// 'snippeted', +// 'message', +// 'message-mobile', +// ], +// order: 10, +// group: 'menu', +// action() { +// const { msg: message } = messageArgs(this); +// +// modal.open({ +// title: 'Create a Snippet', +// text: 'The name of your snippet (with file extension):', +// type: 'input', +// showCancelButton: true, +// closeOnConfirm: false, +// inputPlaceholder: 'Snippet name', +// }, function(filename) { +// if (filename === false) { +// return false; +// } +// if (filename === '') { +// modal.showInputError('You need to write something!'); +// return false; +// } +// message.snippeted = true; +// Meteor.call('snippetMessage', message, filename, function(error) { +// if (error) { +// return handleError(error); +// } +// modal.open({ +// title: t('Nice'), +// text: `Snippet '${ filename }' created.`, +// type: 'success', +// timer: 2000, +// }); +// }); +// }); +// +// }, +// condition(message) { +// if (Subscriptions.findOne({ rid: message.rid, 'u._id': Meteor.userId() }) === undefined) { +// return false; +// } +// +// if (message.snippeted || ((settings.get('Message_AllowSnippeting') === undefined) || +// (settings.get('Message_AllowSnippeting') === null) || +// (settings.get('Message_AllowSnippeting')) === false)) { +// return false; +// } +// +// return hasAtLeastOnePermission('snippet-message', message.rid); +// }, +// }); +// +// }); diff --git a/app/message-star/client/actionButton.js b/app/message-star/client/actionButton.js index bb6d6c50329e..c528cd55810f 100644 --- a/app/message-star/client/actionButton.js +++ b/app/message-star/client/actionButton.js @@ -11,7 +11,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'star-message', icon: 'star', - label: 'Star_Message', + label: 'Star', context: ['starred', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); @@ -29,7 +29,7 @@ Meteor.startup(function() { return !message.starred || !message.starred.find((star) => star._id === Meteor.userId()); }, - order: 10, + order: 9, group: 'menu', }); @@ -54,7 +54,7 @@ Meteor.startup(function() { return message.starred && message.starred.find((star) => star._id === Meteor.userId()); }, - order: 10, + order: 9, group: 'menu', }); @@ -83,7 +83,7 @@ Meteor.startup(function() { MessageAction.addButton({ id: 'permalink-star', icon: 'permalink', - label: 'Permalink', + label: 'Get_link', classes: 'clipboard', context: ['starred'], async action(event) { diff --git a/app/threads/client/index.js b/app/threads/client/index.js index 6ddd27945ba9..5331d52fbc5e 100644 --- a/app/threads/client/index.js +++ b/app/threads/client/index.js @@ -4,3 +4,5 @@ import './flextab/threads'; import './threads.css'; import './messageAction/follow'; import './messageAction/unfollow'; +import './messageAction/replyInThread'; + diff --git a/app/threads/client/messageAction/follow.js b/app/threads/client/messageAction/follow.js index 4bf89c0c51cb..c5b72e7f40f1 100644 --- a/app/threads/client/messageAction/follow.js +++ b/app/threads/client/messageAction/follow.js @@ -1,36 +1,36 @@ -import { Meteor } from 'meteor/meteor'; -import { Tracker } from 'meteor/tracker'; - -import { Messages } from '../../../models/client'; -import { settings } from '../../../settings/client'; -import { MessageAction, call } from '../../../ui-utils/client'; -import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; - -Meteor.startup(function() { - Tracker.autorun(() => { - if (!settings.get('Threads_enabled')) { - return MessageAction.removeButton('follow-message'); - } - MessageAction.addButton({ - id: 'follow-message', - icon: 'bell', - label: 'Follow_message', - context: ['message', 'message-mobile', 'threads'], - async action() { - const { msg } = messageArgs(this); - call('followMessage', { mid: msg._id }); - }, - condition({ tmid, replies = [] }) { - if (tmid) { - const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); - if (parentMessage) { - replies = parentMessage.replies || []; - } - } - return !replies.includes(Meteor.userId()); - }, - order: 0, - group: 'menu', - }); - }); -}); +// import { Meteor } from 'meteor/meteor'; +// import { Tracker } from 'meteor/tracker'; +// +// import { Messages } from '../../../models/client'; +// import { settings } from '../../../settings/client'; +// import { MessageAction, call } from '../../../ui-utils/client'; +// import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; +// +// Meteor.startup(function() { +// Tracker.autorun(() => { +// if (!settings.get('Threads_enabled')) { +// return MessageAction.removeButton('follow-message'); +// } +// MessageAction.addButton({ +// id: 'follow-message', +// icon: 'bell', +// label: 'Follow_message', +// context: ['message', 'message-mobile', 'threads'], +// async action() { +// const { msg } = messageArgs(this); +// call('followMessage', { mid: msg._id }); +// }, +// condition({ tmid, replies = [] }) { +// if (tmid) { +// const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); +// if (parentMessage) { +// replies = parentMessage.replies || []; +// } +// } +// return !replies.includes(Meteor.userId()); +// }, +// order: 0, +// group: 'menu', +// }); +// }); +// }); diff --git a/app/threads/client/messageAction/replyInThread.js b/app/threads/client/messageAction/replyInThread.js new file mode 100644 index 000000000000..337bd5ba7399 --- /dev/null +++ b/app/threads/client/messageAction/replyInThread.js @@ -0,0 +1,41 @@ +import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; + +import { settings } from '../../../settings/client'; +import { MessageAction } from '../../../ui-utils/client'; +import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; +import { chatMessages } from '../../../ui/client'; +import { addMessageToList } from '../../../ui-utils/client/lib/MessageAction'; +import { Subscriptions } from '../../../models/client'; + +Meteor.startup(function() { + Tracker.autorun(() => { + if (!settings.get('Threads_enabled')) { + return MessageAction.removeButton('reply-in-thread'); + } + MessageAction.addButton({ + id: 'reply-in-thread', + icon: 'thread', + label: 'Reply_in_thread', + context: ['message', 'message-mobile', 'threads'], + action() { + const { msg: message } = messageArgs(this); + const { input } = chatMessages[message.rid]; + const $input = $(input); + + const messages = addMessageToList($input.data('reply') || [], message, input); + + $(input) + .focus() + .data('mention-user', true) + .data('reply', messages) + .trigger('dataChange'); + }, + condition(message) { + return Boolean(Subscriptions.findOne({ rid: message.rid })); + }, + order: 1, + group: 'menu', + }); + }); +}); diff --git a/app/threads/client/messageAction/unfollow.js b/app/threads/client/messageAction/unfollow.js index 1f54ad1dcea1..fba7d5ddedaa 100644 --- a/app/threads/client/messageAction/unfollow.js +++ b/app/threads/client/messageAction/unfollow.js @@ -1,36 +1,36 @@ -import { Meteor } from 'meteor/meteor'; -import { Tracker } from 'meteor/tracker'; - -import { Messages } from '../../../models/client'; -import { settings } from '../../../settings/client'; -import { MessageAction, call } from '../../../ui-utils/client'; -import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; - -Meteor.startup(function() { - Tracker.autorun(() => { - if (!settings.get('Threads_enabled')) { - return MessageAction.removeButton('unfollow-message'); - } - MessageAction.addButton({ - id: 'unfollow-message', - icon: 'bell-off', - label: 'Unfollow_message', - context: ['message', 'message-mobile', 'threads'], - async action() { - const { msg } = messageArgs(this); - call('unfollowMessage', { mid: msg._id }); - }, - condition({ tmid, replies = [] }) { - if (tmid) { - const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); - if (parentMessage) { - replies = parentMessage.replies || []; - } - } - return replies.includes(Meteor.userId()); - }, - order: 0, - group: 'menu', - }); - }); -}); +// import { Meteor } from 'meteor/meteor'; +// import { Tracker } from 'meteor/tracker'; +// +// import { Messages } from '../../../models/client'; +// import { settings } from '../../../settings/client'; +// import { MessageAction, call } from '../../../ui-utils/client'; +// import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; +// +// Meteor.startup(function() { +// Tracker.autorun(() => { +// if (!settings.get('Threads_enabled')) { +// return MessageAction.removeButton('unfollow-message'); +// } +// MessageAction.addButton({ +// id: 'unfollow-message', +// icon: 'bell-off', +// label: 'Unfollow_message', +// context: ['message', 'message-mobile', 'threads'], +// async action() { +// const { msg } = messageArgs(this); +// call('unfollowMessage', { mid: msg._id }); +// }, +// condition({ tmid, replies = [] }) { +// if (tmid) { +// const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); +// if (parentMessage) { +// replies = parentMessage.replies || []; +// } +// } +// return replies.includes(Meteor.userId()); +// }, +// order: 0, +// group: 'menu', +// }); +// }); +// }); diff --git a/app/ui-master/public/icons/reply-directly.svg b/app/ui-master/public/icons/reply-directly.svg new file mode 100644 index 000000000000..d316308059ce --- /dev/null +++ b/app/ui-master/public/icons/reply-directly.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/ui-master/public/icons/report.svg b/app/ui-master/public/icons/report.svg new file mode 100644 index 000000000000..e916a83d1392 --- /dev/null +++ b/app/ui-master/public/icons/report.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/ui-sidenav/client/sidebarItem.js b/app/ui-sidenav/client/sidebarItem.js index 09b70bc82ffe..2e82468248bd 100644 --- a/app/ui-sidenav/client/sidebarItem.js +++ b/app/ui-sidenav/client/sidebarItem.js @@ -144,14 +144,14 @@ Template.sidebarItem.events({ if (this.alert) { items.push({ icon: 'flag', - name: t('Mark_as_read'), + name: t('Mark_read'), type: 'sidebar-item', id: 'read', }); } else { items.push({ icon: 'flag', - name: t('Mark_as_unread'), + name: t('Mark_unread'), type: 'sidebar-item', id: 'unread', }); diff --git a/app/ui-utils/client/lib/MessageAction.js b/app/ui-utils/client/lib/MessageAction.js index eec4248f9f83..434ef9dba662 100644 --- a/app/ui-utils/client/lib/MessageAction.js +++ b/app/ui-utils/client/lib/MessageAction.js @@ -9,11 +9,12 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { Tracker } from 'meteor/tracker'; import { Session } from 'meteor/session'; -import { t, handleError, roomTypes, canDeleteMessage } from '../../../utils/client'; +import { roomTypes, canDeleteMessage } from '../../../utils/client'; import { messageArgs } from './messageArgs'; import { Messages, Rooms, Subscriptions } from '../../../models/client'; import { hasAtLeastOnePermission } from '../../../authorization/client'; import { settings } from '../../../settings/client'; +import { modal } from './modal'; const call = (method, ...args) => new Promise((resolve, reject) => { Meteor.call(method, ...args, function(err, data) { @@ -24,18 +25,7 @@ const call = (method, ...args) => new Promise((resolve, reject) => { }); }); -const success = function success(fn) { - return function(error, result) { - if (error) { - return handleError(error); - } - if (result) { - fn.call(this, result); - } - }; -}; - -const addMessageToList = (messagesList, message) => { +export const addMessageToList = (messagesList, message) => { // checks if the message is not already on the list if (!messagesList.find(({ _id }) => _id === message._id)) { messagesList.push(message); @@ -156,93 +146,57 @@ Meteor.startup(async function() { const { chatMessages } = await import('../../../ui'); MessageAction.addButton({ id: 'reply-message', - icon: 'reply', - label: 'Reply', + icon: 'reply-directly', + label: 'Reply_directly', context: ['message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); const { input } = chatMessages[message.rid]; const $input = $(input); - const messages = addMessageToList($input.data('reply') || [], message, input); + let messages = $input.data('reply') || []; + + messages = addMessageToList(messages, message, input); - $(input) + $input .focus() - .data('mention-user', true) + .data('mention-user', false) .data('reply', messages) .trigger('dataChange'); }, condition(message) { - if (Subscriptions.findOne({ rid: message.rid }) == null) { - return false; - } - - return true; - }, - order: 1, - group: 'menu', - }); - - MessageAction.addButton({ - id: 'edit-message', - icon: 'edit', - label: 'Edit', - context: ['message', 'message-mobile'], - action() { - const { msg } = messageArgs(this); - chatMessages[Session.get('openedRoom')].edit(document.getElementById(msg._id)); - }, - condition(message) { - if (Subscriptions.findOne({ - rid: message.rid, - }) == null) { - return false; - } - const hasPermission = hasAtLeastOnePermission('edit-message', message.rid); - const isEditAllowed = settings.get('Message_AllowEditing'); - const editOwn = message.u && message.u._id === Meteor.userId(); - if (!(hasPermission || (isEditAllowed && editOwn))) { - return; - } - const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes'); - if (blockEditInMinutes) { - let msgTs; - if (message.ts != null) { - msgTs = moment(message.ts); - } - let currentTsDiff; - if (msgTs != null) { - currentTsDiff = moment().diff(msgTs, 'minutes'); - } - return currentTsDiff < blockEditInMinutes; - } else { - return true; - } + return Boolean(Subscriptions.findOne({ rid: message.rid })); }, order: 2, group: 'menu', }); MessageAction.addButton({ - id: 'delete-message', - icon: 'trash', - label: 'Delete', + id: 'quote-message', + icon: 'quote', + label: 'Quote', context: ['message', 'message-mobile'], - color: 'alert', action() { const { msg: message } = messageArgs(this); - chatMessages[Session.get('openedRoom')].confirmDeleteMsg(message); + const { input } = chatMessages[message.rid]; + const $input = $(input); + + let messages = $input.data('reply') || []; + + messages = addMessageToList(messages, message, input); + + $input + .focus() + .data('mention-user', false) + .data('reply', messages) + .trigger('dataChange'); }, condition(message) { if (Subscriptions.findOne({ rid: message.rid }) == null) { return false; } - return canDeleteMessage({ - rid: message.rid, - ts: message.ts, - uid: message.u._id, - }); + return true; }, order: 3, group: 'menu', @@ -251,7 +205,7 @@ Meteor.startup(async function() { MessageAction.addButton({ id: 'permalink', icon: 'permalink', - label: 'Permalink', + label: 'Get_link', classes: 'clipboard', context: ['message', 'message-mobile'], async action(event) { @@ -294,72 +248,122 @@ Meteor.startup(async function() { }); MessageAction.addButton({ - id: 'quote-message', - icon: 'quote', - label: 'Quote', + id: 'edit-message', + icon: 'edit', + label: 'Edit', context: ['message', 'message-mobile'], action() { - const { msg: message } = messageArgs(this); - const { input } = chatMessages[message.rid]; - const $input = $(input); - - let messages = $input.data('reply') || []; - - messages = addMessageToList(messages, message, input); - - $input - .focus() - .data('mention-user', false) - .data('reply', messages) - .trigger('dataChange'); + const { msg } = messageArgs(this); + chatMessages[Session.get('openedRoom')].edit(document.getElementById(msg._id)); }, condition(message) { - if (Subscriptions.findOne({ rid: message.rid }) == null) { + if (Subscriptions.findOne({ + rid: message.rid, + }) == null) { return false; } - - return true; + const hasPermission = hasAtLeastOnePermission('edit-message', message.rid); + const isEditAllowed = settings.get('Message_AllowEditing'); + const editOwn = message.u && message.u._id === Meteor.userId(); + if (!(hasPermission || (isEditAllowed && editOwn))) { + return; + } + const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes'); + if (blockEditInMinutes) { + let msgTs; + if (message.ts != null) { + msgTs = moment(message.ts); + } + let currentTsDiff; + if (msgTs != null) { + currentTsDiff = moment().diff(msgTs, 'minutes'); + } + return currentTsDiff < blockEditInMinutes; + } else { + return true; + } }, order: 6, group: 'menu', }); - MessageAction.addButton({ - id: 'ignore-user', - icon: 'ban', - label: t('Ignore'), + id: 'delete-message', + icon: 'trash', + label: 'Delete', context: ['message', 'message-mobile'], + color: 'alert', action() { - const { msg: { rid, u: { _id } } } = messageArgs(this); - Meteor.call('ignoreUser', { rid, userId:_id, ignore: true }, success(() => toastr.success(t('User_has_been_ignored')))); + const { msg: message } = messageArgs(this); + chatMessages[Session.get('openedRoom')].confirmDeleteMsg(message); }, condition(message) { - const subscription = Subscriptions.findOne({ rid: message.rid }); + if (Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } - return Meteor.userId() !== message.u._id && !(subscription && subscription.ignored && subscription.ignored.indexOf(message.u._id) > -1); + return canDeleteMessage({ + rid: message.rid, + ts: message.ts, + uid: message.u._id, + }); }, - order: 20, + order: 18, group: 'menu', }); MessageAction.addButton({ - id: 'unignore-user', - icon: 'ban', - label: t('Unignore'), + id: 'report-message', + icon: 'report', + label: 'Report', context: ['message', 'message-mobile'], + color: 'alert', action() { - const { msg: { rid, u: { _id } } } = messageArgs(this); - Meteor.call('ignoreUser', { rid, userId:_id, ignore: false }, success(() => toastr.success(t('User_has_been_unignored')))); + const { msg: message } = messageArgs(this); + modal.open({ + title: TAPi18n.__('Report_this_message_question_mark'), + text: message.msg, + inputPlaceholder: TAPi18n.__('Why_do_you_want_to_report_question_mark'), + type: 'input', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: TAPi18n.__('Report_exclamation_mark'), + cancelButtonText: TAPi18n.__('Cancel'), + closeOnConfirm: false, + html: false, + }, (inputValue) => { + if (inputValue === false) { + return false; + } + + if (inputValue === '') { + modal.showInputError(TAPi18n.__('You_need_to_write_something')); + return false; + } + + Meteor.call('reportMessage', message._id, inputValue); + modal.open({ + title: TAPi18n.__('Report_sent'), + text: TAPi18n.__('Thank_you_exclamation_mark '), + type: 'success', + timer: 1000, + showConfirmButton: false, + }); + }); }, condition(message) { - const subscription = Subscriptions.findOne({ rid: message.rid }, { fields: { ignored: 1 } }); - return Meteor.userId() !== message.u._id && subscription && subscription.ignored && subscription.ignored.indexOf(message.u._id) > -1; + if (Subscriptions.findOne({ rid: message.rid }) == null) { + return false; + } + + return canDeleteMessage({ + rid: message.rid, + ts: message.ts, + uid: message.u._id, + }); }, - order: 20, + order: 17, group: 'menu', }); - - }); diff --git a/app/ui-utils/client/lib/popover.js b/app/ui-utils/client/lib/popover.js index 46d4ce4ff8ca..f7fbdd75d5b0 100644 --- a/app/ui-utils/client/lib/popover.js +++ b/app/ui-utils/client/lib/popover.js @@ -3,13 +3,10 @@ import { Meteor } from 'meteor/meteor'; import { Blaze } from 'meteor/blaze'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Template } from 'meteor/templating'; -import { TAPi18n } from 'meteor/tap:i18n'; -import { isRtl, handleError } from '../../../utils'; -import { messageArgs } from './messageArgs'; -import { ChatSubscription } from '../../../models'; +import { isRtl, handleError } from '../../../utils/client'; +import { ChatSubscription } from '../../../models/client'; import _ from 'underscore'; import { hide, leave } from './ChannelActions'; -import { modal } from './modal'; import { messageBox } from './messageBox'; import { MessageAction } from './MessageAction'; import { RoomManager } from './RoomManager'; @@ -178,42 +175,6 @@ Template.popover.events({ popover.close(); return false; } - - if (e.currentTarget.dataset.id === 'report-abuse') { - const { msg: message } = messageArgs(t.data.data); - modal.open({ - title: TAPi18n.__('Report_this_message_question_mark'), - text: message.msg, - inputPlaceholder: TAPi18n.__('Why_do_you_want_to_report_question_mark'), - type: 'input', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: TAPi18n.__('Report_exclamation_mark'), - cancelButtonText: TAPi18n.__('Cancel'), - closeOnConfirm: false, - html: false, - }, (inputValue) => { - if (inputValue === false) { - return false; - } - - if (inputValue === '') { - modal.showInputError(TAPi18n.__('You_need_to_write_something')); - return false; - } - - Meteor.call('reportMessage', message._id, inputValue); - - modal.open({ - title: TAPi18n.__('Report_sent'), - text: TAPi18n.__('Thank_you_exclamation_mark '), - type: 'success', - timer: 1000, - showConfirmButton: false, - }); - }); - popover.close(); - } }, 'click [data-type="sidebar-item"]'(e, instance) { popover.close(); diff --git a/app/ui/client/views/app/room.js b/app/ui/client/views/app/room.js index c5f663cfc6f9..9939212ba14a 100644 --- a/app/ui/client/views/app/room.js +++ b/app/ui/client/views/app/room.js @@ -779,13 +779,16 @@ Template.room.events({ id: item.id, modifier: item.color, })); - const [items, deleteItem] = allItems.reduce((result, value) => (result[value.id === 'delete-message' ? 1 : 0].push(value), result), [[], []]); + const itemsBelowDivider = [ + 'delete-message', + 'report-message', + ]; + const [items, alertsItem] = allItems.reduce((result, value) => (result[itemsBelowDivider.includes(value.id) ? 1 : 0].push(value), result), [[], []]); const groups = [{ items }]; - if (deleteItem.length) { - groups.push({ items: deleteItem }); + if (alertsItem .length) { + groups.push({ items: alertsItem }); } - const config = { columns: [ { diff --git a/imports/message-read-receipt/client/room.js b/imports/message-read-receipt/client/room.js index 71357b3b58ac..89d678b2d877 100644 --- a/imports/message-read-receipt/client/room.js +++ b/imports/message-read-receipt/client/room.js @@ -6,12 +6,12 @@ import { settings } from '../../../app/settings'; MessageAction.addButton({ id: 'receipt-detail', icon: 'info-circled', - label: 'Message_info', + label: 'Info', context: ['starred', 'message', 'message-mobile'], action() { const { msg: message } = messageArgs(this); modal.open({ - title: t('Message_info'), + title: t('Info'), content: 'readReceipts', data: { messageId: message._id, @@ -24,6 +24,6 @@ MessageAction.addButton({ condition() { return settings.get('Message_Read_Receipt_Store_Users'); }, - order: 1, + order: 10, group: 'menu', }); diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index ac799c09e3d2..95dc47f8ad4a 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -655,6 +655,7 @@ "Convert_Ascii_Emojis": "Convert ASCII to Emoji", "Copied": "Copied", "Copy": "Copy", + "Copy_text": "Copy Text", "Copy_to_clipboard": "Copy to clipboard", "COPY_TO_CLIPBOARD": "COPY TO CLIPBOARD", "could-not-access-webdav": "Could not access WebDAV", @@ -1416,6 +1417,7 @@ "Full_Screen": "Full Screen", "Gaming": "Gaming", "General": "General", + "Get_link": "Get Link", "github_no_public_email": "You don't have any email as public email in your GitHub account", "Give_a_unique_name_for_the_custom_oauth": "Give a unique name for the custom oauth", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Give the application a name. This will be seen by your users.", @@ -1926,6 +1928,8 @@ "Mark_all_as_read": "Mark all messages (in all channels) as read", "Mark_as_read": "Mark As Read", "Mark_as_unread": "Mark As Unread", + "Mark_read": "Mark Read", + "Mark_unread": "Mark Unread", "Markdown_Headers": "Allow Markdown headers in messages", "Markdown_Marked_Breaks": "Enable Marked Breaks", "Markdown_Marked_GFM": "Enable Marked GFM", @@ -2230,6 +2234,7 @@ "Permissions": "Permissions", "Personal_Access_Tokens": "Personal Access Tokens", "Phone_number": "Phone number", + "Pin": "Pin", "pin-message": "Pin Message", "pin-message_description": "Permission to pin a message in a channel", "Pin_Message": "Pin Message", @@ -2406,7 +2411,10 @@ "Replied_on": "Replied on", "Replies": "Replies", "Reply": "Reply", + "Reply_directly": "Reply Directly", + "Reply_in_thread": "Reply in Thread", "ReplyTo": "Reply-To", + "Report": "Report", "Report_Abuse": "Report Abuse", "Report_exclamation_mark": "Report!", "Report_sent": "Report sent", @@ -2685,6 +2693,7 @@ "Sound": "Sound", "Sound_File_mp3": "Sound File (mp3)", "SSL": "SSL", + "Star": "Star", "Star_Message": "Star Message", "Starred_Messages": "Starred Messages", "Start": "Start", @@ -2930,6 +2939,7 @@ "Unmute_someone_in_room": "Unmute someone in the room", "Unmute_user": "Unmute user", "Unnamed": "Unnamed", + "Unpin": "Unpin", "Unpin_Message": "Unpin Message", "Unread": "Unread", "Unread_Count": "Unread Count", diff --git a/private/public/icons.svg b/private/public/icons.svg index 3c91828d41b5..e214e4e8815c 100644 --- a/private/public/icons.svg +++ b/private/public/icons.svg @@ -83,9 +83,6 @@ - - - @@ -266,9 +263,15 @@ + + + + + + @@ -362,4 +365,4 @@ - + \ No newline at end of file diff --git a/public/public/icons.html b/public/public/icons.html index a7f74b2671f8..a8db5c8b8ae5 100644 --- a/public/public/icons.html +++ b/public/public/icons.html @@ -22,7 +22,7 @@ height: 20px; color: blue; } -
+
@@ -287,9 +287,15 @@ + + + + + + @@ -383,4 +389,4 @@ -
+
\ No newline at end of file From 74ee073285e98fe136500a4239aaa58ec07d65d5 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Fri, 26 Apr 2019 18:29:01 -0300 Subject: [PATCH 2/8] Fix report condition --- app/ui-utils/client/lib/MessageAction.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/ui-utils/client/lib/MessageAction.js b/app/ui-utils/client/lib/MessageAction.js index 434ef9dba662..42d3178764cb 100644 --- a/app/ui-utils/client/lib/MessageAction.js +++ b/app/ui-utils/client/lib/MessageAction.js @@ -353,15 +353,7 @@ Meteor.startup(async function() { }); }, condition(message) { - if (Subscriptions.findOne({ rid: message.rid }) == null) { - return false; - } - - return canDeleteMessage({ - rid: message.rid, - ts: message.ts, - uid: message.u._id, - }); + return Boolean(Subscriptions.findOne({ rid: message.rid })); }, order: 17, group: 'menu', From e3bc022504a2f75c4dee527c8558df0ebc2276f6 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Fri, 26 Apr 2019 22:00:52 -0300 Subject: [PATCH 3/8] Fix discussion icon --- app/ui-master/public/icons/discussion.svg | 3 +++ private/public/icons.svg | 3 +++ public/public/icons.html | 5 ++++- 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 app/ui-master/public/icons/discussion.svg diff --git a/app/ui-master/public/icons/discussion.svg b/app/ui-master/public/icons/discussion.svg new file mode 100644 index 000000000000..f36cd50aa7a4 --- /dev/null +++ b/app/ui-master/public/icons/discussion.svg @@ -0,0 +1,3 @@ + + + diff --git a/private/public/icons.svg b/private/public/icons.svg index e214e4e8815c..b350482b7e6f 100644 --- a/private/public/icons.svg +++ b/private/public/icons.svg @@ -83,6 +83,9 @@ + + + diff --git a/public/public/icons.html b/public/public/icons.html index a8db5c8b8ae5..cd49899ebde6 100644 --- a/public/public/icons.html +++ b/public/public/icons.html @@ -22,7 +22,7 @@ height: 20px; color: blue; } -
+
@@ -107,6 +107,9 @@ + + + From a28dcb433b77f808cea59ecc66846e0b7c740c7a Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Fri, 26 Apr 2019 22:18:47 -0300 Subject: [PATCH 4/8] Fix new icons proportions --- app/ui-master/public/icons/reply-directly.svg | 2 +- app/ui-master/public/icons/report.svg | 2 +- private/public/icons.svg | 4 ++-- public/public/icons.html | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/ui-master/public/icons/reply-directly.svg b/app/ui-master/public/icons/reply-directly.svg index d316308059ce..5334f969cc9b 100644 --- a/app/ui-master/public/icons/reply-directly.svg +++ b/app/ui-master/public/icons/reply-directly.svg @@ -1,3 +1,3 @@ - + diff --git a/app/ui-master/public/icons/report.svg b/app/ui-master/public/icons/report.svg index e916a83d1392..a0d1db38d62b 100644 --- a/app/ui-master/public/icons/report.svg +++ b/app/ui-master/public/icons/report.svg @@ -1,3 +1,3 @@ - + diff --git a/private/public/icons.svg b/private/public/icons.svg index b350482b7e6f..6ae97ffaea94 100644 --- a/private/public/icons.svg +++ b/private/public/icons.svg @@ -266,13 +266,13 @@ - + - + diff --git a/public/public/icons.html b/public/public/icons.html index cd49899ebde6..050d518c5196 100644 --- a/public/public/icons.html +++ b/public/public/icons.html @@ -290,13 +290,13 @@ - + - + From 806c731813c00e95e2efd06d19c74c3800c65170 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Fri, 26 Apr 2019 22:32:18 -0300 Subject: [PATCH 5/8] Keep follow and unfollow only in threads context --- app/threads/client/messageAction/follow.js | 72 ++++++++++---------- app/threads/client/messageAction/unfollow.js | 72 ++++++++++---------- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/app/threads/client/messageAction/follow.js b/app/threads/client/messageAction/follow.js index c5b72e7f40f1..8e4d20ec0755 100644 --- a/app/threads/client/messageAction/follow.js +++ b/app/threads/client/messageAction/follow.js @@ -1,36 +1,36 @@ -// import { Meteor } from 'meteor/meteor'; -// import { Tracker } from 'meteor/tracker'; -// -// import { Messages } from '../../../models/client'; -// import { settings } from '../../../settings/client'; -// import { MessageAction, call } from '../../../ui-utils/client'; -// import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; -// -// Meteor.startup(function() { -// Tracker.autorun(() => { -// if (!settings.get('Threads_enabled')) { -// return MessageAction.removeButton('follow-message'); -// } -// MessageAction.addButton({ -// id: 'follow-message', -// icon: 'bell', -// label: 'Follow_message', -// context: ['message', 'message-mobile', 'threads'], -// async action() { -// const { msg } = messageArgs(this); -// call('followMessage', { mid: msg._id }); -// }, -// condition({ tmid, replies = [] }) { -// if (tmid) { -// const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); -// if (parentMessage) { -// replies = parentMessage.replies || []; -// } -// } -// return !replies.includes(Meteor.userId()); -// }, -// order: 0, -// group: 'menu', -// }); -// }); -// }); +import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; + +import { Messages } from '../../../models/client'; +import { settings } from '../../../settings/client'; +import { MessageAction, call } from '../../../ui-utils/client'; +import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; + +Meteor.startup(function() { + Tracker.autorun(() => { + if (!settings.get('Threads_enabled')) { + return MessageAction.removeButton('follow-message'); + } + MessageAction.addButton({ + id: 'follow-message', + icon: 'bell', + label: 'Follow_message', + context: ['threads'], + async action() { + const { msg } = messageArgs(this); + call('followMessage', { mid: msg._id }); + }, + condition({ tmid, replies = [] }) { + if (tmid) { + const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); + if (parentMessage) { + replies = parentMessage.replies || []; + } + } + return !replies.includes(Meteor.userId()); + }, + order: 0, + group: 'menu', + }); + }); +}); diff --git a/app/threads/client/messageAction/unfollow.js b/app/threads/client/messageAction/unfollow.js index fba7d5ddedaa..49dfdd74addf 100644 --- a/app/threads/client/messageAction/unfollow.js +++ b/app/threads/client/messageAction/unfollow.js @@ -1,36 +1,36 @@ -// import { Meteor } from 'meteor/meteor'; -// import { Tracker } from 'meteor/tracker'; -// -// import { Messages } from '../../../models/client'; -// import { settings } from '../../../settings/client'; -// import { MessageAction, call } from '../../../ui-utils/client'; -// import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; -// -// Meteor.startup(function() { -// Tracker.autorun(() => { -// if (!settings.get('Threads_enabled')) { -// return MessageAction.removeButton('unfollow-message'); -// } -// MessageAction.addButton({ -// id: 'unfollow-message', -// icon: 'bell-off', -// label: 'Unfollow_message', -// context: ['message', 'message-mobile', 'threads'], -// async action() { -// const { msg } = messageArgs(this); -// call('unfollowMessage', { mid: msg._id }); -// }, -// condition({ tmid, replies = [] }) { -// if (tmid) { -// const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); -// if (parentMessage) { -// replies = parentMessage.replies || []; -// } -// } -// return replies.includes(Meteor.userId()); -// }, -// order: 0, -// group: 'menu', -// }); -// }); -// }); +import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; + +import { Messages } from '../../../models/client'; +import { settings } from '../../../settings/client'; +import { MessageAction, call } from '../../../ui-utils/client'; +import { messageArgs } from '../../../ui-utils/client/lib/messageArgs'; + +Meteor.startup(function() { + Tracker.autorun(() => { + if (!settings.get('Threads_enabled')) { + return MessageAction.removeButton('unfollow-message'); + } + MessageAction.addButton({ + id: 'unfollow-message', + icon: 'bell-off', + label: 'Unfollow_message', + context: ['threads'], + async action() { + const { msg } = messageArgs(this); + call('unfollowMessage', { mid: msg._id }); + }, + condition({ tmid, replies = [] }) { + if (tmid) { + const parentMessage = Messages.findOne({ _id: tmid }, { fields: { replies: 1 } }); + if (parentMessage) { + replies = parentMessage.replies || []; + } + } + return replies.includes(Meteor.userId()); + }, + order: 0, + group: 'menu', + }); + }); +}); From 8d2e790455a55d7e1527a61e2421989c16b63295 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Sat, 27 Apr 2019 12:44:18 -0300 Subject: [PATCH 6/8] Change autotranslate buttons to "translate" and "view original" --- app/autotranslate/client/lib/actionButton.js | 31 ++++++++++++++++++-- packages/rocketchat-i18n/i18n/en.i18n.json | 4 ++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/app/autotranslate/client/lib/actionButton.js b/app/autotranslate/client/lib/actionButton.js index 41440be6b6ff..c1983132c4bd 100644 --- a/app/autotranslate/client/lib/actionButton.js +++ b/app/autotranslate/client/lib/actionButton.js @@ -11,9 +11,9 @@ Meteor.startup(function() { Tracker.autorun(function() { if (settings.get('AutoTranslate_Enabled') && hasAtLeastOnePermission(['auto-translate'])) { MessageAction.addButton({ - id: 'toggle-language', + id: 'translate', icon: 'language', - label: 'Toggle_original_translated', + label: 'Translate', context: [ 'message', 'message-mobile', @@ -30,7 +30,32 @@ Meteor.startup(function() { Messages.update({ _id: message._id }, { [action]: { autoTranslateShowInverse: true } }); }, condition(message) { - return message && message.u && message.u._id !== Meteor.userId(); + return message && message.u && message.u._id !== Meteor.userId() && message.translations && !message.translations.original; + }, + order: 90, + }); + MessageAction.addButton({ + id: 'view-original', + icon: 'language', + label: 'View_original', + context: [ + 'message', + 'message-mobile', + ], + action() { + const { msg: message } = messageArgs(this); + const language = AutoTranslate.getLanguage(message.rid); + if ((!message.translations || !message.translations[language])) { // } && !_.find(message.attachments, attachment => { return attachment.translations && attachment.translations[language]; })) { + AutoTranslate.messageIdsToWait[message._id] = true; + Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } }); + Meteor.call('autoTranslate.translateMessage', message, language); + } + const action = message.autoTranslateShowInverse ? '$unset' : '$set'; + Messages.update({ _id: message._id }, { [action]: { autoTranslateShowInverse: true } }); + }, + condition(message) { + return message && message.u && message.u._id !== Meteor.userId() && message.translations && message.translations.original; + }, order: 90, }); diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 95dc47f8ad4a..30d3cbaa5b29 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -2895,6 +2895,7 @@ "Transcript_Enabled": "Ask Visitor if They Would Like a Transcript After Chat Closed", "Transcript_message": "Message to Show When Asking About Transcript", "Transcript_of_your_livechat_conversation": "Transcript of your livechat conversation.", + "Translate": "Translate", "Translated": "Translated", "Translations": "Translations", "Travel_and_Places": "Travel & Places", @@ -3124,6 +3125,7 @@ "View_All": "View All Members", "View_Logs": "View Logs", "View_mode": "View Mode", + "View_original": "View Original", "Viewing_room_administration": "Viewing room administration", "View_the_Logs_for": "View the logs for: \"__name__\"", "Visibility": "Visibility", @@ -3219,4 +3221,4 @@ "Your_question": "Your question", "Your_server_link": "Your server link", "Your_workspace_is_ready": "Your workspace is ready to use 🎉" -} \ No newline at end of file +} From 031b59d90215872059249cc43dda9909dd629261 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Sat, 27 Apr 2019 14:38:53 -0300 Subject: [PATCH 7/8] Fix message action id --- app/ui-utils/client/lib/MessageAction.js | 2 +- tests/pageobjects/main-content.page.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/ui-utils/client/lib/MessageAction.js b/app/ui-utils/client/lib/MessageAction.js index c83478aa1fd8..a42fef4c48f1 100644 --- a/app/ui-utils/client/lib/MessageAction.js +++ b/app/ui-utils/client/lib/MessageAction.js @@ -146,7 +146,7 @@ export const MessageAction = new class { Meteor.startup(async function() { const { chatMessages } = await import('../../../ui'); MessageAction.addButton({ - id: 'reply-message', + id: 'reply-directly', icon: 'reply-directly', label: 'Reply_in_direct_message', context: ['message', 'message-mobile'], diff --git a/tests/pageobjects/main-content.page.js b/tests/pageobjects/main-content.page.js index d54c492db622..4c7f9ecf3ca7 100644 --- a/tests/pageobjects/main-content.page.js +++ b/tests/pageobjects/main-content.page.js @@ -35,7 +35,7 @@ class MainContent extends Page { get lastMessageQuote() { return browser.element('.message:last-child .thread-quote'); } get messageOptionsBtn() { return browser.element('.message:last-child .message-actions__menu'); } get messageActionMenu() { return browser.element('.rc-popover .rc-popover__content'); } - get messageReply() { return browser.element('[data-id="reply-message"][data-type="message-action"]'); } + get messageReply() { return browser.element('[data-id="reply-in-thread"][data-type="message-action"]'); } get messageEdit() { return browser.element('[data-id="edit-message"][data-type="message-action"]'); } get messageDelete() { return browser.element('[data-id="delete-message"][data-type="message-action"]'); } get messagePermalink() { return browser.element('[data-id="permalink"][data-type="message-action"]'); } From 9e67fe9f78ba94c02f9adaedbb9bb8000babb475 Mon Sep 17 00:00:00 2001 From: Marcos Defendi Date: Sat, 27 Apr 2019 15:56:26 -0300 Subject: [PATCH 8/8] Fix open reply popup when reply in direct message --- app/ui-message/client/messageBox/messageBox.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/ui-message/client/messageBox/messageBox.js b/app/ui-message/client/messageBox/messageBox.js index acde75b6b59c..9d0a3f323a34 100644 --- a/app/ui-message/client/messageBox/messageBox.js +++ b/app/ui-message/client/messageBox/messageBox.js @@ -98,6 +98,11 @@ Template.messageBox.onCreated(function() { }); Template.messageBox.onRendered(function() { + const $input = $(this.find('.js-input-message')); + $input.on('dataChange', () => { + const messages = $input.data('reply') || []; + this.replyMessageData.set(messages); + }); this.autorun(() => { const { rid, subscription } = Template.currentData(); const room = Session.get(`roomData${ rid }`); @@ -156,12 +161,6 @@ Template.messageBox.onRendered(function() { const shadow = this.find('.js-input-message-shadow'); this.autogrow = setupAutogrow(input, shadow, onResize); - - const $input = $(input); - $input.on('dataChange', () => { - const messages = $input.data('reply') || []; - this.replyMessageData.set(messages); - }); }); }); });