80 lines
1.7 KiB
TypeScript
80 lines
1.7 KiB
TypeScript
import { LoginResponse, LoginToken, LoginUser, UserToken } from "../types";
|
|
import Storage from "../utils/Storage";
|
|
import UserAPI from "../api/UserAPI";
|
|
|
|
const loginUser = reactive<LoginUser>({
|
|
token: undefined,
|
|
user: undefined
|
|
});
|
|
|
|
function isLogged(): boolean {
|
|
return !!loginUser.user;
|
|
}
|
|
|
|
async function login4Token(token: LoginToken): Promise<LoginResponse | null> {
|
|
loginUser.token = token;
|
|
// 未过期
|
|
try {
|
|
const resp = await UserAPI.login4Token();
|
|
await updateToken(resp);
|
|
return resp;
|
|
} catch (e) {
|
|
await logout();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
async function login4Storage(): Promise<LoginResponse | null> {
|
|
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<void> {
|
|
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<void> {
|
|
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
|
|
};
|