62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
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));
|
|
}
|
|
}
|
|
}
|
|
});
|