From b4d6944076f1df6eedaae35c4c2a7072fe988e8a Mon Sep 17 00:00:00 2001
From: Tomas <tomasysh@gmail.com>
Date: 星期二, 30 四月 2024 15:34:02 +0800
Subject: [PATCH] update: package-lock.json

---
 PAMapp/components/NavBar.vue |  160 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 131 insertions(+), 29 deletions(-)

diff --git a/PAMapp/components/NavBar.vue b/PAMapp/components/NavBar.vue
index 0aa05ff..992f570 100644
--- a/PAMapp/components/NavBar.vue
+++ b/PAMapp/components/NavBar.vue
@@ -3,17 +3,36 @@
     <div class="pam-header__logo"
       @click="pushRouterByLoginRole"></div>
     <div class="pam-header__title">
-      <div class="pam-header__title--main">���兢蝳��蜓</div>
-      <div class="pam-header__title--sub">�����兢蝳�風��</div>
+      <div class="pam-header__title--main">�憿找�����</div>
+      <div class="pam-header__title--sub">��������“���</div>
     </div>
     <div class="pam-header__action-bar">
-      <!-- <i class="icon-bell text--dark-blue cursor--pointer fix-chrome-click--issue"
-        @click="$router.push('/notification')"></i> -->
+      <i
+        v-if="isShowNotification"
+        class="icon-bell text--dark-blue cursor--pointer"
+        @click="$router.push('/notification')"
+      >
+        <span :class="{'newNotification': isNewNotification}"></span>
+      </i>
+
         <el-dropdown :class="{'is-open':isOpenDropdown}"
           ref="dropdown"
           trigger="click"
           @command="routerNavigateTo">
-          <i class="icon-avatar text--dark-blue cursor--pointer fix-chrome-click--issue" @click="isOpenDropdown =!isOpenDropdown" @blur="isOpenDropdown =false"></i>
+          <div
+            @click="isOpenDropdown =!isOpenDropdown"
+            @blur="isOpenDropdown =false">
+            <template v-if="isAdminLogin">
+              <UiAvatar
+              :size="30"
+              :agentNo="consultantId"
+              class="admin-avatar"
+              ></UiAvatar>
+            </template>
+            <template v-else>
+              <i class="icon-avatar text--dark-blue cursor--pointer fix-chrome-click--issue"></i>
+            </template>
+          </div>
           <el-dropdown-menu
             class="pam-header__dropdown">
             <template v-for="(item,index) in navBarList">
@@ -33,18 +52,47 @@
 
 <script lang="ts">
   import { Vue, Component } from 'vue-property-decorator';
