87 lines
1.9 KiB
TypeScript
87 lines
1.9 KiB
TypeScript
|
|
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<UserState>) {
|
||
|
|
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
|