import { LoginResponse, LoginToken, LoginUser, UserToken } from "../types"; import Storage from "../utils/Storage"; import UserAPI from "../api/UserAPI"; const loginUser = reactive({ token: undefined, user: undefined }); function isLogged(): boolean { return !!loginUser.user; } async function login4Token(token: LoginToken): Promise { loginUser.token = token; // 未过期 try { const resp = await UserAPI.login4Token(); await updateToken(resp); return resp; } catch (e) { await logout(); } return null; } async function login4Storage(): Promise { if (!loginUser.user && (loginUser.token || Storage.has("token"))) { // 未登录,储存有令牌 const token = Storage.getJSON("token") as UserToken; if (new Date().getTime() < token.expireAt) { return await login4Token(token); } } return null; } async function updateToken(loginResponse: LoginResponse): Promise { loginUser.token = { id: loginResponse.id, value: loginResponse.token, expireAt: loginResponse.expireAt }; loginUser.user = await UserAPI.view(loginResponse.id); Storage.setJSON("token", { value: loginUser.token.value, expireAt: loginUser.token.expireAt } as UserToken); } async function logout(): Promise { await UserAPI.logout(); loginUser.token = undefined; loginUser.user = undefined; Storage.remove("token"); } async function reloadProfile() { if (loginUser.token && loginUser.token.id) { loginUser.user = await UserAPI.view(loginUser.token.id); } } const userStore = { loginUser, isLogged, login4Token, login4Storage, updateToken, logout, reloadProfile }; export { userStore };