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