|
|
<template> <div class="NavBar tw-bg-white tw-sticky tw-top-0 tw-left-0 tw-w-full tw-border-0 tw-border-b tw-border-solid tw-border-neutral-200 tw-z-10" > <div class="tw-px-[20px] tw-py-[20px] md:tw-px-[30px] md:tw-py-[24px] xl:tw-px-[60px] xl:tw-pt-[22px] xl:tw-pb-[14px] xl:tw-max-w-[1366px] xl:tw-mx-auto" > <div class="tw-flex tw-justify-between tw-items-center xl:tw-h-[48px]"> <div class="tw-flex tw-items-center tw-flex-grow xl:tw-grid xl:tw-grid-cols-[188px_auto] xl:tw-gap-[30px] xl:tw-basis-[70%]" > <img class="tw-mr-[20px] md:tw-mr-[40px] xl:tw-hidden" :src="require('@/assets/svg/menu.svg')" @click="clickMenu" /> <nuxt-link :to="localePath('/')" class="tw-block tw-w-[146px] md:tw-w-[188px]" ><img :src="require('@/assets/svg/logo_v2.svg')" class="tw-w-full" alt="" /> </nuxt-link> <!-- <v-card class="tw-hidden flex-row rounded-lg py-1 px-4 xl:tw-flex xl:tw-ml-[30px]" outlined v-if="showNavSearch" @click="bigSearch = true"> <v-card flat color="transparent" :width="$vuetify.breakpoint.mdAndDown ? '70px' : '300px'" class="my-auto neutrals--text text--darken-3 text-size-14"> {{ this.$vuetify.breakpoint.mdAndDown ? $t("Looking ?") : $t("What are you looking for?") }} </v-card> <svg width="24" height="24" class="tw-my-auto" shape-rendering="geometricPrecision"> <image xlink:href="@/assets/svg/icon-search-small.svg" src="@/assets/svg/icon-search-small.svg" width="24" height="24" /> </svg> </v-card> --> <div v-if="showNavSearch" class="tw-w-full tw-hidden xl:tw-block" style="border: 1px solid red;"> <Search v-if="showNavSearch" :exhibitionsCategories="exhibitionsCategories" :exhibitionsLocations="exhibitionsLocations" :exhibitionsSearchs="exhibitionsSearchs" :servicesLocations="servicesLocations" :servicesSearchs="servicesSearchs" @keyword-search="Search" /> <!-- @loaading="Search" --> </div>
</div> <div class="tw-basis-[46%] md:tw-basis-[66%] xl:tw-basis-[43%] xl:tw-ml-[56px]" v-click-outside="clickOutSide" > <div class="tw-flex tw-justify-end xl:tw-hidden"> <div class="tw-flex tw-justify-center tw-items-center"> <v-img max-width="24" class="mr-4 float-left" contain :src="require('@/assets/svg/search-black.svg')" @click="clickSearch" ></v-img> </div> <!--v-img max-width="24" class="mr-4 hidden-md-and-up" contain :src="require('@/assets/svg/shopping-bag.svg')" ></v-img--> <span max-width="28px" v-if="$auth.$state.loggedIn"> <v-menu offset-y bottom left nudge-bottom="20" class="neutrals darken-1 mt-4 on-top" > <template v-slot:activator="{ on, attrs }"> <v-btn v-bind="attrs" v-on="on" @click="UserInfoPopup = true" v-if="$auth.$storage.getUniversal('userPicture')" icon width="28px" height="28px" class="ms-2" > <v-img :src="userPicture" max-width="28px" max-height="28px" class="rounded-circle" :key="userPicture" ></v-img> </v-btn> <v-btn v-bind="attrs" v-on="on" @click="UserInfoPopup = true" v-else-if=" $auth.$storage.getUniversal('userLastName') != undefined " fab class="user-no-picture-border mx-2 tw-shadow-none" color="primary" width="28" height="28" > <span class="tw-text-[16px]"> {{ $auth.$storage.getUniversal("userLastName") }} </span> </v-btn> <div v-else class="tw-bg-primary-default tw-cursor-pointer tw-rounded-[12px] tw-whitespace-nowrap tw-block tw-text-white tw-px-[16px] tw-py-[9px] tw-whitespace-nowrap tw-text-[10px] tw-font-medium tw-transition-all tw-duration-200 tw-ease-in-out hover:tw-bg-primary-light" @click="toUser" > {{ $t("Log in/Sign up") }} </div> </template> <div class="neutrals darken-1 tw-hidden xl:tw-block"> <v-btn :to=" localePath( $auth.$storage.getUniversal('authtoken') ? '/user' : '' ) " class="neutrals darken-1 neutrals--text text--darken-5 no-text-transform elevation-0 text-size-14" > <unicon class="mr-3" name="user" height="20px" fill="neutrals-darken5" />{{ $t("Profile") }} </v-btn> <v-btn @click="logout" class="neutrals darken-1 warning--text no-text-transform elevation-0" > <unicon class="mr-3 text-size-14" name="signout" height="20px" fill="#EF5A5A" />{{ $t("Logout") }} </v-btn> </div> <!-- <v-list class="neutrals darken-1 tw-hidden xl:tw-block"> <v-list-item> <v-btn :to=" localePath( $auth.$storage.getUniversal('authtoken') ? `/user/${ $auth.$storage.getUniversal('authtoken').user_id }`
: '' ) " class="neutrals darken-1 neutrals--text text--darken-5 no-text-transform elevation-0 text-size-14"> <unicon class="mr-3" name="user" height="20px" fill="neutrals-darken5" />{{ $t("Profile") }} </v-btn> </v-list-item> <v-list-item> <v-btn @click="logout" class="neutrals darken-1 warning--text no-text-transform elevation-0"> <unicon class="mr-3 text-size-14" name="signout" height="20px" fill="#EF5A5A" />{{ $t("Logout") }} </v-btn> </v-list-item> </v-list> --> </v-menu> </span> <span v-else> <nuxt-link :to="localePath('/user')"> <img class="" :src="require('@/assets/svg/profile.svg')" /> </nuxt-link> </span> </div> <div class="tw-hidden xl:tw-flex xl:tw-justify-end xl:tw-items-center" > <v-btn v-if="$i18n.locale == 'zh-tw'" depressed class="remove-upper tw-mx-0 tw-px-0 tw-bg-transparent tw-text-primary-default" href="https://medium.com/showeasy" target="_blank" > {{ $t("Blog") }} </v-btn> <v-btn v-else depressed class="remove-upper tw-mx-0 tw-px-0 tw-bg-transparent tw-text-primary-default" href="https://medium.com/showeasy-eng" target="_blank" > {{ $t("Blog") }} </v-btn> <div :class="[ 'changeLang tw-relative tw-justify-center tw-items-center', disabled ? 'disabled' : '', disabled ? 'tw-text-neutrals-300' : 'tw-text-black', ]" > <div :class="[ 'tw-flex tw-items-center tw-mx-[12px] tw-cursor-pointer tw-py-[8px] tw-rounded-[4px]', ]" > <div class="tw-body-3 tw-mr-[15px] t16 tw-font-normal"> {{ $i18n.localeProperties["title"] }} </div> <img v-if="disabled" src="@/assets/svg/down-arrow-disabled.svg" /> <img v-else src="@/assets/svg/down-arrow.svg" /> </div> <transition name="lang"> <div v-show="langShow" class="tw-rounded-[10px] tw-bg-white tw-px-[12px] tw-py-[8px] tw-absolute tw-top-[40px] tw-w-max tw-left-0 tw-z-10 tw-shadow-[0_2px_20px_rgba(0,0,0,0.15)]" > <!-- <button class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[25px] tw-px-[12px] tw-py-[11px] tw-w-full tw-bg-white hover:tw-bg-primary-pale hover:tw-text-primary-1 hover:tw-rounded-[10px]" @click="Currencystatus('USD')" > <div class="tw-body-4 tw-font-bold" value="USD">USD</div> <div class="tw-body-4 tw-text-left">{{ $t("U.S. Dollar") }}</div> </button> --> <nuxt-link v-for="(lang, idx) in this.$i18n.locales" :key="idx" class="tw-rounded-[10px] text-decoration-none tw-body-3 tw-w-full" :to="switchLocalePath(lang.code)" > <div class="tw-px-[12px] tw-py-[11px] tw-w-full tw-bg-white tw-font-normal tw-text-black hover:tw-bg-primary-pale hover:tw-text-primary-1 hover:tw-rounded-[10px]"> {{ lang.text }} </div> </nuxt-link> </div> </transition> </div> <!-- <v-menu offset-y class="on-top"> <template v-slot:activator="{ on, attrs }"> <v-btn v-bind="attrs" v-on="on" depressed class="white neutrals--text text--darken-5 no-text-transform tw-body-3 tw-font-normal" > {{ $i18n.localeProperties["title"] }} <img src="@/assets/svg/down-arrow.svg" alt="" class="ml-1" /> </v-btn> </template> <v-list class="tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]"> <v-list-item v-for="(lang, idx) in this.$i18n.locales" :key="idx" class="tw-mx-auto" > <nuxt-link :to="switchLocalePath(lang.code)" class="tw-rounded-[10px] tw-text-base-primary text-decoration-none tw-body-3 tw-font-normal tw-w-full tw-px-[12px] tw-py-[8px] hover:tw-bg-primary-3 hover:tw-text-primary-1" > {{ lang.text }} </nuxt-link> </v-list-item> </v-list> </v-menu> --> <changeCurrency></changeCurrency> <nuxt-link class="tw-px-[10px] tw-mr-[10px] hover:tw-bg-primary-3 active:tw-bg-primary-3" :to="localePath('/FAQ')" ><img src="~/assets/svg/faq.svg" alt="" /></nuxt-link> <!-- <v-btn depressed class="white tw-mr-[16px]" :to="localePath('/FAQ')" > <svg width="20" height="20"> <image xlink:href="@/assets/svg/help-circle.svg" src="@/assets/svg/help-circle.svg" width="20" height="20" /> </svg> </v-btn> --> <!-- <v-btn depressed class="white" small> <img src="@/assets/svg/shopping-bag.svg" alt="" /> </v-btn> -->
<div v-if="$auth.$state.loggedIn" class="tw-relative"> <div @click="UserInfoPopup = true" v-if="$auth.$storage.getUniversal('userPicture')" class="ms-2 tw-bg-primary-default tw-w-[28px] tw-h-[28px] tw-rounded-[28px]"> <v-img v-if="userPicture" :src="userPicture" class="tw-rounded-[28px] tw-w-[28px] tw-h-[28px] tw-flex tw-items-center tw-cursor-pointer" alt="" /> </div> <v-btn @click="UserInfoPopup = true" v-else-if=" $auth.$storage.getUniversal('userLastName') != undefined " fab :class="['mx-2 tw-shadow-none tw-bg-primary-default',($auth.$storage.getUniversal('userLastName')!=undefined && $auth.$storage.getUniversal('userLastName') && $auth.$storage.getUniversal('userLastName').length>1)?'tw-w-[40px] tw-rounded-[20px]':'tw-w-[28px] tw-rounded-[28px]']" color="primary" height="28" > <span :class="[($auth.$storage.getUniversal('isLetter')!=undefined && $auth.$storage.getUniversal('isLetter')==false)?'tw-text-[16px]':'tw-text-[12px]']"> {{ $auth.$storage.getUniversal("userLastName") }} </span> </v-btn> <div v-else class="tw-bg-primary-default tw-cursor-pointer tw-rounded-[12px] tw-whitespace-nowrap tw-block tw-text-white tw-px-[16px] tw-py-[9px] tw-whitespace-nowrap tw-text-[10px] tw-font-medium tw-transition-all tw-duration-200 tw-ease-in-out hover:tw-bg-primary-light" @click="toUser" > {{ $t("Log in/Sign up") }} </div> <div :class="[ 'tw-grid-cols-1 tw-gap-[14px] tw-px-[10px] tw-py-[8px] tw-bg-white tw-rounded-[10px] tw-w-max tw-absolute tw-right-0 tw-top-[40px] tw-z-50 tw-shadow-[0_1px_4px_0_rgba(0,0,0,0.3)]', UserInfoPopup && width >= 1366 ? 'tw-grid' : 'tw-hidden', ]" > <nuxt-link :to=" localePath('/user/editPersonalInfo')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false" ><img src="~/assets/svg/profile.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t("userProfile.profile") }} </div> </nuxt-link> <nuxt-link :to="localePath('/user/myBooking')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false" ><img src="~/assets/svg/bookings.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t('My Bookings')}} </div> </nuxt-link> <nuxt-link :to="localePath('/user/saveExhibition')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false" ><img src="~/assets/svg/saveExhibition.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t("userProfile.savedExhibitions") }} </div> </nuxt-link> <!-- <nuxt-link :to="localePath('/user/saveService')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false"><img src="~/assets/svg/saveService.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t("userProfile.savedServices") }} </div> </nuxt-link> --> <nuxt-link :to="localePath('/user/companyInfo')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false" ><img src="~/assets/svg/companyInfo.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t("userProfile.companyInfo") }} </div> </nuxt-link> <nuxt-link :to="localePath('/user/contactInfo')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false" ><img src="~/assets/svg/contactInfo.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t("Contact Info") }} </div> </nuxt-link> <nuxt-link :to="localePath('/user/setting')" class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click.native="UserInfoPopup = false" ><img src="~/assets/svg/profile_setting.svg" alt="" /> <div class="tw-head-body tw-text-base-primary"> {{ $t("userProfile.setting") }} </div> </nuxt-link> <div class="tw-border tw-border-t tw-border-solid tw-border-neutral-200" ></div> <button class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]" @click="logout" > <img src="~/assets/svg/logout.svg" alt="" /> <div class="tw-flex tw-head-body tw-text-error-default tw-justify-start" > {{ $t("userProfile.logout") }} </div> </button> </div> </div>
<div v-else> <div @click="toUser" class="tw-text-[14px] tw-cursor-pointer tw-whitespace-nowrap tw-text-white tw-bg-primary-default tw-px-[16px] tw-py-[9px] tw-rounded-[12px] hover:tw-bg-primary-light" > {{ $t("Log in/Sign up") }}</div > </div> </div> </div> </div> <div ref="dropdown" :class="[ 'navBar-row2 tw-relative tw-hidden xl:tw-grid xl:tw-mt-[35px] tw-transition-all tw-duration-200 tw-delay-75 tw-ease-linear', ]" > <div class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-3" @mouseleave="exhibitionActiveIndex = 0" > <a :href="localePath('/exhibition')" @click="isPageLoading = true" :class="[ 'tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default', $route.path.match('\/exhibition') ? 'tw-text-primary-default' : '', ]" > {{ $t("Exhibition") }}</a > <div v-if="exhibitionsCategoryList.length>0" class="customDropMenu exhibition tw-bg-white tw-p-[20px] tw-rounded-[10px] tw-w-max tw-absolute tw-top-[36px] tw-left-0 tw-mt-[10px] tw-overflow-hidden tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]" > <div class="tw-relative tw-grid tw-grid-cols-2 tw-max-w-[700px] tw-min-h-[110px] tw-overflow-hidden" > <div class="tw-list-none tw-overflow-x-hidden tw-overflow-y-auto tw-h-auto tw-break-inside-avoid tw-grid tw-grid-cols-1 tw-gap-[10px]" > <div class="tw-list-none tw-mr-[20px]" v-for="(item, index) in exhibitionsCategoryList" :key="index" @mouseover="exhibitionActiveIndex = index" > <div :class="[ 'exhibitionDropdownLink tw-grid tw-grid-cols-[30px_auto] tw-gap-[10px] tw-body-4 tw-font-normal hover:tw-text-primary-default', exhibitionActiveIndex == index ? 'tw-text-primary-default active' : 'tw-text-neutrals-900', ]" > <img v-if="exhibitionListIcon[index] !== undefined" :src=" require(`@/assets/img/CategoryIcon/${exhibitionListIcon[index]}.png`) " /><span class="tw-flex tw-items-center tw-min-w-[322px]">{{ $t(item.CategoryName) }}</span> </div> </div> </div> <div class="tw-w-full tw-overflow-x-hidden tw-overflow-y-auto" v-if="exhibitionsCategoryList.length>0"> <ul class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[20px] tw-px-[20px]" > <li class="tw-list-none"> <a :href=" localePath( `/exhibition?category=${exhibitionsCategoryList[exhibitionActiveIndex].CategoryID}` ) " class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default" >{{ $t("All") }}</a > </li> <template v-if="exhibitionsCategoryList[ exhibitionActiveIndex ].SubCategoryList && exhibitionsCategoryList[ exhibitionActiveIndex ].SubCategoryList.length>0"> <li v-for="(sub, index) in exhibitionsCategoryList[ exhibitionActiveIndex ].SubCategoryList" :key="index" class="tw-list-none" > <a :href="localePath(`/exhibition?subcategory=${sub.CategoryID}`)" class="tw-block tw-min-h-[30px] tw-body-4 tw-font-normal tw-min-w-[230px] tw-text-neutral-800 hover:tw-text-primary-default" >{{ sub.CategoryName }}</a > </li></template> </ul> </div> </div> </div> </div> <span class="vertical-line"></span> <div class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-3" > <a :href="localePath(`/service`)" :class="[ 'tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default', $route.path.match('\/service') ? 'tw-text-primary-default' : '', ]" > {{ $t("All Services") }}</a > <div v-if="serviceCategoryList.length>0" class="customDropMenu services tw-bg-white tw-p-[20px] tw-rounded-[10px] tw-w-max tw-absolute tw-top-[36px] tw-left-0 tw-mt-[10px] -tw-mb-[60px] tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]" > <ul v-for="(item, index) in serviceCategoryList" :key="item.CategoryID" class="tw-list-none tw-mb-0 tw-mr-[40px] tw-h-auto tw-break-inside-avoid" > <li class="tw-list-none"> <a :href="localePath(`/service?category=${item.CategoryID}`)" class="tw-block tw-mb-[16px] tw-grid tw-grid-cols-[16px_auto] tw-gap-[10px] tw-body-4 tw-font-normal tw-text-primary-default hover:tw-text-primary-default" > <svg width="16" height="16" class="tw-my-auto" shape-rendering="geometricPrecision" v-if="serviceListIcon[index] !== undefined" > <image :xlink:href=" require(`@/assets/svg/${serviceListIcon[index]}.svg`) " :src=" require(`@/assets/svg/${serviceListIcon[index]}.svg`) " width="16" height="16" /> </svg> <div v-else></div> <span>{{ item.CategoryName }}</span> </a> <ul class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[16px] tw-p-0" > <li v-for="(sub, index) in item.SubCategoryList" :key="index" class="tw-list-none" > <a :href="localePath(`/service?subcatg=${sub.CategoryID}`)" class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default" >{{ sub.CategoryName }}</a > </li> </ul> </li> <div class="tw-h-[60px]"></div> </ul> </div> </div> <div ref="headerSwiper" class="swiper-container headerService tw-w-full tw-overflow-hidden tw-relative tw-max-w-[1008px] tw-ml-[25px] tw-transition-all tw-duration-200 tw-delay-75 tw-ease-in" > <div class="swiper-wrapper"> <div class="swiper-slide customMenuLink tw-relative tw-justify-start tw-items-center tw-w-auto" v-for="item in serviceList" :key="item.id" > <a :href="localePath(`/service?taiwan=${item.id}`)" class="tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default tw-whitespace-nowrap" >{{ $t(item.name) }}</a > <ul v-if="item.SubServiceList && item.SubServiceList.length>0" class="customDropMenu oneType tw-grid-cols-1 tw-gap-[16px] tw-bg-white tw-p-[20px] tw-rounded-[10px] tw-w-max tw-absolute tw-top-[36px] tw-left-0 tw-mt-[10px] tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]" > <li v-for="(sub, index) in item.SubServiceList" :key="index" class="tw-list-none" > <a :href="localePath(`/service?subcatg=${sub.id}`)" class="tw-block tw-body-4 tw-font-normal tw-text-black hover:tw-text-primary-default" >{{ sub.name }}</a > </li> </ul> </div> </div> <div :class="[ 'swiper-button-prev headerService tw-text-black tw-hidden', headerServiceSwiper ? 'xl:tw-flex xl:tw-justify-center xl:tw-items-center' : '', ]" ></div> <div :class="[ 'swiper-button-next headerService tw-text-black tw-hidden', headerServiceSwiper ? 'xl:tw-flex xl:tw-justify-center xl:tw-items-center' : '', ]" ></div> </div> </div> </div> <Drawer :serviceCategory.sync="serviceCategoryList" :exhibitionsCategory.sync="exhibitionsCategoryList" :serviceListIcon="serviceListIcon" :exhibitionListIcon="exhibitionListIcon" @changeLang="changeLang()" /> <SearchDialog ref="searchDialog" :exhibitionsCategoryList="exhibitionsCategoryList" :exhibitionsLocations="exhibitionsLocations" :exhibitionListIcon="exhibitionListIcon" :exhibitionsCategories="exhibitionsCategories" :servicesLocations="servicesLocations" :servicesSearchs="servicesSearchs" :populars="populars" @loaading="isPageLoading = true" /> <mobileUserInfoPopup v-show="width < 1366" :show="UserInfoPopup" :width="width" @popup="UserInfoPopup = $event" > </mobileUserInfoPopup> <loading :isLoading="isPageLoading"></loading> </div> </template> <script> import Search from "@/components/home/headerInlineSearch"; import Drawer from "@/components/newDrawer"; import SearchDialog from "@/components/SearchDialog"; import mobileUserInfoPopup from "@/components/mobileUserInfoPopup.vue"; import { SettingsIcon } from "vue-feather-icons"; // import jwt_decode from "authtoken-decode";
import loading from "@/components/newComponent/loading/loading.vue"; import changeCurrency from "@/components/dropdown/changeCurrencyWeb.vue"; import Swiper from "swiper/bundle"; // import { getCurrentTime } from "~/utils/assist";
import { getFirstName } from "~/utils/common";
// import { handler } from "@tailwindcss/line-clamp";
export default { components: { Drawer, Search, SettingsIcon, SearchDialog, mobileUserInfoPopup, loading, changeCurrency, Swiper, }, data() { return { disabled: true, langShow: false, show: false, bigSearch: false, userPicture: "", showNavSearch: true, servicesSearchs: [], servicesLocations: [], serviceCategoryList: [], serviceList: [{ id: 'taiwan', name: 'Onsite Service', SubServiceList: [] }], serviceListIcon: [ "Booth", "Exhibit", "event", "Marketing", "journey", "human", "service_others", ], exhibitionsCategoryList: [], exhibitionsSearchs: [], exhibitionsLocations: [], exhibitionsCategories: [], exhibitionListIcon: [ "rawMaterial", "aeroSpace", "energy", "autoMobile", "electronics", "contrucstion", "security", "Machinary", "Medical", "education", "textile", "food", "entertainment", "consumer", "others", ], populars: {}, exhibitionActiveIndex: 0, width: undefined, drawer: false, group: null, isPageLoading: false, UserInfoPopup: false, headerServiceSwiper: null, offsetLeft: 0, top: 0, TAIWAN_ID: 18, JAPAN_ID: 16, ITALY_ID: 31, }; }, async created() { if (process.client) { this.width = window.innerWidth; } if (!this.$route) return; if (!this.$route.name) return; const [path, lang] = this.$route.name.split("___"); if (path == "index") { this.showNavSearch = false; } else { this.showNavSearch = true; } if (this.$auth.loggedIn) { this.$auth.$storage.setUniversal('userPicture',"/"); } await this.fetchUser(); // this.socialRegister();
// this.getServiceCategory();
// this.getExhibitionsCategory();
// this.getServiceHistory();
// this.getExhibitionsHistory();
// this.getServiceLocations();
// this.getExhibitionsLocations();
await this.getExhibitionsCategories(); await this.getAllServiceCategories(); await this.getLocations(); // this.getExhibitionsCollections();
// this.getPopulars();
}, mounted() { let vm = this; vm.$nextTick(function () { window.addEventListener("resize", this.onResize); vm.initSwiper(); }); }, beforeDestroy() { window.removeEventListener("resize", this.onResize); }, computed: { windowWidth() { if (process.client) { this.width = window.innerWidth; } return this.width; }, pictureStatus() { return this.$store.getters.getPictureStatus; }, registerStatus() { return this.$store.getters.getRegisterStatus; }, lang() { return this.$i18n.localeProperties["langQuery"]; }, }, watch: { group: { handler: function () { this.drawer = false; }, }, $route: { handler: function (to, from) { if (!to) return; if (!to.name) return; const [path, lang] = to.name.split("___"); if (path == "index") { this.showNavSearch = false; } else { this.showNavSearch = true; } if (path === "exhibition") { this.isPageLoading = false; } if (path === "service") { this.isPageLoading = false; }
if (to != from) { this.bigSearch = false; } }, }, pictureStatus: { handler: async function (newVal, oldVal) { await this.fetchUser(); this.$forceUpdate(); }, }, registerStatus: { handler: function (newVal, oldVal) { // this.socialRegister();
}, }, lang: { handler: async function (newVal, oldVal) { if (newVal != oldVal) { this.$refs.dropdown.style.opacity = 0; // this.getServiceCategory();
// this.getExhibitionsCategory();
// this.getServiceHistory();
// this.getExhibitionsHistory();
// this.getServiceLocations();
// this.getExhibitionsLocations();
await this.getExhibitionsCategories(); await this.getAllServiceCategories(); await this.getLocations(); // this.getExhibitionsCollections();
this.initSwiper(); } }, }, }, methods: { Search(str) { console.log(str)
const currentVal = this.$route.query.q;
if(currentVal === str){ this.isPageLoading = false }else{ this.isPageLoading = true }
// setTimeout(()=> {
// this.isPageLoading = false
// },3000);
}, clickOutSide() { this.show = false; this.UserInfoPopup = false; }, onResize() { if (process.client) { this.width = window.innerWidth; } }, clickMenu() { if (this.windowWidth < 1366) { this.$store.dispatch("toggleDrawer", true); } }, clickSearch() { this.$store.dispatch("toggleSearchDialog", true); }, initSwiper() { let vm = this; vm.$nextTick(function () { vm.headerServiceSwiper = new Swiper(".swiper-container.headerService", { direction: "horizontal", initialSlide: 0, observer: true, observeParents: true, rebuildOnUpdate: true, slidesPerView: "auto", spaceBetween: 25, watchSlidesVisibility: true, slideVisibleClass: "swiper-slide-visible", allowTouchMove: false, navigation: { nextEl: ".swiper-button-next.headerService", prevEl: ".swiper-button-prev.headerService", }, }); vm.headerServiceSwiper.init(); vm.headerServiceSwiper.update(); // this.$refs.headerSwiper.style.opacity = 1;
vm.$refs.dropdown.style.opacity = 1; }); }, async fetchUser() { if (this.$auth.loggedIn) { await this.$axios .get(`/trending/api/members/info`) .then((response) => { if(response && response.data && response.data.DATA && response.data.DATA.rel){ let data = response.data.DATA.rel if(data){ if(data.MemberPicture){ this.userPicture = data.MemberPicture; this.$auth.$storage.setUniversal("userPicture", data.MemberPicture); }else{ this.userPicture = ""; this.$auth.$storage.removeUniversal("userPicture"); } if(data.LastName){ let arr = getFirstName(data.LastName,this.$i18n.localeProperties["langQuery"]); let name = arr[0]; let isLetter = arr[1]; this.$auth.$storage.setUniversal("userLastName", name); this.$auth.$storage.setUniversal("isLetter", isLetter); }else{ this.$auth.$storage.removeUniversal("isLetter"); this.$auth.$storage.removeUniversal("userLastName"); } } } }) .catch((error) => { console.log(error) }); } }, async getAllServiceCategories() { await this.$axios .get(`/trending/api/Onsite/Categories?Lang=${this.$i18n.localeProperties["langQuery"]}`) .then((response) => { if(response && response.data && response.data.DATA && response.data.DATA.rel){ let data = response.data.DATA.rel if(data.length>0){ this.serviceCategoryList = data; } } }) .catch((error) => console.log(error) ); }, // getExhibitionsCategory() {
// this.$axios
// .get(
// `/t/exhibitions/categories?lang=${this.$i18n.localeProperties["langQuery"]}&sort=true`
// )
// .then((result) => {
// this.exhibitionsCategoryList = result.data.sort_results;
// this.exhibitionsCategoryList = this.exhibitionsCategoryList.map(
// (item) => {
// item.subcategories_list = item.subcategories_list.map(
// (children) => {
// return {
// id: children.subcategory_id,
// title: children.subcategory_name,
// key: children.subcategory_name,
// type: "subcategory",
// };
// }
// );
// return {
// id: item.categories_id,
// title: item.category_name,
// key: item.category_name,
// type: "category",
// subcategory: item.subcategories_list,
// };
// }
// );
// })
// .catch((err) => {
// console.log(err);
// });
// },
// getServiceHistory() {
// this.$axios
// .get(
// `/trending/services/search/history?lang=${this.$i18n.localeProperties["langQuery"]}`
// )
// .then((response) => {
// this.servicesSearchs = response.data.searches;
// })
// .catch((error) => console.log(error));
// },
// getExhibitionsHistory() {
// this.$axios
// .get(
// `/trending/exhibitions/search/history?lang=${this.$i18n.localeProperties["langQuery"]}`
// )
// .then((response) => {
// this.exhibitionsSearchs = response.data.searches;
// })
// .catch((error) => console.log(error));
// },
// getServiceLocations() {
// this.$axios
// .get(
// `/trending/services/locations?lang=${this.$i18n.localeProperties["langQuery"]}`
// )
// .then((response) => {
// this.servicesLocations = response.data.locations;
// })
// .catch((error) => console.log(error));
// },
// getExhibitionsLocations() {
// this.$axios
// .get(
// `/trending/exhibitions/locations?lang=${this.$i18n.localeProperties["langQuery"]}`
// )
// .then((response) => {
// this.exhibitionsLocations = response.data.locations;
// })
// .catch((error) => console.log(error));
// },
async getExhibitionsCategories() { await this.$axios .get(`/trending/api/Exhibition/Categories?Lang=${this.$i18n.localeProperties["langQuery"]}`) .then((response) => { if(response && response.data && response.data.DATA && response.data.DATA.rel){ let data = response.data.DATA.rel if(data.length>0){ this.exhibitionsCategoryList = data; this.exhibitionsCategories = data; } } }) .catch((error) => console.log(error) ); }, getLocations() { this.$axios .get(`/trending/api/Exhibition/Locations?Lang=${this.$i18n.localeProperties["langQuery"]}`) .then((response) => { if(response && response.data && response.data.DATA && response.data.DATA.rel){ let data = response.data.DATA.rel if(data){ this.exhibitionsLocations = data; } } }) .catch((error) => console.log(error) ); }, // getExhibitionsCollections() {
// this.$axios
// .get(
// `/trending/exhibitions/collections?lang=${this.$i18n.localeProperties["langQuery"]}`
// )
// .then((response) => {
// this.collections = response.data.collections;
// })
// .catch((error) => console.log(error));
// },
async changeLang() { // this.getServiceCategory();
// this.getExhibitionsCategory();
// this.getServiceHistory();
// this.getExhibitionsHistory();
// this.getServiceLocations();
// this.getExhibitionsLocations();
await this.getExhibitionsCategories(); // this.getExhibitionsCollections();
}, async getPopulars() { await this.$axios .get( `/trending/search/popular?lang=${this.$i18n.localeProperties["langQuery"]}` ) .then((response) => { this.populars = response.data; }) .catch((error) => console.log(error)); }, logout() { this.$auth.$storage.removeUniversal("authtoken"); this.$auth.$storage.removeUniversal("userPicture"); this.$auth.$storage.removeUniversal("userLastName"); this.$auth.$storage.removeUniversal("userBeforePath"); if (this.width < 1024) { this.$router.push(this.localePath("/")); } else { this.$router.push(this.localePath("/user")); } this.$auth.logout(); this.$nuxt.refresh(); this.UserInfoPopup = false; }, toUser(){ this.$auth.$storage.removeUniversal("authtoken"); this.$auth.$storage.removeUniversal("userPicture"); this.$auth.$storage.removeUniversal("userLastName"); this.$auth.$storage.removeUniversal("userBeforePath"); this.$router.push(this.localePath("/user")); this.$auth.logout(); this.$nuxt.refresh(); this.UserInfoPopup = false; }, langClickOutSide() { this.langShow = false; }, // socialRegister() {
// if (this.$auth.loggedIn) {
// const jsonPayload =
// this.$auth.$storage.getUniversal("authtoken") &&
// this.$auth.$storage.getUniversal("authtoken").token != undefined
// ? jwt_decode(this.$auth.$storage.getUniversal("authtoken").token)
// : { ueid: "" };
// if (
// this.$auth.$state.strategy === "google" ||
// this.$auth.$state.strategy === "facebook"
// )
// {
// const userData = {
// social_id:
// this.$auth.$state.strategy === "google"
// ? this.$auth.$state.user.sub
// : this.$auth.$state.user.id,
// first_name:
// this.$auth.$state.strategy === "google"
// ? this.$auth.$state.user.given_name
// : this.$auth.$state.user.first_name,
// last_name:
// this.$auth.$state.strategy === "google"
// ? this.$auth.$state.user.family_name
// : this.$auth.$state.user.last_name,
// email: this.$auth.$state.user.email,
// picture:
// this.$auth.$state.strategy === "google"
// ? this.$auth.$state.user.picture
// : this.$auth.$state.user.picture.data.url,
// social_schema: this.$auth.$state.strategy,
// };
// jsonPayload.ueid != ""
// ? (userData.user_id = JSON.parse(jsonPayload.ueid))
// : "";
// this.$axios
// .post("/member/users/social", userData)
// .then((result) => {
// this.$auth.$storage.setUniversal("authtoken", result.data, true);
// this.$store.dispatch("updatePicture");
// })
// .catch((err) => {
// console.log(err);
// });
// }
// this.$store.dispatch("updatePicture");
// }
// },
// toShowList(countryId) {
// if (countryId > 0) {
// this.$router.push(this.localePath(`/exhibition?country=${countryId}`));
// } else {
// this.$router.push(this.localePath(`/exhibition`));
// }
// this.isPageLoading = true;
// },
}, }; </script>
<style lang="scss" scoped> .v-menu__content { box-shadow: none; min-width: 186px; border-radius: 10px; }
.v-list-item { padding-left: 12px; padding-right: 12px; color: #232323 !important; }
.navBar-row2 { opacity: 0; grid-template-columns: fit-content(70px) 50px fit-content(90px) auto; }
.navBar-row2 { opacity: 0; grid-template-columns: fit-content(70px) 50px fit-content(90px) auto; }
.vertical-line { display: inline-block; border-left: 1.5px solid; margin: 5px 20px 5px 20px; height: 15px; }
:deep(.v-toolbar__content) { max-width: 1366px; width: 1366px; }
.user-picture-container { width: 28px; height: 28px; }
.user-picture-border { border: 1px solid #f5cda8; }
.user-no-picture-border { border: 2px solid #f5cda8; }
.user-no-picture-font { font-family: "DM Sans"; font-style: normal; font-weight: 400; font-size: 16px; line-height: 21px; }
.v-btn:before { background-color: rgba(238, 149, 70, 0.6) !important; font-color: #ee9546; }
.on-top { z-index: 500; }
.customMenuLink { &::after { content: ""; display: block; width: 150%; height: 40px; position: absolute; top: 20px; left: 0; }
&:hover { .customDropMenu { display: block;
&.oneType { display: grid; } } } }
.customDropMenu { column-count: 4; display: none;
&.exhibition { column-count: initial; column-gap: initial; }
&.services { column-count: 3; column-gap: 30px; }
&.oneType { column-count: 1; column-gap: 30px; }
> ul { &:last-of-type { > div { display: none !important; } } } }
.swiper-button { &-prev { left: 0;
&::before { content: ""; display: block; width: 60px; height: 100%; background-image: url("~/assets/svg/swiper_linear.svg"); // background-image: linear-gradient(to left, transparent, #fff);
position: absolute; left: -6px; top: 0; z-index: -1; transform: rotate(180deg); }
&:after { content: ""; display: block; position: absolute; right: 10px; background-image: url("~/assets/svg/left-arrow-default.svg"); background-position: center; background-repeat: no-repeat; background-size: 7px 13px; width: 24px; height: 24px; } }
&-next { right: 0;
&::before { content: ""; display: block; width: 60px; height: 100%; background-image: url("~/assets/svg/swiper_linear.svg"); // background-image: linear-gradient(to right, transparent, #fff);
position: absolute; right: -6px; top: 0; z-index: -1; }
&:after { content: ""; display: block; position: absolute; left: 10px; background-image: url("~/assets/svg/right-arrow-default.svg"); background-position: center; background-repeat: no-repeat; background-size: 7px 13px; width: 24px; height: 24px; } } }
:deep(.swiper-container) { .swiper-slide { opacity: 0; display: flex;
&.swiper-slide-visible { opacity: 1; } }
[aria-disabled="true"] { opacity: 0;
&::before { display: none; }
&::after { display: none; } } }
:deep(.theme--light.v-list){ box-shadow: 10px 10px 5px #888888 !important; }
.exhibitionDropdownLink { &.active { background-image: url("@/assets/svg/icon-arrow.svg"); background-position: right center; background-size: 16px; background-repeat: no-repeat; } }
.changeLang > div { border-radius: 4px;
&:hover { &::before { opacity: 0.08; // background-color: rgba(238, 149, 70, 0.6);
bottom: 0; content: " "; display: block; left: 0; pointer-events: none; position: absolute; right: 0; top: 0; width: 100%; height: 100%; } } }
.changeLang > div.show { &::before { opacity: 0.24; background-color: rgba(238, 149, 70, 0.6); bottom: 0; content: " "; display: block; left: 0; pointer-events: none; position: absolute; right: 0; top: 0; width: 100%; height: 100%; } } </style>
|