diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js index bf15aa9c5..771e0ff1b 100644 --- a/app/javascript/dashboard/helper/actionCable.js +++ b/app/javascript/dashboard/helper/actionCable.js @@ -111,6 +111,7 @@ class ActionCableConnector extends BaseActionCableConnector { } = data; DashboardAudioNotificationHelper.onNewMessage(data); this.app.$store.dispatch('addMessage', data); + this.app.$store.dispatch('updateUnreadCount'); this.app.$store.dispatch('updateConversationLastActivity', { lastActivityAt, conversationId, diff --git a/app/javascript/dashboard/store/modules/conversations/actions.js b/app/javascript/dashboard/store/modules/conversations/actions.js index 8db97fc88..776bb376a 100644 --- a/app/javascript/dashboard/store/modules/conversations/actions.js +++ b/app/javascript/dashboard/store/modules/conversations/actions.js @@ -289,6 +289,17 @@ const actions = { } }, + updateUnreadCount({ getters }) { + const { installationName } = window.chatwootConfig; + const unreadCount = getters.getUnreadConversationsCount; + + if (unreadCount === 0) { + document.title = installationName; + } else { + document.title = `${installationName} (${getters.getUnreadConversationsCount})`; + } + }, + updateMessage({ commit }, message) { commit(types.ADD_MESSAGE, message); }, diff --git a/app/javascript/dashboard/store/modules/conversations/getters.js b/app/javascript/dashboard/store/modules/conversations/getters.js index c55952e68..a6555519f 100644 --- a/app/javascript/dashboard/store/modules/conversations/getters.js +++ b/app/javascript/dashboard/store/modules/conversations/getters.js @@ -10,6 +10,15 @@ export const getSelectedChatConversation = ({ }) => allConversations.filter(conversation => conversation.id === selectedChatId); +export const getUnreadCountForChat = chat => { + return chat.messages.filter( + chatMessage => + chatMessage.created_at * 1000 > chat.agent_last_seen_at * 1000 && + chatMessage.message_type === 0 && + chatMessage.private !== true + ).length; +}; + const sortComparator = { latest: (a, b) => b.last_activity_at - a.last_activity_at, sort_on_created_at: (a, b) => a.created_at - b.created_at, @@ -107,15 +116,15 @@ const getters = { ? false : chat.allMessagesLoaded; }, + getUnreadConversationsCount({ allConversations }) { + return allConversations.filter(chat => { + return getUnreadCountForChat(chat) > 0; + }).length; + }, getUnreadCount(_state) { const [chat] = getSelectedChatConversation(_state); if (!chat) return []; - return chat.messages.filter( - chatMessage => - chatMessage.created_at * 1000 > chat.agent_last_seen_at * 1000 && - chatMessage.message_type === 0 && - chatMessage.private !== true - ).length; + return getUnreadCountForChat(chat); }, getChatStatusFilter: ({ chatStatusFilter }) => chatStatusFilter, getChatSortFilter: ({ chatSortFilter }) => chatSortFilter, diff --git a/app/views/layouts/vueapp.html.erb b/app/views/layouts/vueapp.html.erb index 32ab67e80..75e1f56fd 100644 --- a/app/views/layouts/vueapp.html.erb +++ b/app/views/layouts/vueapp.html.erb @@ -32,6 +32,7 @@ <%= csrf_meta_tags %>