import { defineStore } from 'pinia'; import { login as userLogin, logout as userLogout, switchRole, getUserInfo, LoginData, me, } 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, nickName: undefined, avatar: undefined, email: undefined, phone: undefined, address: undefined, createAt: undefined, remark: undefined, id: undefined, role: undefined, roles: undefined, permissions: [], headerName: '', tokenDate: '', }), 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); }, // Get user's crsf async me() { const res = await me(); this.headerName = res.data.csrf.headerName; this.tokenDate = res.data.csrf.token; return res; }, // Login async login(loginForm: LoginData, headerName: string, token: string) { try { const res = await userLogin(loginForm, headerName, token); setToken(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;