fix(chat): hydrate user avatar after auth restore

This commit is contained in:
2026-06-17 14:23:07 +08:00
parent 287affa34a
commit 1d7d9cfbfc
2 changed files with 37 additions and 0 deletions
+3
View File
@@ -7,6 +7,7 @@
* AuthProvider → UserProvider → SidebarProvider → ChatProvider * AuthProvider → UserProvider → SidebarProvider → ChatProvider
* + AuthStatusChecker(启动时一次:派发 AuthInit * + AuthStatusChecker(启动时一次:派发 AuthInit
* + OAuthSessionSync (持续监听 NextAuth session → auth machine * + OAuthSessionSync (持续监听 NextAuth session → auth machine
* + UserAuthSync auth 登录态恢复后 hydrate user machine
* *
* 它们始终挂载,保证各页面直接 `use*State()` / `use*Dispatch()` 即可, * 它们始终挂载,保证各页面直接 `use*State()` / `use*Dispatch()` 即可,
* 无需在每个页面单独包裹。 * 无需在每个页面单独包裹。
@@ -19,6 +20,7 @@ import { AuthStatusChecker } from "@/stores/auth/auth-status-checker";
import { OAuthSessionSync } from "@/stores/auth/oauth-session-sync"; import { OAuthSessionSync } from "@/stores/auth/oauth-session-sync";
import { ChatProvider } from "@/stores/chat/chat-context"; import { ChatProvider } from "@/stores/chat/chat-context";
import { SidebarProvider } from "@/stores/sidebar/sidebar-context"; import { SidebarProvider } from "@/stores/sidebar/sidebar-context";
import { UserAuthSync } from "@/stores/user/user-auth-sync";
import { UserProvider } from "@/stores/user/user-context"; import { UserProvider } from "@/stores/user/user-context";
export interface RootProvidersProps { export interface RootProvidersProps {
@@ -34,6 +36,7 @@ export function RootProviders({ children }: RootProvidersProps) {
{/* OAuthSessionSync 同样依赖 AuthProvider 上下文 */} {/* OAuthSessionSync 同样依赖 AuthProvider 上下文 */}
<OAuthSessionSync /> <OAuthSessionSync />
<UserProvider> <UserProvider>
<UserAuthSync />
<SidebarProvider> <SidebarProvider>
<ChatProvider> <ChatProvider>
{children} {children}
+34
View File
@@ -0,0 +1,34 @@
"use client";
/**
* Auth → User 启动同步器
*
* AuthStatusChecker 只负责恢复 loginStatus;头像等登录用户资料由
* UserStorage 持久化在 user machine 这一侧。冷启动直达 /chat 时,
* 没有经过 splash/auth 的跳转副作用,因此需要在登录态恢复后主动
* hydrate user store。
*/
import { useEffect, useRef } from "react";
import { useAuthState } from "@/stores/auth/auth-context";
import { useUserDispatch } from "./user-context";
export function UserAuthSync() {
const { loginStatus } = useAuthState();
const userDispatch = useUserDispatch();
const lastInitializedStatusRef = useRef<string | null>(null);
useEffect(() => {
if (loginStatus === "notLoggedIn" || loginStatus === "guest") {
lastInitializedStatusRef.current = null;
return;
}
if (lastInitializedStatusRef.current === loginStatus) return;
lastInitializedStatusRef.current = loginStatus;
userDispatch({ type: "UserInit" });
}, [loginStatus, userDispatch]);
return null;
}