Browse Source
1. 新增GlobalAuthProvider统一处理用户认证逻辑,移除页面内重复的认证代码 2. 登录成功后自动刷新页面同步用户状态 3. 优化I18nProvider加载状态,修复语言切换逻辑 4. 首页新增未登录状态的登录按钮,替换硬编码文案为国际化翻译 5. 修复国际化测试用例,调整断言顺序与逻辑 6. 调整根布局默认语言为zh-CN,包裹全局认证与Suspense组件 7. 移除canvas页面冗余的LoginModal组件与认证拦截器初始化代码feature/group
7 changed files with 94 additions and 40 deletions
@ -0,0 +1,40 @@ |
|||
"use client"; |
|||
|
|||
import { useEffect, useState, type ReactNode } from "react"; |
|||
import { useSearchParams } from "next/navigation"; |
|||
import { LoginModal } from "@/components/auth/LoginModal"; |
|||
import { getStoredLoginToken, useUserStore } from "@/store/userStore"; |
|||
import { installAuthFetchInterceptor } from "@/utils/authFetch"; |
|||
|
|||
export function GlobalAuthProvider({ children }: { children: ReactNode }) { |
|||
const searchParams = useSearchParams(); |
|||
const queryToken = searchParams.get("token") || ""; |
|||
const fetchUserInfo = useUserStore((state) => state.fetchUserInfo); |
|||
const [isResolvingQueryToken, setIsResolvingQueryToken] = useState(() => !!queryToken); |
|||
|
|||
useEffect(() => { |
|||
return installAuthFetchInterceptor(); |
|||
}, []); |
|||
|
|||
useEffect(() => { |
|||
if (queryToken) { |
|||
setIsResolvingQueryToken(true); |
|||
void fetchUserInfo(queryToken, { forceRefresh: true }).finally(() => { |
|||
setIsResolvingQueryToken(false); |
|||
}); |
|||
return; |
|||
} |
|||
|
|||
setIsResolvingQueryToken(false); |
|||
if (getStoredLoginToken()) { |
|||
void fetchUserInfo("", { forceRefresh: true }); |
|||
} |
|||
}, [fetchUserInfo, queryToken]); |
|||
|
|||
return ( |
|||
<> |
|||
{isResolvingQueryToken ? null : children} |
|||
<LoginModal /> |
|||
</> |
|||
); |
|||
} |
|||
Loading…
Reference in new issue