xfflod-resCenter/src/models/auth/index.ts

62 lines
1.4 KiB
TypeScript
Raw Normal View History

2025-06-27 17:11:23 +08:00
import { createModel } from "@rematch/core";
import { RootModel } from "..";
import { MenuItem } from "../_/defs";
import { AuthState, getUserFromSession, loadMenu, login, LoginUser, regByToken, removeLoginInfo } from "./_";
export const auth = createModel<RootModel>()({
state: {
user: getUserFromSession(),
menu: [],
} as AuthState,
reducers: {
setUser(state, user: LoginUser | null | 'failed'): AuthState {
return { ...state, user };
},
setMenu(state, menu: MenuItem[]): AuthState {
return { ...state, menu };
},
},
effects: {
async regByToken(token: string): Promise<boolean> {
const result = await regByToken(token);
if (result) {
this.setUser(result);
sessionStorage.setItem('__useToken', '1');
return true;
}
this.setUser('failed');
return false;
},
async login(form: { username: string, password: string }): Promise<boolean> {
const result = await login(form);
if (result) {
this.setUser(result);
sessionStorage.setItem('__useToken', '0');
return true;
}
return false;
},
logout() {
removeLoginInfo();
this.setUser(null);
},
async loadMenu(payload, s) {
if (s.auth.user && s.auth.user !== 'failed') {
this.setMenu(loadMenu(s.auth.user));
}
}
}
});