65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
"use client";
|
||
|
||
/**
|
||
* 根级 Client Providers 包装
|
||
*
|
||
* 把所有功能 Provider 串起来:
|
||
* AuthProvider → UserProvider → PaymentProvider → ChatProvider → PrivateRoomProvider
|
||
* + AuthStatusChecker(启动时一次:派发 AuthInit)
|
||
* + OAuthSessionSync (持续监听 NextAuth session → auth machine)
|
||
* + UserAuthSync (auth 登录态恢复后 hydrate user machine)
|
||
* + ChatAuthSync (持续监听 auth loginStatus → chat machine)
|
||
*
|
||
* 它们始终挂载,保证各页面直接 `use*State()` / `use*Dispatch()` 即可,
|
||
* 无需在每个页面单独包裹。
|
||
*/
|
||
|
||
import type { ReactNode } from "react";
|
||
|
||
import { ViewportCssVarsProvider } from "@/providers/viewport-css-vars-provider";
|
||
import { AppNavigationGuard } from "@/router/app-navigation-guard";
|
||
import { AuthProvider } from "@/stores/auth/auth-context";
|
||
import { AuthStatusChecker } from "@/stores/auth/auth-status-checker";
|
||
import { OAuthSessionSync } from "@/stores/auth/oauth-session-sync";
|
||
import { ChatProvider } from "@/stores/chat/chat-context";
|
||
import { PaymentProvider } from "@/stores/payment";
|
||
import { PrivateRoomProvider } from "@/stores/private-room";
|
||
import {
|
||
ChatAuthSync,
|
||
PaymentSuccessSync,
|
||
UserAuthSync,
|
||
} from "@/stores/sync";
|
||
import { UserProvider } from "@/stores/user/user-context";
|
||
|
||
export interface RootProvidersProps {
|
||
children: ReactNode;
|
||
}
|
||
|
||
export function RootProviders({ children }: RootProvidersProps) {
|
||
return (
|
||
<ViewportCssVarsProvider>
|
||
<AuthProvider>
|
||
{/* AuthStatusChecker 必须在 AuthProvider 内部(依赖 useAuthDispatch),
|
||
* 必须在 UserProvider/ChatProvider 外部(它们可能在 init 完成前就 mount) */}
|
||
<AuthStatusChecker />
|
||
{/* OAuthSessionSync 同样依赖 AuthProvider 上下文 */}
|
||
<OAuthSessionSync />
|
||
<AppNavigationGuard />
|
||
<UserProvider>
|
||
<UserAuthSync />
|
||
<PaymentProvider>
|
||
<ChatProvider>
|
||
<PrivateRoomProvider>
|
||
<ChatAuthSync />
|
||
<PaymentSuccessSync />
|
||
{children}
|
||
<div id="toast-portal" />
|
||
</PrivateRoomProvider>
|
||
</ChatProvider>
|
||
</PaymentProvider>
|
||
</UserProvider>
|
||
</AuthProvider>
|
||
</ViewportCssVarsProvider>
|
||
);
|
||
}
|