115 lines
3.3 KiB
TypeScript
115 lines
3.3 KiB
TypeScript
import {
|
||
check_login_status,
|
||
get_user_token,
|
||
silentLogin,
|
||
} from "@/services/loginService";
|
||
import { useUser } from "@/store/userStore";
|
||
import tokenManager from "@/utils/tokenManager";
|
||
|
||
// 防止重复调用静默登录
|
||
let isInitializingAuth = false;
|
||
let authInitPromise: Promise<void> | null = null;
|
||
|
||
// 初始化用户授权的核心逻辑
|
||
const initUserAuthCore = async (): Promise<void> => {
|
||
// 如果正在初始化,直接返回现有的 Promise
|
||
if (isInitializingAuth && authInitPromise) {
|
||
return authInitPromise;
|
||
}
|
||
|
||
// 如果已经登录且有用户信息,跳过
|
||
const login_status = check_login_status();
|
||
const { user, fetchUserInfo, checkNicknameChangeStatus } = useUser.getState();
|
||
if (login_status && user && Object.keys(user).length > 0) {
|
||
return Promise.resolve();
|
||
}
|
||
|
||
isInitializingAuth = true;
|
||
authInitPromise = (async () => {
|
||
try {
|
||
if (login_status) {
|
||
// 已登录,获取用户信息
|
||
try {
|
||
await fetchUserInfo();
|
||
await checkNicknameChangeStatus();
|
||
} catch (error) {
|
||
console.warn("获取用户信息失败:", error);
|
||
}
|
||
} else {
|
||
// 未登录,尝试静默登录
|
||
try {
|
||
const loginResult = await silentLogin();
|
||
if (loginResult.success) {
|
||
// 静默登录成功,获取用户信息
|
||
await fetchUserInfo();
|
||
await checkNicknameChangeStatus();
|
||
}
|
||
} catch (error) {
|
||
console.warn("静默登录失败:", error);
|
||
// 静默登录失败不影响使用
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.warn("初始化用户授权失败:", error);
|
||
} finally {
|
||
isInitializingAuth = false;
|
||
authInitPromise = null;
|
||
}
|
||
})();
|
||
|
||
return authInitPromise;
|
||
};
|
||
|
||
// 导出等待静默登录完成的函数,供页面组件使用
|
||
export const waitForAuthInit = async (): Promise<void> => {
|
||
// 检查是否已经有有效的 token(最优先检查)
|
||
if (tokenManager.hasValidToken() || get_user_token()) {
|
||
return Promise.resolve();
|
||
}
|
||
|
||
// 如果正在初始化,等待完成
|
||
if (authInitPromise) {
|
||
await authInitPromise;
|
||
// 等待完成后再次检查 token
|
||
if (tokenManager.hasValidToken() || get_user_token()) {
|
||
return;
|
||
}
|
||
}
|
||
|
||
// 检查是否已经登录且有用户信息
|
||
const login_status = check_login_status();
|
||
const { user } = useUser.getState();
|
||
if (login_status && user && Object.keys(user).length > 0) {
|
||
// 即使有登录状态,也确保 token 存在
|
||
if (tokenManager.hasValidToken() || get_user_token()) {
|
||
return Promise.resolve();
|
||
}
|
||
}
|
||
|
||
// 触发初始化
|
||
const promise = initUserAuthCore();
|
||
await promise;
|
||
|
||
// 等待 token 真正存在(最多等待 2 秒)
|
||
let retryCount = 0;
|
||
const maxRetries = 20; // 20 * 100ms = 2秒
|
||
while (
|
||
retryCount < maxRetries &&
|
||
!tokenManager.hasValidToken() &&
|
||
!get_user_token()
|
||
) {
|
||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||
retryCount++;
|
||
}
|
||
|
||
// 如果还是没有 token,记录警告但继续执行
|
||
if (!tokenManager.hasValidToken() && !get_user_token()) {
|
||
console.warn("等待静默登录完成,但未获取到 token");
|
||
}
|
||
};
|
||
|
||
// 导出初始化函数供 app.ts 使用
|
||
export const initUserAuth = () => {
|
||
return initUserAuthCore();
|
||
};
|