import BaseActionCableConnector from '../../shared/helpers/BaseActionCableConnector'; class ActionCableConnector extends BaseActionCableConnector { constructor(app, pubsubToken) { super(app, pubsubToken); this.events = { 'message.created': this.onMessageCreated, 'message.updated': this.onMessageUpdated, 'conversation.typing_on': this.onTypingOn, 'conversation.typing_off': this.onTypingOff, 'conversation.status_changed': this.onStatusChange, 'presence.update': this.onPresenceUpdate, 'contact.merged': this.onContactMerge, }; } static refreshConnector = pubsubToken => { if (!pubsubToken || window.chatwootPubsubToken === pubsubToken) { return; } window.chatwootPubsubToken = pubsubToken; window.actionCable.disconnect(); window.actionCable = new ActionCableConnector( window.WOOT_WIDGET, window.chatwootPubsubToken ); }; onStatusChange = data => { this.app.$store.dispatch('conversationAttributes/update', data); }; onMessageCreated = data => { this.app.$store .dispatch('conversation/addOrUpdateMessage', data) .then(() => { window.bus.$emit('on-agent-message-recieved'); }); }; onMessageUpdated = data => { this.app.$store.dispatch('conversation/addOrUpdateMessage', data); }; onPresenceUpdate = data => { this.app.$store.dispatch('agent/updatePresence', data.users); }; onContactMerge = data => { const { pubsub_token: pubsubToken } = data; ActionCableConnector.refreshConnector(pubsubToken); }; onTypingOn = () => { this.clearTimer(); this.app.$store.dispatch('conversation/toggleAgentTyping', { status: 'on', }); this.initTimer(); }; onTypingOff = () => { this.clearTimer(); this.app.$store.dispatch('conversation/toggleAgentTyping', { status: 'off', }); }; clearTimer = () => { if (this.CancelTyping) { clearTimeout(this.CancelTyping); this.CancelTyping = null; } }; initTimer = () => { // Turn off typing automatically after 30 seconds this.CancelTyping = setTimeout(() => { this.onTypingOff(); }, 30000); }; } export const refreshActionCableConnector = ActionCableConnector.refreshConnector; export default ActionCableConnector;