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()({ 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 { 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 { 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)); } } } });