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 | null = null; // 初始化用户授权的核心逻辑 const initUserAuthCore = async (): Promise => { // 如果正在初始化,直接返回现有的 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 => { // 检查是否已经有有效的 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(); };