| "use client"; | |
| import { | |
| createContext, | |
| useContext, | |
| useEffect, | |
| useState, | |
| type ReactNode, | |
| } from "react"; | |
| import React from "react"; | |
| // ---- Types ---- | |
| export interface User { | |
| email: string; | |
| name: string; | |
| } | |
| // ---- Fetch ---- | |
| export async function fetchUser(): Promise<User> { | |
| const res = await fetch("/api/me"); | |
| if (!res.ok) throw new Error(`/api/me returned ${res.status}`); | |
| return (await res.json()) as User; | |
| } | |
| // ---- Context ---- | |
| const UserContext = createContext<User | null>(null); | |
| export function UserProvider({ children }: { children: ReactNode }) { | |
| const [user, setUser] = useState<User | null>(null); | |
| useEffect(() => { | |
| fetchUser() | |
| .then(setUser) | |
| .catch(() => setUser({ email: "dev@proteinea.local", name: "Dev" })); | |
| }, []); | |
| return React.createElement(UserContext.Provider, { value: user }, children); | |
| } | |
| export function useUser(): User | null { | |
| return useContext(UserContext); | |
| } | |