diff --git a/apps/frontend/app/ClientProvider.tsx b/apps/frontend/app/ClientProvider.tsx new file mode 100644 index 0000000..1e0e03d --- /dev/null +++ b/apps/frontend/app/ClientProvider.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useEffect } from 'react'; +import { useUserStore } from '@/store/useUserStore'; +import { User } from '@/lib/types/user'; + +export function ClientProvider({ + initialUser, + children, +}: { + initialUser: User | null; + children: React.ReactNode; +}) { + const setUser = useUserStore((state) => state.setUser); + const setInitialized = useUserStore((state) => state.setInitialized); + + useEffect(() => { + if (initialUser) { + setUser(initialUser); + } + setInitialized(); + }, [initialUser, setUser, setInitialized]); + + return <>{children}; +} \ No newline at end of file diff --git a/apps/frontend/app/layout.tsx b/apps/frontend/app/layout.tsx index 599f128..cdac60f 100644 --- a/apps/frontend/app/layout.tsx +++ b/apps/frontend/app/layout.tsx @@ -3,6 +3,8 @@ import "./globals.css"; import { ThemeProvider } from "../components/theme-provider"; import { metadata } from "./config/metadata"; import { Toaster } from "sonner"; +import { UserAPI } from "@/lib/api/server"; +import { ClientProvider } from "./ClientProvider"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -16,28 +18,32 @@ const geistMono = Geist_Mono({ export { metadata }; -export default function RootLayout({ +export default async function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { + const user = await UserAPI.me().catch(() => null); + return ( - -
- {children} - -
-
+ + +
+ {children} + +
+
+
); diff --git a/apps/frontend/store/useUserStore.ts b/apps/frontend/store/useUserStore.ts new file mode 100644 index 0000000..54819d4 --- /dev/null +++ b/apps/frontend/store/useUserStore.ts @@ -0,0 +1,27 @@ +// store/useUserStore.ts +import { User } from '@/lib/types/user'; +import { create } from 'zustand'; +import { devtools } from 'zustand/middleware'; + +interface UserState { + user: User | null; + isLoading: boolean; + initialized: boolean; + + // Actions + setInitialized: () => void; + setUser: (user: User | null) => void; + clearUser: () => void; +} + +export const useUserStore = create()( + devtools((set, get) => ({ + user: null, + isLoading: false, + initialized: false, + + setInitialized: () => set({ initialized: true }), + setUser: (user) => set({ user, isLoading: false }), + clearUser: () => set({ user: null }), + })) +); \ No newline at end of file