| 1 | import { createPersistStore } from '@/utils/createPersistStore'; |
| 2 | import { IRefreshToken, IUserInfo } from '@/api/types/user-t'; |
| 3 | import { userApi } from '@/api/user'; |
| 4 | import { StoreKey } from '@/utils/StroeEnum'; |
| 5 | import router from '@/router/index'; |
| 6 | import { usePubStroe } from './pubStroe'; |
| 7 | import { useAccountStore } from './account'; |
| 8 | |
| 9 | export interface IUserStore { |
| 10 | userInfo?: IUserInfo; |
| 11 | token: string; |
| 12 | overdueTime: number; |
| 13 | refreshTokenLoading: boolean; |
| 14 | } |
| 15 | |
| 16 | const state: IUserStore = { |
| 17 | userInfo: undefined, |
| 18 | token: '', |
| 19 | overdueTime: 0, |
| 20 | // 是否开始刷新token,防止多次调用 |
| 21 | refreshTokenLoading: false, |
| 22 | }; |
| 23 | |
| 24 | export const useUserStore = createPersistStore( |
| 25 | { |
| 26 | ...state, |
| 27 | }, |
| 28 | (set, _get) => { |
| 29 | return { |
| 30 | // 清除登录状态 |
| 31 | clearLoginStatus() { |
| 32 | set({ ...state }); |
| 33 | usePubStroe.getState().clear(); |
| 34 | useAccountStore.getState().clear(); |
| 35 | }, |
| 36 | |
| 37 | // 退出登录 |
| 38 | logout() { |
| 39 | console.log('登出!'); |
| 40 | this.clearLoginStatus(); |
| 41 | if (window.location.href !== 'login') { |
| 42 | router.navigate('/login'); |
| 43 | } |
| 44 | }, |
| 45 | |
| 46 | // 获取用户信息 |
| 47 | async getUserInfo(userInfo?: IUserInfo) { |
| 48 | if (userInfo) { |
| 49 | set({ userInfo: userInfo }); |
| 50 | return; |
| 51 | } |
| 52 | const res = await userApi.getUserInfo(); |
| 53 | if (!res) return; |
| 54 | set({ userInfo: res }); |
| 55 | return res; |
| 56 | }, |
| 57 | |
| 58 | // 设置Token |
| 59 | setToken({ token, exp }: IRefreshToken) { |
| 60 | set({ token: token, overdueTime: exp }); |
| 61 | }, |
| 62 | |
| 63 | // 检测是否需要刷新token,到过期时间的4小时前前操作就刷新 |
| 64 | refreshTokenDet() { |
| 65 | if (!_get().token) return; |
| 66 | |
| 67 | if (_get().refreshTokenLoading) return; |
| 68 | set({ refreshTokenLoading: true }); |
| 69 | |
| 70 | if (_get().overdueTime - Date.now() < 60 * 60 * 1000 * 4) { |
| 71 | userApi.refreshToken().then((res) => { |
| 72 | set({ refreshTokenLoading: false }); |
| 73 | if (!res) return; |
| 74 | this.setToken(res); |
| 75 | this.getUserInfo(res.userInfo); |
| 76 | }); |
| 77 | } |
| 78 | }, |
| 79 | }; |
| 80 | }, |
| 81 | { |
| 82 | name: StoreKey.User, |
| 83 | }, |
| 84 | ); |
| 85 |