ragflow/web/src/store/modules/user/index.ts
2023-12-14 13:49:56 +08:00

88 lines
1.9 KiB
TypeScript

import { defineStore } from 'pinia';
import { UserState } from './types';
import {
LoginData,
getUserInfo,
login as userLogin,
logout as userLogout,
} from '@/api/user';
import { clearToken, setToken } from '@/utils/auth';
import { removeRouteListener } from '@/utils/route-listener';
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(unref(res.data)!);
},
// Login
async login(loginForm: LoginData) {
try {
const res = await userLogin(loginForm);
setToken(unref(res.data)!.token);
} catch (err) {
clearToken();
throw err;
}
},
logoutCallBack() {
this.resetInfo();
clearToken();
removeRouteListener();
},
// Logout
async logout() {
try {
await userLogout();
} finally {
this.logoutCallBack();
}
},
},
});
export default useUserStore;