From 5a691caaa2535eb3ddb148e3bff3c631552e3ec9 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Wed, 4 Jul 2018 18:54:46 -0300 Subject: [PATCH] Fix livechat desktop notifications --- packages/rocketchat-lib/lib/RoomTypeConfig.js | 29 +++++++++++++++++++ .../rocketchat-lib/lib/RoomTypesCommon.js | 8 +++++ .../rocketchat-lib/lib/roomTypes/direct.js | 19 ++++++++++++ .../server/functions/notifications/desktop.js | 14 ++------- .../server/lib/sendNotificationsOnMessage.js | 4 ++- .../rocketchat-livechat/client/roomType.js | 3 ++ .../LivechatRoomType.js} | 6 ++-- packages/rocketchat-livechat/package.js | 5 +++- .../rocketchat-livechat/server/roomType.js | 25 ++++++++++++++++ 9 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 packages/rocketchat-livechat/client/roomType.js rename packages/rocketchat-livechat/{roomType.js => imports/LivechatRoomType.js} (88%) create mode 100644 packages/rocketchat-livechat/server/roomType.js diff --git a/packages/rocketchat-lib/lib/RoomTypeConfig.js b/packages/rocketchat-lib/lib/RoomTypeConfig.js index 7ab4efcc7289..487fe57a21e6 100644 --- a/packages/rocketchat-lib/lib/RoomTypeConfig.js +++ b/packages/rocketchat-lib/lib/RoomTypeConfig.js @@ -203,4 +203,33 @@ export class RoomTypeConfig { getUiText(/* context */) { return ''; } + + /** + * Returns the full object of message sender + * @param {string} senderId Sender's _id + * @return {object} Sender's object from db + */ + getMsgSender(senderId) { + return Meteor.isServer ? RocketChat.models.Users.findOneById(senderId) : {}; + } + + /** + * Returns details to use on notifications + * + * @param {object} room + * @param {object} user + * @param {string} notificationMessage + * @return {object} Notification details + */ + getNotificationDetails(room, user, notificationMessage) { + if (!Meteor.isServer) { + return {}; + } + + const title = `#${ this.getRoomName(room.t, room) }`; + + const text = `${ RocketChat.settings.get('UI_Use_Real_Name') ? user.name : user.username }: ${ notificationMessage }`; + + return { title, text }; + } } diff --git a/packages/rocketchat-lib/lib/RoomTypesCommon.js b/packages/rocketchat-lib/lib/RoomTypesCommon.js index e7cead3d9dde..6c5ba9a08979 100644 --- a/packages/rocketchat-lib/lib/RoomTypesCommon.js +++ b/packages/rocketchat-lib/lib/RoomTypesCommon.js @@ -90,4 +90,12 @@ export class RoomTypesCommon { return FlowRouter.go(this.roomTypes[roomType].route.name, routeData, queryParams); } + + /** + * @param {string} roomType room type (e.g.: c (for channels), d (for direct channels)) + * @param {RoomTypeConfig} roomConfig room's type configuration + */ + getConfig(roomType) { + return this.roomTypes[roomType]; + } } diff --git a/packages/rocketchat-lib/lib/roomTypes/direct.js b/packages/rocketchat-lib/lib/roomTypes/direct.js index f1ba44c1cd02..9145751cdd16 100644 --- a/packages/rocketchat-lib/lib/roomTypes/direct.js +++ b/packages/rocketchat-lib/lib/roomTypes/direct.js @@ -111,4 +111,23 @@ export class DirectMessageRoomType extends RoomTypeConfig { return ''; } } + + /** + * Returns details to use on notifications + * + * @param {object} room + * @param {object} user + * @param {string} notificationMessage + * @return {object} Notification details + */ + getNotificationDetails(room, user, notificationMessage) { + if (!Meteor.isServer) { + return {}; + } + + const title = RocketChat.settings.get('UI_Use_Real_Name') ? user.name : `@${ user.username }`; + const text = notificationMessage; + + return { title, text }; + } } diff --git a/packages/rocketchat-lib/server/functions/notifications/desktop.js b/packages/rocketchat-lib/server/functions/notifications/desktop.js index b56f15c1d541..06df0e6336fe 100644 --- a/packages/rocketchat-lib/server/functions/notifications/desktop.js +++ b/packages/rocketchat-lib/server/functions/notifications/desktop.js @@ -16,19 +16,9 @@ export function notifyDesktopUser({ duration, notificationMessage }) { - const UI_Use_Real_Name = RocketChat.settings.get('UI_Use_Real_Name') === true; + const roomConfig = RocketChat.roomTypes.getConfig(room.t); - let title = ''; - let text = ''; - if (room.t === 'd') { - title = UI_Use_Real_Name ? user.name : `@${ user.username }`; - text = notificationMessage; - } else if (RocketChat.roomTypes.getRoomName(room.t, room)) { - title = `#${ RocketChat.roomTypes.getRoomName(room.t, room) }`; - text = `${ UI_Use_Real_Name ? user.name : user.username }: ${ notificationMessage }`; - } else { - return; - } + const { title, text } = roomConfig.getNotificationDetails(room, user, notificationMessage); RocketChat.metrics.notificationsSent.inc({ notification_type: 'desktop' }); RocketChat.Notifications.notifyUser(userId, 'notification', { diff --git a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js index 1f33a449b826..14f97a17529a 100644 --- a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js +++ b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js @@ -157,7 +157,9 @@ function sendAllNotifications(message, room) { return message; } - const sender = (room.t !== 'l') ? RocketChat.models.Users.findOneById(message.u._id) : room.v; + const roomConfig = RocketChat.roomTypes.getConfig(room.t); + + const sender = roomConfig.getMsgSender(message.u._id); if (!sender) { return message; } diff --git a/packages/rocketchat-livechat/client/roomType.js b/packages/rocketchat-livechat/client/roomType.js new file mode 100644 index 000000000000..39927a740195 --- /dev/null +++ b/packages/rocketchat-livechat/client/roomType.js @@ -0,0 +1,3 @@ +import LivechatRoomType from '../imports/LivechatRoomType'; + +RocketChat.roomTypes.add(new LivechatRoomType()); diff --git a/packages/rocketchat-livechat/roomType.js b/packages/rocketchat-livechat/imports/LivechatRoomType.js similarity index 88% rename from packages/rocketchat-livechat/roomType.js rename to packages/rocketchat-livechat/imports/LivechatRoomType.js index a33231c19acf..8914b0de9c4a 100644 --- a/packages/rocketchat-livechat/roomType.js +++ b/packages/rocketchat-livechat/imports/LivechatRoomType.js @@ -1,5 +1,5 @@ /* globals openRoom, LivechatInquiry */ -import {RoomSettingsEnum, RoomTypeConfig, RoomTypeRouteConfig, UiTextContext} from 'meteor/rocketchat:lib'; +import { RoomSettingsEnum, RoomTypeConfig, RoomTypeRouteConfig, UiTextContext } from 'meteor/rocketchat:lib'; class LivechatRoomRoute extends RoomTypeRouteConfig { constructor() { @@ -20,7 +20,7 @@ class LivechatRoomRoute extends RoomTypeRouteConfig { } } -class LivechatRoomType extends RoomTypeConfig { +export default class LivechatRoomType extends RoomTypeConfig { constructor() { super({ identifier: 'l', @@ -82,5 +82,3 @@ class LivechatRoomType extends RoomTypeConfig { } } } - -RocketChat.roomTypes.add(new LivechatRoomType()); diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js index 85745d4c6e9e..8f25b235f225 100644 --- a/packages/rocketchat-livechat/package.js +++ b/packages/rocketchat-livechat/package.js @@ -46,10 +46,10 @@ Package.onUse(function(api) { api.addFiles('server/visitorStatus.js', 'server'); api.addFiles('permissions.js', 'server'); api.addFiles('messageTypes.js'); - api.addFiles('roomType.js'); api.addFiles('config.js', 'server'); + api.addFiles('client/roomType.js', 'client'); api.addFiles('client/ui.js', 'client'); api.addFiles('client/route.js', 'client'); @@ -131,6 +131,9 @@ Package.onUse(function(api) { api.addFiles('client/views/app/triggers/livechatTriggerCondition.html', 'client'); api.addFiles('client/views/app/triggers/livechatTriggerCondition.js', 'client'); + // startup + api.addFiles('server/roomType.js', 'server'); + // hooks api.addFiles('server/hooks/externalMessage.js', 'server'); api.addFiles('server/hooks/leadCapture.js', 'server'); diff --git a/packages/rocketchat-livechat/server/roomType.js b/packages/rocketchat-livechat/server/roomType.js new file mode 100644 index 000000000000..382b5e623f35 --- /dev/null +++ b/packages/rocketchat-livechat/server/roomType.js @@ -0,0 +1,25 @@ +import LivechatRoomType from '../imports/LivechatRoomType'; +import LivechatVisitors from './models/LivechatVisitors'; + +class LivechatRoomTypeServer extends LivechatRoomType { + getMsgSender(senderId) { + return LivechatVisitors.findOneById(senderId); + } + + /** + * Returns details to use on notifications + * + * @param {object} room + * @param {object} user + * @param {string} notificationMessage + * @return {object} Notification details + */ + getNotificationDetails(room, user, notificationMessage) { + const title = `[livechat] ${ user.name || user.username }`; + const text = notificationMessage; + + return { title, text }; + } +} + +RocketChat.roomTypes.add(new LivechatRoomTypeServer());