返回 AiToEarn
user.ts
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
85 lines TYPESCRIPT