feat: Hides dismissed campaigns while browsing [cw-33] (#6842)
* Chore: moves localstorage helper as a shared utility and refactors constants * Refactors constants file * feat: Hides dismissed campaigns while browsing * Snoozes all campaigns for an hour after dismissing * Fixes error with date parsing * Snooze ongoing campaigns * Review fixes --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
This commit is contained in:
committed by
GitHub
parent
d95283f5c2
commit
2f2cdd7e7c
@@ -36,6 +36,7 @@ import {
|
|||||||
} from 'shared/helpers/AudioNotificationHelper';
|
} from 'shared/helpers/AudioNotificationHelper';
|
||||||
import { isFlatWidgetStyle } from './settingsHelper';
|
import { isFlatWidgetStyle } from './settingsHelper';
|
||||||
import { popoutChatWindow } from '../widget/helpers/popoutHelper';
|
import { popoutChatWindow } from '../widget/helpers/popoutHelper';
|
||||||
|
import addHours from 'date-fns/addHours';
|
||||||
|
|
||||||
const updateAuthCookie = cookieContent =>
|
const updateAuthCookie = cookieContent =>
|
||||||
Cookies.set('cw_conversation', cookieContent, {
|
Cookies.set('cw_conversation', cookieContent, {
|
||||||
@@ -43,6 +44,14 @@ const updateAuthCookie = cookieContent =>
|
|||||||
sameSite: 'Lax',
|
sameSite: 'Lax',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const updateCampaignReadStatus = () => {
|
||||||
|
const expireBy = addHours(new Date(), 1);
|
||||||
|
Cookies.set('cw_snooze_campaigns_till', Number(expireBy), {
|
||||||
|
expires: expireBy,
|
||||||
|
sameSite: 'Lax',
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const IFrameHelper = {
|
export const IFrameHelper = {
|
||||||
getUrl({ baseUrl, websiteToken }) {
|
getUrl({ baseUrl, websiteToken }) {
|
||||||
return `${baseUrl}/widget?website_token=${websiteToken}`;
|
return `${baseUrl}/widget?website_token=${websiteToken}`;
|
||||||
@@ -147,6 +156,7 @@ export const IFrameHelper = {
|
|||||||
loaded: message => {
|
loaded: message => {
|
||||||
updateAuthCookie(message.config.authToken);
|
updateAuthCookie(message.config.authToken);
|
||||||
window.$chatwoot.hasLoaded = true;
|
window.$chatwoot.hasLoaded = true;
|
||||||
|
const campaignsSnoozedTill = Cookies.get('cw_snooze_campaigns_till');
|
||||||
IFrameHelper.sendMessage('config-set', {
|
IFrameHelper.sendMessage('config-set', {
|
||||||
locale: window.$chatwoot.locale,
|
locale: window.$chatwoot.locale,
|
||||||
position: window.$chatwoot.position,
|
position: window.$chatwoot.position,
|
||||||
@@ -154,6 +164,7 @@ export const IFrameHelper = {
|
|||||||
showPopoutButton: window.$chatwoot.showPopoutButton,
|
showPopoutButton: window.$chatwoot.showPopoutButton,
|
||||||
widgetStyle: window.$chatwoot.widgetStyle,
|
widgetStyle: window.$chatwoot.widgetStyle,
|
||||||
darkMode: window.$chatwoot.darkMode,
|
darkMode: window.$chatwoot.darkMode,
|
||||||
|
campaignsSnoozedTill,
|
||||||
});
|
});
|
||||||
IFrameHelper.onLoad({
|
IFrameHelper.onLoad({
|
||||||
widgetColor: message.config.channelConfig.widgetColor,
|
widgetColor: message.config.channelConfig.widgetColor,
|
||||||
@@ -192,6 +203,10 @@ export const IFrameHelper = {
|
|||||||
updateAuthCookie(widgetAuthToken);
|
updateAuthCookie(widgetAuthToken);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setCampaignReadOn() {
|
||||||
|
updateCampaignReadStatus();
|
||||||
|
},
|
||||||
|
|
||||||
toggleBubble: state => {
|
toggleBubble: state => {
|
||||||
let bubbleState = {};
|
let bubbleState = {};
|
||||||
if (state === 'open') {
|
if (state === 'open') {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { mapGetters, mapActions } from 'vuex';
|
import { mapGetters, mapActions } from 'vuex';
|
||||||
import { setHeader } from 'widget/helpers/axios';
|
import { setHeader } from 'widget/helpers/axios';
|
||||||
|
import addHours from 'date-fns/addHours';
|
||||||
import { IFrameHelper, RNHelper } from 'widget/helpers/utils';
|
import { IFrameHelper, RNHelper } from 'widget/helpers/utils';
|
||||||
import configMixin from './mixins/configMixin';
|
import configMixin from './mixins/configMixin';
|
||||||
import availabilityMixin from 'widget/mixins/availability';
|
import availabilityMixin from 'widget/mixins/availability';
|
||||||
@@ -50,6 +51,7 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
isMobile: false,
|
isMobile: false,
|
||||||
|
campaignsSnoozedTill: undefined,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -179,11 +181,19 @@ export default {
|
|||||||
this.executeCampaign({ campaignId, websiteToken, customAttributes });
|
this.executeCampaign({ campaignId, websiteToken, customAttributes });
|
||||||
this.replaceRoute('messages');
|
this.replaceRoute('messages');
|
||||||
});
|
});
|
||||||
|
bus.$on('snooze-campaigns', () => {
|
||||||
|
const expireBy = addHours(new Date(), 1);
|
||||||
|
this.campaignsSnoozedTill = Number(expireBy);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
setCampaignView() {
|
setCampaignView() {
|
||||||
const { messageCount, activeCampaign } = this;
|
const { messageCount, activeCampaign } = this;
|
||||||
|
const shouldSnoozeCampaign =
|
||||||
|
this.campaignsSnoozedTill && this.campaignsSnoozedTill > Date.now();
|
||||||
const isCampaignReadyToExecute =
|
const isCampaignReadyToExecute =
|
||||||
!isEmptyObject(activeCampaign) && !messageCount;
|
!isEmptyObject(activeCampaign) &&
|
||||||
|
!messageCount &&
|
||||||
|
!shouldSnoozeCampaign;
|
||||||
if (this.isIFrame && isCampaignReadyToExecute) {
|
if (this.isIFrame && isCampaignReadyToExecute) {
|
||||||
this.replaceRoute('campaigns').then(() => {
|
this.replaceRoute('campaigns').then(() => {
|
||||||
this.setIframeHeight(true);
|
this.setIframeHeight(true);
|
||||||
@@ -243,6 +253,7 @@ export default {
|
|||||||
this.fetchAvailableAgents(websiteToken);
|
this.fetchAvailableAgents(websiteToken);
|
||||||
this.setAppConfig(message);
|
this.setAppConfig(message);
|
||||||
this.$store.dispatch('contacts/get');
|
this.$store.dispatch('contacts/get');
|
||||||
|
this.setCampaignReadData(message.campaignsSnoozedTill);
|
||||||
} else if (message.event === 'widget-visible') {
|
} else if (message.event === 'widget-visible') {
|
||||||
this.scrollConversationToBottom();
|
this.scrollConversationToBottom();
|
||||||
} else if (message.event === 'change-url') {
|
} else if (message.event === 'change-url') {
|
||||||
@@ -320,6 +331,11 @@ export default {
|
|||||||
sendRNWebViewLoadedEvent() {
|
sendRNWebViewLoadedEvent() {
|
||||||
RNHelper.sendMessage(loadedEventConfig());
|
RNHelper.sendMessage(loadedEventConfig());
|
||||||
},
|
},
|
||||||
|
setCampaignReadData(snoozedTill) {
|
||||||
|
if (snoozedTill) {
|
||||||
|
this.campaignsSnoozedTill = Number(snoozedTill);
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { IFrameHelper } from 'widget/helpers/utils';
|
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
import configMixin from '../mixins/configMixin';
|
import configMixin from '../mixins/configMixin';
|
||||||
import { ON_UNREAD_MESSAGE_CLICK } from '../constants/widgetBusEvents';
|
import { ON_UNREAD_MESSAGE_CLICK } from '../constants/widgetBusEvents';
|
||||||
@@ -84,9 +83,7 @@ export default {
|
|||||||
bus.$emit(ON_UNREAD_MESSAGE_CLICK);
|
bus.$emit(ON_UNREAD_MESSAGE_CLICK);
|
||||||
},
|
},
|
||||||
closeFullView() {
|
closeFullView() {
|
||||||
if (IFrameHelper.isIFrame()) {
|
this.$emit('close');
|
||||||
IFrameHelper.sendMessage({ event: 'toggleBubble' });
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
getMessageContent(message) {
|
getMessageContent(message) {
|
||||||
const { attachments, content } = message;
|
const { attachments, content } = message;
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<unread-message-list :messages="messages" />
|
<unread-message-list :messages="messages" @close="closeFullView" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
|
import { IFrameHelper } from 'widget/helpers/utils';
|
||||||
import UnreadMessageList from '../components/UnreadMessageList.vue';
|
import UnreadMessageList from '../components/UnreadMessageList.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -24,5 +25,16 @@ export default {
|
|||||||
];
|
];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
closeFullView() {
|
||||||
|
if (IFrameHelper.isIFrame()) {
|
||||||
|
IFrameHelper.sendMessage({
|
||||||
|
event: 'setCampaignReadOn',
|
||||||
|
});
|
||||||
|
IFrameHelper.sendMessage({ event: 'toggleBubble' });
|
||||||
|
bus.$emit('snooze-campaigns');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<unread-message-list :messages="messages" />
|
<unread-message-list :messages="messages" @close="closeFullView" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
|
import { IFrameHelper } from 'widget/helpers/utils';
|
||||||
import UnreadMessageList from '../components/UnreadMessageList.vue';
|
import UnreadMessageList from '../components/UnreadMessageList.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -16,5 +17,12 @@ export default {
|
|||||||
messages: 'conversation/getUnreadTextMessages',
|
messages: 'conversation/getUnreadTextMessages',
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
closeFullView() {
|
||||||
|
if (IFrameHelper.isIFrame()) {
|
||||||
|
IFrameHelper.sendMessage({ event: 'toggleBubble' });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user