import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react"; import { apiClient } from "../api/client"; import type { SessionPayload, SessionUser } from "../types"; type AuthState = "loading" | "authenticated" | "unauthenticated"; type AuthContextValue = { state: AuthState; user: SessionUser | null; refreshSession: () => Promise; logout: () => Promise; }; const AuthContext = createContext(undefined); export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const [state, setState] = useState("loading"); const [user, setUser] = useState(null); const refreshSession = useCallback(async () => { setState("loading"); try { const response = await apiClient.get("/auth/me"); setUser(response.data.user); setState("authenticated"); } catch { setUser(null); setState("unauthenticated"); } }, []); const logout = useCallback(async () => { await apiClient.post("/auth/logout"); setUser(null); setState("unauthenticated"); }, []); useEffect(() => { void refreshSession(); }, [refreshSession]); const value = useMemo( () => ({ state, user, refreshSession, logout }), [refreshSession, state, user, logout] ); return {children}; }; export const useAuth = (): AuthContextValue => { const context = useContext(AuthContext); if (!context) { throw new Error("useAuth must be used within AuthProvider"); } return context; };