import { defineStore } from 'pinia'; import { login as userLogin, logout as userLogout, switchRole, getUserInfo, LoginData, } from '@/api/user'; import { setToken, clearToken } from '@/utils/auth'; import { removeRouteListener } from '@/utils/route-listener'; import { UserState } from './types'; import useAppStore from '../app'; const useUserStore = defineStore('user', { state: (): UserState => ({ username: undefined, name: undefined, avatar: undefined, email: undefined, phone: undefined, createAt: undefined, remark: undefined, id: undefined, role: undefined, roles: undefined, permissions: [], }), getters: { userInfo(state: UserState): UserState { return { ...state }; }, }, actions: { // switchRoles() { // return new Promise((resolve) => { // this.permissions = this.permissions === 'user' ? 'admin' : 'user'; // resolve(this.permissions); // }); // }, async switchRoles(roleId: number) { const res = await switchRole(roleId); this.setInfo(res.data); return res; }, // Set user's information setInfo(partial: Partial) { this.$patch(partial); }, // Reset user's information resetInfo() { this.$reset(); }, // Get user's information async info() { const res = await getUserInfo(); this.setInfo(res.data); }, // Login async login(loginForm: LoginData) { try { const res = await userLogin(loginForm); // setToken(res.data.token); setToken(res.data.token); } catch (err) { clearToken(); throw err; } }, logoutCallBack() { const appStore = useAppStore(); this.resetInfo(); clearToken(); removeRouteListener(); appStore.clearServerMenu(); }, // Logout async logout() { try { await userLogout(); } finally { this.logoutCallBack(); } }, }, persist: true, }); export default useUserStore;