import { createContext, useContext, useState, useEffect, ReactNode } from "react"; import { User, authApi } from "../api/client"; interface AuthContextType { user: User | null; token: string | null; isLoading: boolean; login: (email: string, password: string) => Promise; register: (email: string, password: string, name?: string) => Promise; logout: () => void; } const AuthContext = createContext(null); export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [token, setToken] = useState(() => localStorage.getItem("token")); const [isLoading, setIsLoading] = useState(true); useEffect(() => { if (token) { authApi .me() .then((res) => setUser(res.data)) .catch(() => { localStorage.removeItem("token"); setToken(null); }) .finally(() => setIsLoading(false)); } else { setIsLoading(false); } }, [token]); const login = async (email: string, password: string) => { const res = await authApi.login({ email, password }); localStorage.setItem("token", res.data.token); setToken(res.data.token); setUser(res.data.user); }; const register = async (email: string, password: string, name?: string) => { const res = await authApi.register({ email, password, name }); localStorage.setItem("token", res.data.token); setToken(res.data.token); setUser(res.data.user); }; const logout = () => { localStorage.removeItem("token"); setToken(null); setUser(null); }; return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (!context) { throw new Error("useAuth must be used within an AuthProvider"); } return context; }