diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index 509cc07f5..4286ea0ff 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -28,7 +28,9 @@ "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Notifications", "NOTE": "Enable audio notifications in dashboard for new messages and conversations.", - "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives" + "NONE": "None", + "ASSIGNED": "Assigned Conversations", + "ALL_CONVERSATIONS": "All Conversations" }, "EMAIL_NOTIFICATIONS_SECTION": { "TITLE": "Email Notifications", diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue b/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue index 38bf2744e..27c10ecdc 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/profile/NotificationSettings.vue @@ -12,16 +12,45 @@
-
+
+ + +
+
+ + @@ -315,7 +344,7 @@ export default { this.updateNotificationSettings(); }, handleAudioInput(e) { - this.enableAudioAlerts = e.target.checked; + this.enableAudioAlerts = e.target.value; this.updateUISettings({ enable_audio_alerts: this.enableAudioAlerts, }); diff --git a/app/javascript/dashboard/store/modules/conversations/getters.js b/app/javascript/dashboard/store/modules/conversations/getters.js index de13f0572..b7f277a1e 100644 --- a/app/javascript/dashboard/store/modules/conversations/getters.js +++ b/app/javascript/dashboard/store/modules/conversations/getters.js @@ -63,6 +63,9 @@ const getters = { }, getChatStatusFilter: ({ chatStatusFilter }) => chatStatusFilter, getSelectedInbox: ({ currentInbox }) => currentInbox, + getConversationById: _state => conversationId => { + return _state.allConversations.find(value => value.id === conversationId); + }, }; export default getters; diff --git a/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js b/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js index 8d9ad1711..188d77a37 100644 --- a/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js +++ b/app/javascript/dashboard/store/modules/specs/conversations/getters.spec.js @@ -102,4 +102,16 @@ describe('#getters', () => { ]); }); }); + describe('#getConversationById', () => { + it('get conversations based on id', () => { + const state = { + allConversations: [ + { + id: 1, + }, + ], + }; + expect(getters.getConversationById(state)(1)).toEqual({ id: 1 }); + }); + }); }); diff --git a/app/javascript/shared/helpers/AudioNotificationHelper.js b/app/javascript/shared/helpers/AudioNotificationHelper.js index 8aeb32b91..07d4bafb0 100644 --- a/app/javascript/shared/helpers/AudioNotificationHelper.js +++ b/app/javascript/shared/helpers/AudioNotificationHelper.js @@ -1,16 +1,7 @@ import { MESSAGE_TYPE } from 'shared/constants/messages'; -const notificationAudio = require('shared/assets/audio/ding.mp3'); import axios from 'axios'; import { showBadgeOnFavicon } from './faviconHelper'; -export const playNotificationAudio = () => { - try { - new Audio(notificationAudio).play(); - } catch (error) { - // error - } -}; - export const getAlertAudio = async () => { window.playAudioAlert = () => {}; const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); @@ -35,11 +26,21 @@ export const getAlertAudio = async () => { } }; +export const notificationEnabled = (enableAudioAlerts, id, userId) => { + if (enableAudioAlerts === 'mine') { + return userId === id; + } + if (enableAudioAlerts === 'all') { + return true; + } + return false; +}; + export const shouldPlayAudio = ( message, conversationId, userId, - isDocHiddden + isDocHidden ) => { const { conversation_id: incomingConvId, @@ -51,29 +52,44 @@ export const shouldPlayAudio = ( const playAudio = !isFromCurrentUser && (messageType === MESSAGE_TYPE.INCOMING || isPrivate); - - if (isDocHiddden) return playAudio; + if (isDocHidden) return playAudio; if (conversationId !== incomingConvId) return playAudio; return false; }; +export const getAssigneeFromNotification = currentConv => { + let id; + if (currentConv.meta) { + const assignee = currentConv.meta.assignee; + if (assignee) { + id = assignee.id; + } + } + return id; +}; export const newMessageNotification = data => { const { conversation_id: currentConvId } = window.WOOT.$route.params; const currentUserId = window.WOOT.$store.getters.getCurrentUserID; - const isDocHiddden = document.hidden; - + const { conversation_id: incomingConvId } = data; + const currentConv = + window.WOOT.$store.getters.getConversationById(incomingConvId) || {}; + const assigneeId = getAssigneeFromNotification(currentConv); + const isDocHidden = document.hidden; const { enable_audio_alerts: enableAudioAlerts = false, } = window.WOOT.$store.getters.getUISettings; - const playAudio = shouldPlayAudio( data, currentConvId, currentUserId, - isDocHiddden + isDocHidden ); - - if (enableAudioAlerts && playAudio) { + const isNotificationEnabled = notificationEnabled( + enableAudioAlerts, + currentUserId, + assigneeId + ); + if (playAudio && isNotificationEnabled) { window.playAudioAlert(); showBadgeOnFavicon(); } diff --git a/app/javascript/shared/helpers/specs/AudioNotificationHelper.spec.js b/app/javascript/shared/helpers/specs/AudioNotificationHelper.spec.js index 8d2b0f2fe..7bdb6b059 100644 --- a/app/javascript/shared/helpers/specs/AudioNotificationHelper.spec.js +++ b/app/javascript/shared/helpers/specs/AudioNotificationHelper.spec.js @@ -2,7 +2,11 @@ * @jest-environment jsdom */ -import { shouldPlayAudio } from '../AudioNotificationHelper'; +import { + shouldPlayAudio, + notificationEnabled, + getAssigneeFromNotification, +} from '../AudioNotificationHelper'; describe('shouldPlayAudio', () => { describe('Document active', () => { @@ -107,3 +111,41 @@ describe('shouldPlayAudio', () => { }); }); }); +describe('notificationEnabled', () => { + it('returns true if mine', () => { + const [enableAudioAlerts, userId, id] = ['mine', 1, 1]; + const result = notificationEnabled(enableAudioAlerts, userId, id); + expect(result).toBe(true); + }); + it('returns true if all', () => { + const [enableAudioAlerts, userId, id] = ['all', 1, 2]; + const result = notificationEnabled(enableAudioAlerts, userId, id); + expect(result).toBe(true); + }); + it('returns false if none', () => { + const [enableAudioAlerts, userId, id] = ['none', 1, 2]; + const result = notificationEnabled(enableAudioAlerts, userId, id); + expect(result).toBe(false); + }); +}); +describe('getAssigneeFromNotification', () => { + it('Retuns true if gets notification from assignee', () => { + const currentConv = { + id: 1, + accountId: 1, + meta: { + assignee: { + id: 1, + name: 'John', + }, + }, + }; + const result = getAssigneeFromNotification(currentConv); + expect(result).toBe(1); + }); + it('Retuns true if gets notification from assignee is udefined', () => { + const currentConv = {}; + const result = getAssigneeFromNotification(currentConv); + expect(result).toBe(undefined); + }); +}); diff --git a/app/javascript/widget/store/modules/conversation/actions.js b/app/javascript/widget/store/modules/conversation/actions.js index ddae68024..c3134620e 100644 --- a/app/javascript/widget/store/modules/conversation/actions.js +++ b/app/javascript/widget/store/modules/conversation/actions.js @@ -8,7 +8,7 @@ import { } from 'widget/api/conversation'; import { refreshActionCableConnector } from '../../../helpers/actionCable'; -import { createTemporaryMessage, onNewMessageCreated } from './helpers'; +import { createTemporaryMessage } from './helpers'; export const actions = { createConversation: async ({ commit, dispatch }, params) => { @@ -78,7 +78,6 @@ export const actions = { addMessage: async ({ commit }, data) => { commit('pushMessageToConversation', data); - onNewMessageCreated(data); }, updateMessage({ commit }, data) { diff --git a/app/javascript/widget/store/modules/conversation/helpers.js b/app/javascript/widget/store/modules/conversation/helpers.js index afffeed62..03227f8da 100644 --- a/app/javascript/widget/store/modules/conversation/helpers.js +++ b/app/javascript/widget/store/modules/conversation/helpers.js @@ -1,5 +1,4 @@ import { MESSAGE_TYPE } from 'widget/helpers/constants'; -import { playNotificationAudio } from 'shared/helpers/AudioNotificationHelper'; import { isASubmittedFormMessage } from 'shared/helpers/MessageTypeHelper'; import getUuid from '../../../helpers/uuid'; @@ -47,12 +46,3 @@ export const findUndeliveredMessage = (messageInbox, { content }) => Object.values(messageInbox).filter( message => message.content === content && message.status === 'in_progress' ); - -export const onNewMessageCreated = data => { - const { message_type: messageType } = data; - const isIncomingMessage = messageType === MESSAGE_TYPE.OUTGOING; - - if (isIncomingMessage) { - playNotificationAudio(); - } -}; diff --git a/app/javascript/widget/store/modules/specs/conversation/actions.spec.js b/app/javascript/widget/store/modules/specs/conversation/actions.spec.js index 09e4e98af..ca1b702ee 100644 --- a/app/javascript/widget/store/modules/specs/conversation/actions.spec.js +++ b/app/javascript/widget/store/modules/specs/conversation/actions.spec.js @@ -1,12 +1,8 @@ -import { playNotificationAudio } from 'shared/helpers/AudioNotificationHelper'; import { actions } from '../../conversation/actions'; import getUuid from '../../../../helpers/uuid'; import { API } from 'widget/helpers/axios'; jest.mock('../../../../helpers/uuid'); -jest.mock('shared/helpers/AudioNotificationHelper', () => ({ - playNotificationAudio: jest.fn(), -})); jest.mock('widget/helpers/axios'); const commit = jest.fn(); @@ -20,7 +16,6 @@ describe('#actions', () => { it('plays audio when agent sends a message', () => { actions.addMessage({ commit }, { id: 1, message_type: 1 }); - expect(playNotificationAudio).toBeCalled(); expect(commit).toBeCalledWith('pushMessageToConversation', { id: 1, message_type: 1,