import { defineStore } from 'pinia'; import { store } from '@/store'; import { ACCESS_TOKEN, CURRENT_USER, IM_TOKEN } from '@/store/mutation-types'; import { storage } from '@/utils/storage'; import { userLogin, getUserInfo } from '@/api/user'; export interface IUserState { token: string; imToken: string; username: string; avatar: string; info: any; } export const useUserStore = defineStore('user-store', { state: (): IUserState => ({ token: storage.get(ACCESS_TOKEN, ''), imToken: storage.get(IM_TOKEN, ''), username: '', avatar: '', info: storage.get(CURRENT_USER, {}) }), getters: { getToken(): string { return this.token; }, getImToken(): string { return this.imToken; }, getAvatar(): string { return this.avatar; }, getNickname(): string { return this.username; }, getUserInfo(): object { return this.info; } }, actions: { setToken(token: string) { this.token = token; }, setImToken(token: string) { this.imToken = token; }, setAvatar(avatar: string) { this.avatar = avatar; }, setUsername(username: string) { this.username = username; }, setUserInfo(info: any) { this.info = info; }, // 登录 async login(userInfo: any) { try { const { data } = await userLogin(userInfo); console.log(data, 'data'); const userToken = data.token_type + ' ' + data.access_token; const ex = 7 * 24 * 60 * 60 * 1000; storage.set(ACCESS_TOKEN, userToken, ex); // storage.get(IM_TOKEN, data.imToken); this.setToken(userToken); // this.setImToken(data.imToken); return Promise.resolve(); } catch (e) { return Promise.reject(e); } }, // 获取用户信息 async getInfo() { return new Promise((resolve, reject) => { getUserInfo() .then((res: any) => { const result = res.data; this.setUserInfo(result); this.setAvatar(result.account.avatar); this.setUsername(result.nickname); resolve(true); }) .catch((error: any) => { reject(error); }); }); }, // 登出 async logout() { this.setUserInfo(''); storage.remove(ACCESS_TOKEN); storage.remove(CURRENT_USER); return Promise.resolve(''); } } }); // Need to be used outside the setup export function useUserStoreWidthOut() { return useUserStore(store); }