import { lens } from '@dhmk/zustand-lens'; import { SetStateAction } from 'react'; import { UserFavorite, UserInfo } from './types'; import { StorageKeys } from '@/shared/constants/local-storage'; export interface UserInfoState { userInfo: UserInfo; setUserInfo: (update: SetStateAction>) => void; resetUserInfo: () => void; userFavorite: Array; setUserFavorite: (update: SetStateAction>) => void; userMids: Array; setUserMids: (update: SetStateAction>) => void; selectOptionsMids: Array>; setSelectOptionsMids: (update: SetStateAction>>) => void; }; const initialUserInfoState = { userInfo: {} as UserInfo, userFavorite: [] as Array, userMids: [] as Array, selectOptionsMids: [] as Array> } as UserInfoState; export const createUserInfoStore = lens((set, get) => ({ ...initialUserInfoState, setUserInfo: (update) => { set((state: UserInfoState) => { const newUserInfo = (typeof update === 'function') ? update(state.userInfo): update; return { ...state, userInfo: { ...state.userInfo, ...newUserInfo }, }; }); }, resetUserInfo: () => { window.localStorage.removeItem(StorageKeys.TokenType); window.localStorage.removeItem(StorageKeys.AccessToken); window.localStorage.removeItem(StorageKeys.RefreshToken); window.localStorage.removeItem(StorageKeys.AccessTokenExpiresIn); window.localStorage.removeItem(StorageKeys.RefreshTokenExpiresIn); window.localStorage.removeItem(StorageKeys.MenuGrants); window.localStorage.removeItem(StorageKeys.Usrid); window.localStorage.removeItem(StorageKeys.ClientAddressIP); window.localStorage.removeItem(StorageKeys.Requires2FA); set(initialUserInfoState); }, setUserFavorite: (update) => { set((state: UserInfoState) => { const newUserFavorite = (typeof update === 'function') ? update(state.userFavorite): update; return { ...state, userFavorite: [ ...newUserFavorite ], }; }); }, setUserMids: (update) => { set((state: UserInfoState) => { const newUserMids = (typeof update === 'function') ? update(state.userMids): update; return { ...state, userMids: [ ...state.userMids, ...newUserMids ], }; }); }, setSelectOptionsMids: (update) => { set((state: UserInfoState) => { const newSelectOptionsMids = (typeof update === 'function') ? update(state.selectOptionsMids): update; return { ...state, selectOptionsMids: [ ...state.selectOptionsMids, ...newSelectOptionsMids ], }; }); }, }));