Files
mini-programs/src/utils/authInit.ts
2026-02-14 12:59:21 +08:00

115 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();
};