From 4f3a2713552a3d862104fc8a33f00ca7aae30a3b Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Wed, 20 Apr 2022 10:49:52 +0530 Subject: [PATCH] chore: Add `custom attributes` in `campaign.triggered` event (#4463) --- .../campaigns/campaign_conversation_builder.rb | 5 +++-- app/javascript/widget/App.vue | 7 ++++--- app/javascript/widget/api/campaign.js | 14 ++++++++++---- app/javascript/widget/api/endPoints.js | 3 ++- app/javascript/widget/store/modules/campaign.js | 7 +++++-- app/javascript/widget/views/PreChatForm.vue | 5 ++++- app/listeners/campaign_listener.rb | 4 +++- spec/listeners/campaign_listener_spec.rb | 5 +++-- 8 files changed, 34 insertions(+), 16 deletions(-) diff --git a/app/builders/campaigns/campaign_conversation_builder.rb b/app/builders/campaigns/campaign_conversation_builder.rb index 48a3cebd4..9eb640576 100644 --- a/app/builders/campaigns/campaign_conversation_builder.rb +++ b/app/builders/campaigns/campaign_conversation_builder.rb @@ -1,5 +1,5 @@ class Campaigns::CampaignConversationBuilder - pattr_initialize [:contact_inbox_id!, :campaign_display_id!, :conversation_additional_attributes] + pattr_initialize [:contact_inbox_id!, :campaign_display_id!, :conversation_additional_attributes, :custom_attributes] def perform @contact_inbox = ContactInbox.find(@contact_inbox_id) @@ -32,7 +32,8 @@ class Campaigns::CampaignConversationBuilder contact_id: @contact_inbox.contact_id, contact_inbox_id: @contact_inbox.id, campaign_id: @campaign.id, - additional_attributes: conversation_additional_attributes + additional_attributes: conversation_additional_attributes, + custom_attributes: custom_attributes || {} } end end diff --git a/app/javascript/widget/App.vue b/app/javascript/widget/App.vue index ec30064a7..723effb81 100755 --- a/app/javascript/widget/App.vue +++ b/app/javascript/widget/App.vue @@ -155,13 +155,14 @@ export default { this.replaceRoute('prechat-form'); } else { this.replaceRoute('messages'); - bus.$emit('execute-campaign', this.activeCampaign.id); + bus.$emit('execute-campaign', { campaignId: this.activeCampaign.id }); } this.unsetUnreadView(); }); - bus.$on('execute-campaign', campaignId => { + bus.$on('execute-campaign', campaignDetails => { + const { customAttributes, campaignId } = campaignDetails; const { websiteToken } = window.chatwootWebChannel; - this.executeCampaign({ campaignId, websiteToken }); + this.executeCampaign({ campaignId, websiteToken, customAttributes }); this.replaceRoute('messages'); }); }, diff --git a/app/javascript/widget/api/campaign.js b/app/javascript/widget/api/campaign.js index 00116a6b2..57d81e084 100644 --- a/app/javascript/widget/api/campaign.js +++ b/app/javascript/widget/api/campaign.js @@ -7,9 +7,16 @@ const getCampaigns = async websiteToken => { return result; }; -const triggerCampaign = async ({ campaignId, websiteToken }) => { - const urlData = endPoints.triggerCampaign({ websiteToken, campaignId }); - +const triggerCampaign = async ({ + campaignId, + websiteToken, + customAttributes, +}) => { + const urlData = endPoints.triggerCampaign({ + websiteToken, + campaignId, + customAttributes, + }); await API.post( urlData.url, { ...urlData.data }, @@ -18,5 +25,4 @@ const triggerCampaign = async ({ campaignId, websiteToken }) => { } ); }; - export { getCampaigns, triggerCampaign }; diff --git a/app/javascript/widget/api/endPoints.js b/app/javascript/widget/api/endPoints.js index 870275382..298196a43 100755 --- a/app/javascript/widget/api/endPoints.js +++ b/app/javascript/widget/api/endPoints.js @@ -78,12 +78,13 @@ const getCampaigns = token => ({ website_token: token, }, }); -const triggerCampaign = ({ websiteToken, campaignId }) => ({ +const triggerCampaign = ({ websiteToken, campaignId, customAttributes }) => ({ url: '/api/v1/widget/events', data: { name: 'campaign.triggered', event_info: { campaign_id: campaignId, + custom_attributes: customAttributes, ...generateEventParams(), }, }, diff --git a/app/javascript/widget/store/modules/campaign.js b/app/javascript/widget/store/modules/campaign.js index 381364543..5ea3e691f 100644 --- a/app/javascript/widget/store/modules/campaign.js +++ b/app/javascript/widget/store/modules/campaign.js @@ -92,14 +92,17 @@ export const actions = { } }, - executeCampaign: async ({ commit }, { campaignId, websiteToken }) => { + executeCampaign: async ( + { commit }, + { campaignId, websiteToken, customAttributes } + ) => { try { commit( 'conversation/setConversationUIFlag', { isCreating: true }, { root: true } ); - await triggerCampaign({ campaignId, websiteToken }); + await triggerCampaign({ campaignId, websiteToken, customAttributes }); commit('setCampaignExecuted', true); commit('setActiveCampaign', {}); } catch (error) { diff --git a/app/javascript/widget/views/PreChatForm.vue b/app/javascript/widget/views/PreChatForm.vue index f3c9d7fe4..a3986b07a 100644 --- a/app/javascript/widget/views/PreChatForm.vue +++ b/app/javascript/widget/views/PreChatForm.vue @@ -46,7 +46,10 @@ export default { conversationCustomAttributes, }) { if (activeCampaignId) { - bus.$emit('execute-campaign', activeCampaignId); + bus.$emit('execute-campaign', { + campaignId: activeCampaignId, + customAttributes: conversationCustomAttributes, + }); this.$store.dispatch('contacts/update', { user: { email: emailAddress, diff --git a/app/listeners/campaign_listener.rb b/app/listeners/campaign_listener.rb index 1405911c2..8d0f664a7 100644 --- a/app/listeners/campaign_listener.rb +++ b/app/listeners/campaign_listener.rb @@ -2,13 +2,15 @@ class CampaignListener < BaseListener def campaign_triggered(event) contact_inbox = event.data[:contact_inbox] campaign_display_id = event.data[:event_info][:campaign_id] + custom_attributes = event.data[:event_info][:custom_attributes] return if campaign_display_id.blank? ::Campaigns::CampaignConversationBuilder.new( contact_inbox_id: contact_inbox.id, campaign_display_id: campaign_display_id, - conversation_additional_attributes: event.data[:event_info].except(:campaign_id) + conversation_additional_attributes: event.data[:event_info].except(:campaign_id, :custom_attributes), + custom_attributes: custom_attributes ).perform end end diff --git a/spec/listeners/campaign_listener_spec.rb b/spec/listeners/campaign_listener_spec.rb index b9f693055..137d1c396 100644 --- a/spec/listeners/campaign_listener_spec.rb +++ b/spec/listeners/campaign_listener_spec.rb @@ -9,7 +9,7 @@ describe CampaignListener do let!(:event) do Events::Base.new('campaign_triggered', Time.zone.now, - contact_inbox: contact_inbox, event_info: { campaign_id: campaign.display_id }) + contact_inbox: contact_inbox, event_info: { campaign_id: campaign.display_id, custom_attributes: { order_id: 321 } }) end describe '#campaign_triggered' do @@ -23,7 +23,8 @@ describe CampaignListener do context 'when params contain campaign id' do it 'triggers campaign conversation builder' do expect(Campaigns::CampaignConversationBuilder).to receive(:new) - .with({ contact_inbox_id: contact_inbox.id, campaign_display_id: campaign.display_id, conversation_additional_attributes: {} }).once + .with({ contact_inbox_id: contact_inbox.id, campaign_display_id: campaign.display_id, conversation_additional_attributes: {}, + custom_attributes: { order_id: 321 } }).once listener.campaign_triggered(event) end end