-  import { namespace } from 'nuxt-property-decorator';
-  import { Role } from '~/assets/ts/models/enum/role';
-  import * as _ from 'lodash';
+  import { Action, namespace, State, Watch } from 'nuxt-property-decorator';
+  import { Role } from '~/shared/models/enum/Role';
+  import { NotificationList } from '~/shared/models/reviews.model';
+  import { AppointmentLog } from '~/shared/models/appointment.model';
+  import loginService from '~/shared/services/login.service'
 
   const roleStorage = namespace('localStorage');
   @Component
   export default class NavBar extends Vue {
-    @roleStorage.Mutation storageClear!: () => void;
 
-    @roleStorage.Getter idToken!: string | null;
-    @roleStorage.Getter currentRole!: string | null;
-    @roleStorage.Getter consultantId!: string | null;
+    @roleStorage.Getter
+    idToken!: string | null;
+
+    @roleStorage.Getter
+    currentRole!: string | null;
+
+    @roleStorage.Getter
+    consultantId!: string | null;
+
+    @roleStorage.Mutation
+    storageClear!: () => void;
+
+    @roleStorage.Getter
+    isAdminLogin!: boolean;
+
+    @roleStorage.Getter
+    isUserLogin!: boolean;
+
+    @Action
+    storeMyPersonalNotification!: () => void;
+
+    @State
+    notificationList!: NotificationList[];
+
+    @Action
+    storeMyAppointmentReviewLog!: () => void;
+
+    @State
+    unReviewLogList!: AppointmentLog[];
+
+    isOpenDropdown = false;
 
     navBarList = [{
         authorityOfRoleList: [Role.NOT_LOGIN],
@@ -77,6 +125,11 @@
         title: '���“���',
       },
       {
+        authorityOfRoleList: [Role.NOT_LOGIN, Role.USER],
+        routeUrl: '/faq',
+        title: 'FAQ 撣貉����',
+      },
+      {
         authorityOfRoleList: [Role.USER, Role.ADMIN],
         routeUrl: '',
         title: '��',
@@ -87,29 +140,57 @@
         title: '憿批��',
       },
     ];
-    login_role = Role.NOT_LOGIN;
-    isOpenDropdown = false;
+
+    //////////////////////////////////////////////////////////////////////
+
+    @Watch('$route', {immediate: true})
+    onRouterChange() {
+        if (this.currentRole) {
+          this.storeMyPersonalNotification();
+          this.storeMyAppointmentReviewLog();
+        }
+    }
+
+    //////////////////////////////////////////////////////////////////////
+
+    routerNavigateTo(url: string): void {
+      (this.$refs.dropdown as any).hide();
+      url === ''
+        ? this.logout()
+        : this.$router.push(url === '/agentInfo/' ? url+this.consultantId : url);
+    }
+
+    pushRouterByLoginRole(): void {
+      const link = this.currentRole === Role.ADMIN ? '/myAppointmentList/appointmentList' : '/';
+      this.$router.push(link);
+    }
+
+    logout(): void {
+      loginService.logout().then(() => {
+        this.storageClear();
+        this.$route.name === 'index' ? location.reload() : this.$router.push('/');
+      });
+    }
 
     get loginRole(): Role {
       return this.idToken && this.currentRole ? (this.currentRole as Role): Role.NOT_LOGIN;
     }
 
-    routerNavigateTo(url: string): void {
-      (this.$refs.dropdown as any).hide();
-      _.isEqual(url,'')
-        ? this.logout()
-        : this.$router.push(_.isEqual(url,'/agentInfo/') ? url+this.consultantId :url);
+    get isShowNotification() {
+      if (this.isUserLogin) {
+        return this.notificationList.length || this.unReviewLogList.length;
+      }
+      if (this.isAdminLogin) {
+        return this.notificationList.length
+      }
     }
 
-    pushRouterByLoginRole(): void {
-      const link = _.isEqual(this.currentRole, Role.ADMIN) ? '/myAppointmentList/appointmentList' : '/';
-      this.$router.push(link);
+    get isNewNotification() {
+      if (this.currentRole) {
+        return this.notificationList.filter(item => !item.readDate).length;
+      }
     }
 
-    logout(): void {
-      this.storageClear();
-      _.isEqual(this.$route.name, 'index') ? location.reload() : this.$router.push('/');
-    }
   }
 
 </script>
@@ -175,9 +256,30 @@
 
       i {
         padding: 0px 15px;
+        @extend .fix-chrome-click--issue;
 
         @media screen and (max-width: 352px) {
           padding: 0px 10px;
+        }
+      }
+
+      .admin-avatar {
+        margin: 0px 15px;
+        @media screen and (max-width: 352px) {
+          margin: 0px 10px;
+        }
+      }
+
+      .icon-bell {
+        position: relative;
+        .newNotification {
+          position: absolute;
+          width: 10px;
+          height: 10px;
+          top: 0;
+          right: 15px;
+          border-radius: 50px;
+          background: $PRIMARY_RED;
         }
       }
     }
@@ -200,11 +302,11 @@
       height: $DESKTOP_NAV_BAR;
 
       .pam-header__logo {
-        width: 180px;
-        height: 100%;
+        width: 160px;
+        height: 70px;
         margin: 0;
         background-image: url('~/assets/images/logo.png');
-        background-size: cover;
+        background-size: contain;
         background-repeat: no-repeat;
         background-position: center;
       }

--
Gitblit v1.8.0