From 8920cf32b364d6018da3a866e24e8d39e3b86087 Mon Sep 17 00:00:00 2001
From: 劉鈞霖 <benson@gmail.com>
Date: 星期三, 15 十二月 2021 15:25:17 +0800
Subject: [PATCH] [ Ref ] 共用 localStorage service

---
 PAMapp/assets/ts/api/share.ts        |    2 
 PAMapp/store/localStorage.service.ts |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+), 1 deletions(-)

diff --git a/PAMapp/assets/ts/api/share.ts b/PAMapp/assets/ts/api/share.ts
index 90e2d9e..835376c 100644
--- a/PAMapp/assets/ts/api/share.ts
+++ b/PAMapp/assets/ts/api/share.ts
@@ -54,7 +54,7 @@
   if (!_.includes(notRequireInterceptorErrorUrl, error.config.url)) {
     switch (error.response.status) {
       case 401:
-        Promise.all([ErrorMessageBox('���暹��'), window.$nuxt.$store.dispatch('localStorage/actionStorageClear')]).then(() => {
+        Promise.all([ErrorMessageBox('���暹��'),window.$nuxt.$store.dispatch('localStorage.service/clearStorage')]).then(()=>{
           _.isEqual(window.$nuxt.$route.name, 'index') ? location.reload() : window.$nuxt.$router.push('/');
         });
         break;
diff --git a/PAMapp/store/localStorage.service.ts b/PAMapp/store/localStorage.service.ts
new file mode 100644
index 0000000..6ff4d9e
--- /dev/null
+++ b/PAMapp/store/localStorage.service.ts
@@ -0,0 +1,109 @@
+import { Module, VuexModule, Mutation, Action } from 'vuex-module-decorators';
+import _ from 'lodash';
+
+
+export enum LocalStorageItem {
+  ID_TOKEN                  = "id_token",
+  CURRENT_ROLE              = "current_role",
+  CONSULTANT_ID             = "consultant_id",
+  USER_INFO                 = "user_info",
+  QUICK_FILTER              = "quick_filter",
+  RECOMMEND_CONSULTANT_ITEM = "recommend_consultant_item",
+  MY_REQUESTS               = "my_requests",
+  FAVORITE_CONSULTANT       = "favorite_consultant",
+}
+
+export type storageDataDto = Record<LocalStorageItem, any>
+
+export const initialValueOfStorageItemDto = {
+  [LocalStorageItem.ID_TOKEN]                 : String,
+  [LocalStorageItem.CURRENT_ROLE]             : String,
+  [LocalStorageItem.CONSULTANT_ID]            : String,
+  [LocalStorageItem.RECOMMEND_CONSULTANT_ITEM]: String,
+  [LocalStorageItem.USER_INFO]                : Object,
+  [LocalStorageItem.MY_REQUESTS]              : Object,
+  [LocalStorageItem.FAVORITE_CONSULTANT]      : Object,
+  [LocalStorageItem.QUICK_FILTER]             : Array,
+}
+
+@Module
+export default class commonLocalStorage extends VuexModule {
+  localStorageDto = this.getInitLocalStorageDto();
+   //** ���隞嗥���� **//
+  private getInitLocalStorageDto(): storageDataDto {
+    const initLocalStorageDto = {} as storageDataDto;
+    _.forEach( LocalStorageItem , keyName =>
+      initLocalStorageDto[keyName] = this.processOfStorageGetItem(keyName)
+    )
+    return initLocalStorageDto;
+  }
+  //** ���� localStorage鞈�� **/
+  private processOfStorageGetItem( keyName:string ): any {
+    const storageData = localStorage.getItem(keyName);
+    const itemType = initialValueOfStorageItemDto[keyName];
+    const prepareData = storageData
+                          ? _.isEqual(itemType,String)
+                            ? storageData
+                            : JSON.parse(storageData)
+                          : null;
+    return prepareData
+  }
+
+  ///////////////////////////////////////////////// Mutation
+
+  /** �摮�� localStorageDto **/
+  @Mutation setLocalStorageDto( setItem:SetItemDto ): void {
+    this.localStorageDto[setItem.keyName] = setItem.value ;
+  }
+
+  //** 蝘駁�銝� **//
+  @Mutation clearStoreByKeyName( keyName:string ): void {
+    localStorage.removeItem(keyName)
+    this.localStorageDto[keyName]=null;
+  }
+
+  //** 蝘駁���隞� **//
+  @Mutation clearStoreData(): void {
+      _.keys(this.localStorageDto)
+      .forEach(keyName => {
+        localStorage.removeItem(keyName);
+        this.localStorageDto[keyName]=null;
+      });
+  }
+
+  ///////////////////////////////////////////////// Action
+
+  //** �隞嗅摮� **//
+  @Action storeData( data: storageDataDto ): void {
+    _.keys(data).forEach(keyName=>{
+      const newObj = {
+        keyName:keyName,
+        value:data[keyName]
+      }
+      this.context.dispatch('localStorageSet',newObj);
+    });
+  }
+
+  //** 撠�閬� 摮�� localStorage �撘� **//
+  @Action localStorageSet( setItem:SetItemDto ): void {
+    const itemType = initialValueOfStorageItemDto[setItem.keyName];
+    const prepareData = _.isEqual(itemType,String)
+                          ? setItem.value
+                          : JSON.stringify(setItem.value);
+    localStorage.setItem(setItem.keyName,prepareData);
+
+    this.context.commit('setLocalStorageDto',setItem)
+  }
+
+  //** ��蝘駁 **//
+  @Action clearStorage(keyName?:string): Promise<boolean> {
+    return new Promise((resolve, reject) => {
+      keyName ? this.context.commit('clearStoreByKeyName',keyName) : this.context.commit('clearStoreData');
+      resolve(true)
+    });
+  }
+}
+export interface SetItemDto{
+  keyName:string,
+  value:any,
+}

--
Gitblit v1.8.0