import { LoginData, getUserInfo, login as userLogin, logout as userLogout } from '@/api/user' import { clearToken, setToken } from '@/utils/auth' import { removeRouteListener } from '@/utils/route-listener' import { defineStore } from 'pinia' import useAppStore from '../app' import { UserState } from './types' const useUserStore = defineStore('user', { state: (): UserState => ({ name: undefined, avatar: undefined, job: undefined, organization: undefined, location: undefined, email: undefined, introduction: undefined, personalWebsite: undefined, jobName: undefined, organizationName: undefined, locationName: undefined, phone: undefined, registrationDate: undefined, accountId: undefined, certification: undefined, role: '', }), getters: { userInfo(state: UserState): UserState { return { ...state } }, }, actions: { switchRoles() { return new Promise((resolve) => { this.role = this.role === 'user' ? 'admin' : 'user' resolve(this.role) }) }, // 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) } catch (err) { clearToken() throw err } }, logoutCallBack() { const appStore = useAppStore() this.resetInfo() clearToken() removeRouteListener() appStore.clearServerMenu() }, // Logout async logout() { try { await userLogout() } finally { this.logoutCallBack() } }, }, }) export default useUserStore