fix(chat): hydrate user avatar after auth restore
This commit is contained in:
@@ -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}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user