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,
|
}
|