mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 19:17:48 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.0 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 darkModeMixin from 'widget/mixins/darkModeMixin';
 | |
| import routerMixin from 'widget/mixins/routerMixin';
 | |
| import configMixin from 'widget/mixins/configMixin';
 | |
| 
 | |
| export default {
 | |
|   name: 'Home',
 | |
|   components: {
 | |
|     ArticleHero,
 | |
|     TeamAvailability,
 | |
|     ArticleCardSkeletonLoader,
 | |
|   },
 | |
|   mixins: [configMixin, routerMixin, darkModeMixin],
 | |
|   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) {
 | |
|       let linkToOpen = `${link}?show_plain_layout=true`;
 | |
|       const isDark = this.prefersDarkMode;
 | |
|       if (isDark) {
 | |
|         linkToOpen = `${linkToOpen}&theme=dark`;
 | |
|       }
 | |
|       this.$router.push({
 | |
|         name: 'article-viewer',
 | |
|         params: { link: linkToOpen },
 | |
|       });
 | |
|     },
 | |
|     viewAllArticles() {
 | |
|       const locale = this.defaultLocale;
 | |
|       const {
 | |
|         portal: { slug },
 | |
|       } = window.chatwootWebChannel;
 | |
|       this.openArticleInArticleViewer(`/hc/${slug}/${locale}`);
 | |
|     },
 | |
|   },
 | |
| };
 | |
| </script>
 | 
