feat: Show pre-chat form before triggering the campaign (#3215)

This commit is contained in:
Muhsin Keloth
2021-11-11 19:02:16 +05:30
committed by GitHub
parent 76370267f3
commit c6326993df
9 changed files with 175 additions and 26 deletions

View File

@@ -12,6 +12,7 @@ const state = {
hasFetched: false,
},
activeCampaign: {},
campaignHasExecuted: false,
};
const resetCampaignTimers = (
@@ -34,6 +35,7 @@ export const getters = {
getHasFetched: $state => $state.uiFlags.hasFetched,
getCampaigns: $state => $state.records,
getActiveCampaign: $state => $state.activeCampaign,
getCampaignHasExecuted: $state => $state.campaignHasExecuted,
};
export const actions = {
@@ -76,17 +78,37 @@ export const actions = {
);
}
},
startCampaign: async ({ commit }, { websiteToken, campaignId }) => {
const { data: campaigns } = await getCampaigns(websiteToken);
const campaign = campaigns.find(item => item.id === campaignId);
if (campaign) {
commit('setActiveCampaign', campaign);
startCampaign: async (
{
commit,
rootState: {
events: { isOpen },
},
},
{ websiteToken, campaignId }
) => {
// Disable campaign execution if widget is opened
if (!isOpen) {
const { data: campaigns } = await getCampaigns(websiteToken);
// Check campaign is disabled or not
const campaign = campaigns.find(item => item.id === campaignId);
if (campaign) {
commit('setActiveCampaign', campaign);
}
}
},
executeCampaign: async ({ commit }, { campaignId, websiteToken }) => {
try {
await triggerCampaign({ campaignId, websiteToken });
commit('setCampaignExecuted');
commit('setActiveCampaign', {});
} catch (error) {
commit('setError', true);
}
},
resetCampaign: async ({ commit }) => {
try {
commit('setActiveCampaign', {});
} catch (error) {
commit('setError', true);
@@ -107,6 +129,9 @@ export const mutations = {
setHasFetched($state, value) {
Vue.set($state.uiFlags, 'hasFetched', value);
},
setCampaignExecuted($state) {
Vue.set($state, 'campaignHasExecuted', true);
},
};
export default {

View File

@@ -94,14 +94,28 @@ describe('#actions', () => {
it('reset campaign if campaign id is not present in the campaign list', async () => {
API.get.mockResolvedValue({ data: campaigns });
await actions.startCampaign(
{ dispatch, getters: { getCampaigns: campaigns }, commit },
{
dispatch,
getters: { getCampaigns: campaigns },
commit,
rootState: {
events: { isOpen: true },
},
},
{ campaignId: 32 }
);
});
it('start campaign if campaign id passed', async () => {
API.get.mockResolvedValue({ data: campaigns });
await actions.startCampaign(
{ dispatch, getters: { getCampaigns: campaigns }, commit },
{
dispatch,
getters: { getCampaigns: campaigns },
commit,
rootState: {
events: { isOpen: false },
},
},
{ campaignId: 1 }
);
expect(commit.mock.calls).toEqual([['setActiveCampaign', campaigns[0]]]);
@@ -112,7 +126,10 @@ describe('#actions', () => {
const params = { campaignId: 12, websiteToken: 'XDsafmADasd' };
API.post.mockResolvedValue({});
await actions.executeCampaign({ commit }, params);
expect(commit.mock.calls).toEqual([['setActiveCampaign', {}]]);
expect(commit.mock.calls).toEqual([
['setCampaignExecuted'],
['setActiveCampaign', {}],
]);
});
it('sends correct actions if execute campaign API is failed', async () => {
const params = { campaignId: 12, websiteToken: 'XDsafmADasd' };
@@ -121,4 +138,12 @@ describe('#actions', () => {
expect(commit.mock.calls).toEqual([['setError', true]]);
});
});
describe('#resetCampaign', () => {
it('sends correct actions if execute campaign API is success', async () => {
API.post.mockResolvedValue({});
await actions.resetCampaign({ commit });
expect(commit.mock.calls).toEqual([['setActiveCampaign', {}]]);
});
});
});

View File

@@ -129,4 +129,17 @@ describe('#getters', () => {
updated_at: '2021-05-03T04:53:36.354Z',
});
});
it('getCampaignHasExecuted', () => {
const state = {
records: [],
uiFlags: {
isError: false,
hasFetched: false,
},
activeCampaign: {},
campaignHasExecuted: false,
};
expect(getters.getCampaignHasExecuted(state)).toEqual(false);
});
});

View File

@@ -33,4 +33,12 @@ describe('#mutations', () => {
expect(state.activeCampaign).toEqual(campaigns[0]);
});
});
describe('#setCampaignExecuted', () => {
it('set campaign executed flag', () => {
const state = { records: [], uiFlags: {}, campaignHasExecuted: false };
mutations.setCampaignExecuted(state);
expect(state.campaignHasExecuted).toEqual(true);
});
});
});