diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js index e00cf283f..ba21a3e6a 100644 --- a/app/javascript/dashboard/helper/actionCable.js +++ b/app/javascript/dashboard/helper/actionCable.js @@ -25,6 +25,7 @@ class ActionCableConnector extends BaseActionCableConnector { 'notification.created': this.onNotificationCreated, 'first.reply.created': this.onFirstReplyCreated, 'conversation.read': this.onConversationRead, + 'conversation.updated': this.onConversationUpdated, }; } @@ -85,6 +86,11 @@ class ActionCableConnector extends BaseActionCableConnector { this.fetchConversationStats(); }; + onConversationUpdated = data => { + this.app.$store.dispatch('updateConversation', data); + this.fetchConversationStats(); + }; + onTypingOn = ({ conversation, user }) => { const conversationId = conversation.id; diff --git a/app/listeners/action_cable_listener.rb b/app/listeners/action_cable_listener.rb index 3d3bbdf83..e7c025600 100644 --- a/app/listeners/action_cable_listener.rb +++ b/app/listeners/action_cable_listener.rb @@ -52,6 +52,13 @@ class ActionCableListener < BaseListener broadcast(account, tokens, CONVERSATION_STATUS_CHANGED, conversation.push_event_data) end + def conversation_updated(event) + conversation, account = extract_conversation_and_account(event) + tokens = user_tokens(account, conversation.inbox.members) + contact_inbox_tokens(conversation.contact_inbox) + + broadcast(account, tokens, CONVERSATION_UPDATED, conversation.push_event_data) + end + def conversation_typing_on(event) conversation = event.data[:conversation] account = conversation.account diff --git a/spec/listeners/action_cable_listener_spec.rb b/spec/listeners/action_cable_listener_spec.rb index d1bad487f..b0c14c4d0 100644 --- a/spec/listeners/action_cable_listener_spec.rb +++ b/spec/listeners/action_cable_listener_spec.rb @@ -128,4 +128,20 @@ describe ActionCableListener do listener.contact_deleted(event) end end + + describe '#conversation_updated' do + let(:event_name) { :'conversation.updated' } + let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation, user: agent, is_private: false) } + + it 'sends update to inbox members' do + expect(conversation.inbox.reload.inbox_members.count).to eq(1) + + expect(ActionCableBroadcastJob).to receive(:perform_later).with( + [agent.pubsub_token, admin.pubsub_token, conversation.contact_inbox.pubsub_token], + 'conversation.updated', + conversation.push_event_data.merge(account_id: account.id) + ) + listener.conversation_updated(event) + end + end end