mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 19:48:08 +00:00
133 lines
3.8 KiB
Vue
Executable File
133 lines
3.8 KiB
Vue
Executable File
<template>
|
|
<div
|
|
class="z-50 rounded-md w-full flex flex-1 flex-col"
|
|
:class="{ 'pb-2': showArticles, 'justify-end': !showArticles }"
|
|
>
|
|
<div class="px-4 pt-4 w-full">
|
|
<team-availability
|
|
:available-agents="availableAgents"
|
|
:has-conversation="!!conversationSize"
|
|
:unread-count="unreadMessageCount"
|
|
@start-conversation="startConversation"
|
|
/>
|
|
</div>
|
|
<div v-if="showArticles" class="px-4 py-2 w-full">
|
|
<div class="p-4 rounded-md bg-white dark:bg-slate-700 shadow-sm w-full">
|
|
<article-hero
|
|
v-if="
|
|
!articleUiFlags.isFetching &&
|
|
!articleUiFlags.isError &&
|
|
popularArticles.length
|
|
"
|
|
:articles="popularArticles"
|
|
@view="openArticleInArticleViewer"
|
|
@view-all="viewAllArticles"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<div v-if="articleUiFlags.isFetching" class="px-4 py-2 w-full">
|
|
<div class="p-4 rounded-md bg-white dark:bg-slate-700 shadow-sm w-full">
|
|
<article-card-skeleton-loader />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import TeamAvailability from 'widget/components/TeamAvailability.vue';
|
|
import ArticleHero from 'widget/components/ArticleHero.vue';
|
|
import ArticleCardSkeletonLoader from 'widget/components/ArticleCardSkeletonLoader.vue';
|
|
|
|
import { mapGetters } from 'vuex';
|
|
import routerMixin from 'widget/mixins/routerMixin';
|
|
import configMixin from 'widget/mixins/configMixin';
|
|
|
|
export default {
|
|
name: 'Home',
|
|
components: {
|
|
ArticleHero,
|
|
TeamAvailability,
|
|
ArticleCardSkeletonLoader,
|
|
},
|
|
mixins: [configMixin, routerMixin],
|
|
props: {
|
|
hasFetched: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
isCampaignViewClicked: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
},
|
|
computed: {
|
|
...mapGetters({
|
|
availableAgents: 'agent/availableAgents',
|
|
activeCampaign: 'campaign/getActiveCampaign',
|
|
conversationSize: 'conversation/getConversationSize',
|
|
unreadMessageCount: 'conversation/getUnreadMessageCount',
|
|
popularArticles: 'article/popularArticles',
|
|
articleUiFlags: 'article/uiFlags',
|
|
}),
|
|
widgetLocale() {
|
|
return this.$i18n.locale || 'en';
|
|
},
|
|
portal() {
|
|
return window.chatwootWebChannel.portal;
|
|
},
|
|
showArticles() {
|
|
return (
|
|
this.portal &&
|
|
!this.articleUiFlags.isFetching &&
|
|
this.popularArticles.length
|
|
);
|
|
},
|
|
defaultLocale() {
|
|
const widgetLocale = this.widgetLocale;
|
|
const {
|
|
allowed_locales: allowedLocales,
|
|
default_locale: defaultLocale,
|
|
} = this.portal.config;
|
|
|
|
// IMPORTANT: Variation strict locale matching, Follow iso_639_1_code
|
|
// If the exact match of a locale is available in the list of portal locales, return it
|
|
// Else return the default locale. Eg: `es` will not work if `es_ES` is available in the list
|
|
if (allowedLocales.includes(widgetLocale)) {
|
|
return widgetLocale;
|
|
}
|
|
return defaultLocale;
|
|
},
|
|
},
|
|
mounted() {
|
|
if (this.portal && this.popularArticles.length === 0) {
|
|
const locale = this.defaultLocale;
|
|
this.$store.dispatch('article/fetch', {
|
|
slug: this.portal.slug,
|
|
locale,
|
|
});
|
|
}
|
|
},
|
|
methods: {
|
|
startConversation() {
|
|
if (this.preChatFormEnabled && !this.conversationSize) {
|
|
return this.replaceRoute('prechat-form');
|
|
}
|
|
return this.replaceRoute('messages');
|
|
},
|
|
openArticleInArticleViewer(link) {
|
|
this.$router.push({
|
|
name: 'article-viewer',
|
|
params: { link: `${link}?show_plain_layout=true` },
|
|
});
|
|
},
|
|
viewAllArticles() {
|
|
const locale = this.defaultLocale;
|
|
const {
|
|
portal: { slug },
|
|
} = window.chatwootWebChannel;
|
|
this.openArticleInArticleViewer(`/hc/${slug}/${locale}`);
|
|
},
|
|
},
|
|
};
|
|
</script>
|