diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index b66c632cbadd..f5f11c92b4b9 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -514,6 +514,7 @@ "Conversation_closed": "Conversation closed: __comment__.", "Conversation_finished_message": "Conversation Finished Message", "Convert_Ascii_Emojis": "Convert ASCII to Emoji", + "Continuous_sound_notifications_for_new_livechat_room": "Continuous sound notifications for new livechat room", "Copied": "Copied", "Copy": "Copy", "Copy_to_clipboard": "Copy to clipboard", diff --git a/packages/rocketchat-i18n/i18n/pt.i18n.json b/packages/rocketchat-i18n/i18n/pt.i18n.json index 28cbe4eb94c1..324dbb9ae72e 100644 --- a/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -495,6 +495,7 @@ "Conversation_closed": "Chat encerrado: __comment__.", "Conversation_finished_message": "Mensagem ao encerrar chat", "Convert_Ascii_Emojis": "Converter ASCII para Emoji", + "Continuous_sound_notifications_for_new_livechat_room": "Notificações contínuas de som para nova sala de livechat", "Copied": "Copiado", "Copy": "Cópia", "Copy_to_clipboard": "Copiar para área de transferência", diff --git a/packages/rocketchat-livechat/client/startup/notifyUnreadRooms.js b/packages/rocketchat-livechat/client/startup/notifyUnreadRooms.js new file mode 100644 index 000000000000..e4d70c16464d --- /dev/null +++ b/packages/rocketchat-livechat/client/startup/notifyUnreadRooms.js @@ -0,0 +1,44 @@ +let audio = null; + +const stop = audio => { + if (!audio) { + return; + } + audio.loop = false; + return audio.pause && audio.pause(); +}; +const play = audio => { + if (!audio) { + return; + } + audio.loop = true; + return audio.play && audio.play(); +}; + +Meteor.startup(function() { + Tracker.autorun(function() { + + if (!RocketChat.settings.get('Livechat_continuous_sound_notification_new_livechat_room')) { + stop(audio); + return; + } + + const subs = RocketChat.models.Subscriptions.find({ t: 'l', ls : { $exists: 0 }, open: true }).count(); + if (subs === 0) { + stop(audio); + return; + } + + const user = RocketChat.models.Users.findOne(Meteor.userId(), { + fields: { + 'settings.preferences.newRoomNotification': 1 + } + }); + + const newRoomNotification = RocketChat.getUserPreference(user, 'newRoomNotification'); + + [audio] = $(`#${ newRoomNotification }`); + play(audio); + + }); +}); diff --git a/packages/rocketchat-livechat/config.js b/packages/rocketchat-livechat/config.js index 054f23531e8d..242351f2b909 100644 --- a/packages/rocketchat-livechat/config.js +++ b/packages/rocketchat-livechat/config.js @@ -243,6 +243,13 @@ Meteor.startup(function() { i18nLabel: 'Office_hours_enabled' }); + RocketChat.settings.add('Livechat_continuous_sound_notification_new_livechat_room', false, { + type: 'boolean', + group: 'Livechat', + public: true, + i18nLabel: 'Continuous_sound_notifications_for_new_livechat_room' + }); + RocketChat.settings.add('Livechat_videocall_enabled', false, { type: 'boolean', group: 'Livechat', diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js index c0f0511a44d9..374874fd56e2 100644 --- a/packages/rocketchat-livechat/package.js +++ b/packages/rocketchat-livechat/package.js @@ -70,6 +70,9 @@ Package.onUse(function(api) { api.addFiles('client/methods/changeLivechatStatus.js', 'client'); + //client startup + api.addFiles('client/startup/notifyUnreadRooms.js', 'client'); + // client views api.addFiles('client/views/app/livechatAppearance.html', 'client'); api.addFiles('client/views/app/livechatAppearance.js', 'client'); diff --git a/packages/rocketchat-ui/client/lib/notification.js b/packages/rocketchat-ui/client/lib/notification.js index 8371a53d61fb..7688ae79c28e 100644 --- a/packages/rocketchat-ui/client/lib/notification.js +++ b/packages/rocketchat-ui/client/lib/notification.js @@ -120,7 +120,9 @@ const KonchatNotification = { // $('.link-room-' + rid).addClass('new-room-highlight') removeRoomNotification(rid) { - Tracker.nonreactive(() => Session.set('newRoomSound', [])); + let newRoomSound = Session.get('newRoomSound'); + newRoomSound = _.without(newRoomSound, rid); + Tracker.nonreactive(() => Session.set('newRoomSound', newRoomSound)); return $(`.link-room-${ rid }`).removeClass('new-room-highlight'); }