优化获取昵称修改状态的时机

This commit is contained in:
2025-12-03 15:44:41 +08:00
parent 7c1a1fafc1
commit b77b4b0536
9 changed files with 160 additions and 128 deletions

View File

@@ -23,7 +23,7 @@
justify-content: center; justify-content: center;
align-items: flex-start; align-items: flex-start;
&::before { &::before {
content: ''; content: "";
width: 32px; width: 32px;
height: 4px; height: 4px;
background-color: rgba(22, 24, 35, 0.2); background-color: rgba(22, 24, 35, 0.2);
@@ -105,7 +105,7 @@
padding: 8px 10px 0 10px; padding: 8px 10px 0 10px;
display: flex; display: flex;
gap: 8px; gap: 8px;
background: #fff; background: #fafafa;
padding-bottom: max(10px, env(safe-area-inset-bottom)); padding-bottom: max(10px, env(safe-area-inset-bottom));
} }

View File

@@ -11,7 +11,7 @@ interface EditModalProps {
placeholder: string; placeholder: string;
initialValue: string; initialValue: string;
maxLength: number; maxLength: number;
invalidCharacters: string; invalidCharacters: RegExp | null;
onSave: (value: string) => void; onSave: (value: string) => void;
onCancel: () => void; onCancel: () => void;
validationMessage?: string; validationMessage?: string;
@@ -24,7 +24,7 @@ const EditModal: React.FC<EditModalProps> = ({
placeholder, placeholder,
initialValue, initialValue,
maxLength, maxLength,
invalidCharacters = "", invalidCharacters = null,
onSave, onSave,
onCancel, onCancel,
validationMessage, validationMessage,
@@ -63,18 +63,13 @@ const EditModal: React.FC<EditModalProps> = ({
} }
}, [visible, initialValue]); }, [visible, initialValue]);
const createExcludeRegex = (chars: string) => {
const escapedChars = chars.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const pattern = `[${escapedChars}]`;
return new RegExp(pattern);
};
const handle_input_change = (e: any) => { const handle_input_change = (e: any) => {
const new_value = e.detail.value; const new_value = e.detail.value;
setValue(new_value); setValue(new_value);
let ishasIllegal = false; let ishasIllegal = false;
if (type === "nickname") { if (type === "nickname" && invalidCharacters) {
ishasIllegal = createExcludeRegex(invalidCharacters).test(new_value); ishasIllegal = invalidCharacters.test(new_value);
setHasIllegal(ishasIllegal); setHasIllegal(!ishasIllegal);
} }
const illegal = const illegal =
/\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|DECLARE)\b|('|--|\/\*|\*\/|;|#)|(=|'|"|`|\\|\|\|&&)|\bOR\s+['"]?[\w]+['"]?\s*=\s*['"]?[\w]+['"]?|\bUNION\s+SELECT\b|\bDROP\s+TABLE\b|\bINSERT\s+INTO\b|\bUPDATE\s+[\w]+\s+SET\b|\bDELETE\s+FROM\b/i.test( /\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|DECLARE)\b|('|--|\/\*|\*\/|;|#)|(=|'|"|`|\\|\|\|&&)|\bOR\s+['"]?[\w]+['"]?\s*=\s*['"]?[\w]+['"]?|\bUNION\s+SELECT\b|\bDROP\s+TABLE\b|\bINSERT\s+INTO\b|\bUPDATE\s+[\w]+\s+SET\b|\bDELETE\s+FROM\b/i.test(

View File

@@ -610,7 +610,11 @@ const UserInfoCardComponent: React.FC<UserInfoCardProps> = ({
} }
initialValue={form_data[editing_field as keyof typeof form_data] || ""} initialValue={form_data[editing_field as keyof typeof form_data] || ""}
maxLength={editing_field === "nickname" ? 20 : 100} maxLength={editing_field === "nickname" ? 20 : 100}
invalidCharacters={editing_field === "nickname" ? "@<>/" : ""} invalidCharacters={
editing_field === "nickname"
? /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\(\)\s]*$/
: null
}
onSave={handle_edit_modal_save} onSave={handle_edit_modal_save}
onCancel={handle_edit_modal_cancel} onCancel={handle_edit_modal_cancel}
validationMessage={ validationMessage={

View File

@@ -20,7 +20,7 @@ const LoginPage: React.FC = () => {
const { const {
params: { redirect }, params: { redirect },
} = useRouter(); } = useRouter();
const { fetchUserInfo } = useUserActions(); const { fetchUserInfo, checkNicknameChangeStatus } = useUserActions();
// 执行微信登录的核心逻辑 // 执行微信登录的核心逻辑
const execute_wechat_login = async (e: any) => { const execute_wechat_login = async (e: any) => {
@@ -41,6 +41,7 @@ const LoginPage: React.FC = () => {
if (response.success) { if (response.success) {
save_login_state(response.token!, response.user_info!); save_login_state(response.token!, response.user_info!);
fetchUserInfo(); fetchUserInfo();
checkNicknameChangeStatus();
setTimeout(() => { setTimeout(() => {
if (redirect) { if (redirect) {

View File

@@ -12,7 +12,7 @@ import ListPageContent from "./components/ListPageContent";
import MessagePageContent from "./components/MessagePageContent"; import MessagePageContent from "./components/MessagePageContent";
import MyselfPageContent from "./components/MyselfPageContent"; import MyselfPageContent from "./components/MyselfPageContent";
import "./index.scss"; import "./index.scss";
import FamilyContext from '@/context'; import FamilyContext from "@/context";
type TabType = "list" | "message" | "personal"; type TabType = "list" | "message" | "personal";
@@ -22,14 +22,17 @@ const MainPage: React.FC = () => {
const [isDistanceFilterVisible, setIsDistanceFilterVisible] = useState(false); const [isDistanceFilterVisible, setIsDistanceFilterVisible] = useState(false);
const [isCityPickerVisible, setIsCityPickerVisible] = useState(false); const [isCityPickerVisible, setIsCityPickerVisible] = useState(false);
const [isFilterPopupVisible, setIsFilterPopupVisible] = useState(false); const [isFilterPopupVisible, setIsFilterPopupVisible] = useState(false);
const [isShowInputCustomerNavBar, setIsShowInputCustomerNavBar] = useState(false); const [isShowInputCustomerNavBar, setIsShowInputCustomerNavBar] =
const [listPageScrollToTopTrigger, setListPageScrollToTopTrigger] = useState(0); useState(false);
const [listPageScrollToTopTrigger, setListPageScrollToTopTrigger] =
useState(0);
const [showAuthError, setShowAuthError] = useState(false); const [showAuthError, setShowAuthError] = useState(false);
const [authErrorMessage, setAuthErrorMessage] = useState(''); const [authErrorMessage, setAuthErrorMessage] = useState("");
const { fetchUserInfo } = useUserActions(); const { fetchUserInfo, checkNicknameChangeStatus } = useUserActions();
// 从 store 获取 GuideBar 相关状态和方法 // 从 store 获取 GuideBar 相关状态和方法
const { showGuideBar, guideBarZIndex, setShowGuideBar, setGuideBarZIndex } = useGlobalState(); const { showGuideBar, guideBarZIndex, setShowGuideBar, setGuideBarZIndex } =
useGlobalState();
// 初始化:自动微信授权并获取用户信息 // 初始化:自动微信授权并获取用户信息
useEffect(() => { useEffect(() => {
@@ -38,21 +41,21 @@ const MainPage: React.FC = () => {
if (!hasValidToken) { if (!hasValidToken) {
try { try {
console.log('开始微信授权...'); console.log("开始微信授权...");
const loginRes = await wechat_auth_login(); const loginRes = await wechat_auth_login();
if (loginRes.success && loginRes.token) { if (loginRes.success && loginRes.token) {
save_login_state(loginRes.token, loginRes.user_info); save_login_state(loginRes.token, loginRes.user_info);
console.log('微信授权成功'); console.log("微信授权成功");
} else { } else {
// 显示错误提示 // 显示错误提示
setAuthErrorMessage(loginRes.message || '微信授权失败'); setAuthErrorMessage(loginRes.message || "微信授权失败");
setShowAuthError(true); setShowAuthError(true);
return; return;
} }
} catch (error) { } catch (error) {
console.error('微信授权异常:', error); console.error("微信授权异常:", error);
setAuthErrorMessage('微信授权失败,请重试'); setAuthErrorMessage("微信授权失败,请重试");
setShowAuthError(true); setShowAuthError(true);
return; return;
} }
@@ -62,8 +65,9 @@ const MainPage: React.FC = () => {
if (tokenManager.hasValidToken()) { if (tokenManager.hasValidToken()) {
try { try {
await fetchUserInfo(); await fetchUserInfo();
await checkNicknameChangeStatus();
} catch (error) { } catch (error) {
console.error('获取用户信息失败:', error); console.error("获取用户信息失败:", error);
} }
} }
}; };
@@ -75,19 +79,20 @@ const MainPage: React.FC = () => {
useEffect(() => { useEffect(() => {
if (showAuthError) { if (showAuthError) {
Taro.showModal({ Taro.showModal({
title: '授权失败', title: "授权失败",
content: `${authErrorMessage}\n\n请重启小程序后重试`, content: `${authErrorMessage}\n\n请重启小程序后重试`,
showCancel: false, showCancel: false,
confirmText: '我知道了', confirmText: "我知道了",
success: () => { success: () => {
setShowAuthError(false); setShowAuthError(false);
} },
}); });
} }
}, [showAuthError, authErrorMessage]); }, [showAuthError, authErrorMessage]);
// 处理标签切换 // 处理标签切换
const handleTabChange = useCallback((code: string) => { const handleTabChange = useCallback(
(code: string) => {
if (code === currentTab) { if (code === currentTab) {
return; return;
} }
@@ -97,7 +102,9 @@ const MainPage: React.FC = () => {
scrollTop: 0, scrollTop: 0,
duration: 300, duration: 300,
}); });
}, [currentTab]); },
[currentTab]
);
// 处理发布菜单显示/隐藏 // 处理发布菜单显示/隐藏
const handlePublishMenuVisibleChange = useCallback((visible: boolean) => { const handlePublishMenuVisibleChange = useCallback((visible: boolean) => {
@@ -120,7 +127,8 @@ const MainPage: React.FC = () => {
}, []); }, []);
// 处理列表页导航状态变化 // 处理列表页导航状态变化
const handleListNavStateChange = useCallback((state: { const handleListNavStateChange = useCallback(
(state: {
isShowInputCustomerNavBar?: boolean; isShowInputCustomerNavBar?: boolean;
isDistanceFilterVisible?: boolean; isDistanceFilterVisible?: boolean;
isCityPickerVisible?: boolean; isCityPickerVisible?: boolean;
@@ -134,14 +142,16 @@ const MainPage: React.FC = () => {
if (state.isCityPickerVisible !== undefined) { if (state.isCityPickerVisible !== undefined) {
setIsCityPickerVisible(state.isCityPickerVisible); setIsCityPickerVisible(state.isCityPickerVisible);
} }
}, []); },
[]
);
// 滚动到顶部 // 滚动到顶部
const scrollToTop = useCallback(() => { const scrollToTop = useCallback(() => {
// 如果当前是列表页,触发列表页内部滚动 // 如果当前是列表页,触发列表页内部滚动
if (currentTab === "list") { if (currentTab === "list") {
// 通过状态变化触发 ListPageContent 内部滚动 // 通过状态变化触发 ListPageContent 内部滚动
setListPageScrollToTopTrigger(prev => prev + 1); setListPageScrollToTopTrigger((prev) => prev + 1);
} else { } else {
// 其他页面使用 pageScrollTo // 其他页面使用 pageScrollTo
(Taro as any).pageScrollTo({ (Taro as any).pageScrollTo({
@@ -154,13 +164,22 @@ const MainPage: React.FC = () => {
// 动态控制 GuideBar 的 z-index // 动态控制 GuideBar 的 z-index
useEffect(() => { useEffect(() => {
if (isPublishMenuVisible) { if (isPublishMenuVisible) {
setGuideBarZIndex('high'); setGuideBarZIndex("high");
} else if (isDistanceFilterVisible || isCityPickerVisible || isFilterPopupVisible) { } else if (
setGuideBarZIndex('low'); isDistanceFilterVisible ||
isCityPickerVisible ||
isFilterPopupVisible
) {
setGuideBarZIndex("low");
} else { } else {
setGuideBarZIndex('high'); setGuideBarZIndex("high");
} }
}, [isPublishMenuVisible, isDistanceFilterVisible, isCityPickerVisible, isFilterPopupVisible]); }, [
isPublishMenuVisible,
isDistanceFilterVisible,
isCityPickerVisible,
isFilterPopupVisible,
]);
// 渲染自定义导航栏(参考原始页面的实现) // 渲染自定义导航栏(参考原始页面的实现)
const renderCustomNavbar = () => { const renderCustomNavbar = () => {
@@ -190,21 +209,15 @@ const MainPage: React.FC = () => {
); );
} else if (currentTab === "personal") { } else if (currentTab === "personal") {
// 我的页:使用 GeneralNavbar 显示标题 // 我的页:使用 GeneralNavbar 显示标题
return ( return <GeneralNavbar title="" titlePosition="left" showBack={false} />;
<GeneralNavbar
title=""
titlePosition="left"
showBack={false}
/>
);
} }
return null; return null;
}; };
const handleGrandchildTrigger = (value) => { const handleGrandchildTrigger = (value) => {
console.log('[MainPage] handleGrandchildTrigger called with:', value); console.log("[MainPage] handleGrandchildTrigger called with:", value);
setShowGuideBar(!value); setShowGuideBar(!value);
} };
return ( return (
<FamilyContext.Provider value={{ handleGrandchildTrigger }}> <FamilyContext.Provider value={{ handleGrandchildTrigger }}>
@@ -241,21 +254,21 @@ const MainPage: React.FC = () => {
</View> </View>
{/* 底部导航栏 */} {/* 底部导航栏 */}
{ {showGuideBar ? (
showGuideBar ?
<GuideBar <GuideBar
currentPage={currentTab} currentPage={currentTab}
guideBarClassName={guideBarZIndex === 'low' ? 'guide-bar-low-z-index' : 'guide-bar-high-z-index'} guideBarClassName={
guideBarZIndex === "low"
? "guide-bar-low-z-index"
: "guide-bar-high-z-index"
}
onTabChange={handleTabChange} onTabChange={handleTabChange}
onPublishMenuVisibleChange={handlePublishMenuVisibleChange} onPublishMenuVisibleChange={handlePublishMenuVisibleChange}
/> : />
null ) : null}
}
</View> </View>
</FamilyContext.Provider> </FamilyContext.Provider>
); );
}; };
export default MainPage; export default MainPage;

View File

@@ -82,7 +82,7 @@ export interface UserInfoType {
// 微信授权登录 // 微信授权登录
// phone_code: 可选参数,如果提供则绑定手机号,否则只进行微信授权 // phone_code: 可选参数,如果提供则绑定手机号,否则只进行微信授权
export const wechat_auth_login = async ( export const wechat_auth_login = async (
phone_code?: string, phone_code?: string
): Promise<LoginResponse> => { ): Promise<LoginResponse> => {
try { try {
// 先进行微信登录获取code // 先进行微信登录获取code
@@ -144,7 +144,7 @@ export interface ChangePhoneParams {
// 手机号验证码登录 // 手机号验证码登录
export const phone_auth_login = async ( export const phone_auth_login = async (
params: PhoneLoginParams, params: PhoneLoginParams
): Promise<LoginResponse> => { ): Promise<LoginResponse> => {
try { try {
// 使用 httpService 调用验证验证码接口 // 使用 httpService 调用验证验证码接口
@@ -158,6 +158,7 @@ export const phone_auth_login = async (
// 登录成功后,更新用户信息到 store // 登录成功后,更新用户信息到 store
try { try {
await useUser.getState().fetchUserInfo(); await useUser.getState().fetchUserInfo();
await useUser.getState().checkNicknameChangeStatus();
} catch (error) { } catch (error) {
console.error("更新用户信息到 store 失败:", error); console.error("更新用户信息到 store 失败:", error);
} }
@@ -216,7 +217,7 @@ export const send_sms_code = async (phone: string): Promise<SmsResponse> => {
// 验证短信验证码 // 验证短信验证码
export const verify_sms_code = async ( export const verify_sms_code = async (
phone: string, phone: string,
code: string, code: string
): Promise<VerifyCodeResponse> => { ): Promise<VerifyCodeResponse> => {
try { try {
const response = await httpService.post("user/sms/verify", { const response = await httpService.post("user/sms/verify", {
@@ -378,8 +379,6 @@ export const refresh_login_status = async (): Promise<boolean> => {
} }
}; };
// 更新用户手机号 // 更新用户手机号
export const updateUserPhone = async (payload: ChangePhoneParams) => { export const updateUserPhone = async (payload: ChangePhoneParams) => {
try { try {
@@ -389,13 +388,17 @@ export const updateUserPhone = async (payload: ChangePhoneParams) => {
console.error("更新用户手机号失败:", error); console.error("更新用户手机号失败:", error);
throw error; throw error;
} }
} };
// 获取指定用户信息 // 获取指定用户信息
export const getUserInfoById = async (id) => { export const getUserInfoById = async (id) => {
try { try {
const response = await httpService.post("/user/detail_by_id", { id }, { const response = await httpService.post(
"/user/detail_by_id",
{ id },
{
showLoading: false, showLoading: false,
},); }
);
return response; return response;
} catch (error) { } catch (error) {
console.error("获取用户信息失败:", error); console.error("获取用户信息失败:", error);
@@ -436,13 +439,13 @@ let silentLoginPromise: Promise<LoginResponse> | null = null;
export const silentLogin = async (): Promise<LoginResponse> => { export const silentLogin = async (): Promise<LoginResponse> => {
// 如果已经有正在进行的静默登录,直接返回该 Promise // 如果已经有正在进行的静默登录,直接返回该 Promise
if (silentLoginPromise) { if (silentLoginPromise) {
console.log('静默登录正在进行中,等待结果...'); console.log("静默登录正在进行中,等待结果...");
return silentLoginPromise; return silentLoginPromise;
} }
// 先检查是否已经登录 // 先检查是否已经登录
if (check_login_status()) { if (check_login_status()) {
console.log('已登录,跳过静默登录'); console.log("已登录,跳过静默登录");
return { return {
success: true, success: true,
message: "已登录", message: "已登录",
@@ -454,13 +457,13 @@ export const silentLogin = async (): Promise<LoginResponse> => {
// 创建静默登录 Promise // 创建静默登录 Promise
silentLoginPromise = (async (): Promise<LoginResponse> => { silentLoginPromise = (async (): Promise<LoginResponse> => {
try { try {
console.log('开始执行静默登录...'); console.log("开始执行静默登录...");
// 调用微信登录获取code // 调用微信登录获取code
const login_result = await Taro.login(); const login_result = await Taro.login();
console.log('微信登录结果:', login_result); console.log("微信登录结果:", login_result);
if (!login_result.code) { if (!login_result.code) {
console.error('微信登录失败未获取到code'); console.error("微信登录失败未获取到code");
return { return {
success: false, success: false,
message: "微信登录失败", message: "微信登录失败",
@@ -468,15 +471,19 @@ export const silentLogin = async (): Promise<LoginResponse> => {
} }
// 调用微信授权接口,不传 phone_code静默登录 // 调用微信授权接口,不传 phone_code静默登录
console.log('调用后端接口进行静默登录...'); console.log("调用后端接口进行静默登录...");
const auth_response = await httpService.post("user/wx_auth", { const auth_response = await httpService.post(
"user/wx_auth",
{
code: login_result.code, code: login_result.code,
// 不传 phone_code实现静默登录 // 不传 phone_code实现静默登录
}, { },
{
showLoading: false, // 静默登录不显示loading showLoading: false, // 静默登录不显示loading
}); }
);
console.log('后端接口响应:', auth_response); console.log("后端接口响应:", auth_response);
if (auth_response.code === 0) { if (auth_response.code === 0) {
const token = auth_response.data?.token || ""; const token = auth_response.data?.token || "";
@@ -484,11 +491,11 @@ export const silentLogin = async (): Promise<LoginResponse> => {
// 保存登录状态 // 保存登录状态
if (token && user_info) { if (token && user_info) {
console.log('保存登录状态...'); console.log("保存登录状态...");
save_login_state(token, user_info); save_login_state(token, user_info);
console.log('静默登录成功,已保存登录状态'); console.log("静默登录成功,已保存登录状态");
} else { } else {
console.warn('静默登录成功但token或user_info为空'); console.warn("静默登录成功但token或user_info为空");
} }
return { return {
@@ -498,7 +505,7 @@ export const silentLogin = async (): Promise<LoginResponse> => {
user_info, user_info,
}; };
} else { } else {
console.error('静默登录失败:', auth_response.message); console.error("静默登录失败:", auth_response.message);
return { return {
success: false, success: false,
message: auth_response.message || "静默登录失败", message: auth_response.message || "静默登录失败",

View File

@@ -819,7 +819,11 @@ const EditProfilePage: React.FC = () => {
} }
initialValue={form_data[editing_field as keyof typeof form_data] || ""} initialValue={form_data[editing_field as keyof typeof form_data] || ""}
maxLength={editing_field === "nickname" ? 24 : 100} maxLength={editing_field === "nickname" ? 24 : 100}
invalidCharacters={editing_field === "nickname" ? "@<>/" : ""} invalidCharacters={
editing_field === "nickname"
? /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\(\)\s]*$/
: null
}
onSave={handle_edit_modal_save} onSave={handle_edit_modal_save}
onCancel={handle_edit_modal_cancel} onCancel={handle_edit_modal_cancel}
validationMessage={ validationMessage={

View File

@@ -156,12 +156,11 @@
.popup_text { .popup_text {
font-family: DingTalk JinBuTi; font-family: DingTalk JinBuTi;
font-weight: 400; font-weight: 600;
font-style: Regular; font-style: Regular;
font-size: 20px; font-size: 20px;
line-height: 16px; line-height: 16px;
margin: 20px 0; margin: 20px 0;
font-style: italic;
.integer { .integer {
font-size: 36px; font-size: 36px;
} }

View File

@@ -1,4 +1,8 @@
import { check_login_status, get_user_token, silentLogin } from "@/services/loginService"; import {
check_login_status,
get_user_token,
silentLogin,
} from "@/services/loginService";
import { useUser } from "@/store/userStore"; import { useUser } from "@/store/userStore";
import tokenManager from "@/utils/tokenManager"; import tokenManager from "@/utils/tokenManager";
@@ -15,7 +19,7 @@ const initUserAuthCore = async (): Promise<void> => {
// 如果已经登录且有用户信息,跳过 // 如果已经登录且有用户信息,跳过
const login_status = check_login_status(); const login_status = check_login_status();
const { user, fetchUserInfo } = useUser.getState(); const { user, fetchUserInfo, checkNicknameChangeStatus } = useUser.getState();
if (login_status && user && Object.keys(user).length > 0) { if (login_status && user && Object.keys(user).length > 0) {
return Promise.resolve(); return Promise.resolve();
} }
@@ -27,8 +31,9 @@ const initUserAuthCore = async (): Promise<void> => {
// 已登录,获取用户信息 // 已登录,获取用户信息
try { try {
await fetchUserInfo(); await fetchUserInfo();
await checkNicknameChangeStatus();
} catch (error) { } catch (error) {
console.error('获取用户信息失败:', error); console.error("获取用户信息失败:", error);
} }
} else { } else {
// 未登录,尝试静默登录 // 未登录,尝试静默登录
@@ -37,14 +42,15 @@ const initUserAuthCore = async (): Promise<void> => {
if (loginResult.success) { if (loginResult.success) {
// 静默登录成功,获取用户信息 // 静默登录成功,获取用户信息
await fetchUserInfo(); await fetchUserInfo();
await checkNicknameChangeStatus();
} }
} catch (error) { } catch (error) {
console.error('静默登录失败:', error); console.error("静默登录失败:", error);
// 静默登录失败不影响使用 // 静默登录失败不影响使用
} }
} }
} catch (error) { } catch (error) {
console.error('初始化用户授权失败:', error); console.error("初始化用户授权失败:", error);
} finally { } finally {
isInitializingAuth = false; isInitializingAuth = false;
authInitPromise = null; authInitPromise = null;
@@ -87,14 +93,18 @@ export const waitForAuthInit = async (): Promise<void> => {
// 等待 token 真正存在(最多等待 2 秒) // 等待 token 真正存在(最多等待 2 秒)
let retryCount = 0; let retryCount = 0;
const maxRetries = 20; // 20 * 100ms = 2秒 const maxRetries = 20; // 20 * 100ms = 2秒
while (retryCount < maxRetries && !tokenManager.hasValidToken() && !get_user_token()) { while (
await new Promise(resolve => setTimeout(resolve, 100)); retryCount < maxRetries &&
!tokenManager.hasValidToken() &&
!get_user_token()
) {
await new Promise((resolve) => setTimeout(resolve, 100));
retryCount++; retryCount++;
} }
// 如果还是没有 token记录警告但继续执行 // 如果还是没有 token记录警告但继续执行
if (!tokenManager.hasValidToken() && !get_user_token()) { if (!tokenManager.hasValidToken() && !get_user_token()) {
console.warn('等待静默登录完成,但未获取到 token'); console.warn("等待静默登录完成,但未获取到 token");
} }
}; };
@@ -102,4 +112,3 @@ export const waitForAuthInit = async (): Promise<void> => {
export const initUserAuth = () => { export const initUserAuth = () => {
return initUserAuthCore(); return initUserAuthCore();
}; };