import { createContext, useContext, useState, useEffect, ReactNode } from "react"; import { User, authApi, getToken, clearToken } from "../api/client"; interface AuthContextType { user: User | null; isAuthenticated: boolean; 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 [isLoading, setIsLoading] = useState(true); // Check authentication status on mount useEffect(() => { const checkAuth = async () => { const token = getToken(); if (token) { try { const res = await authApi.me(); setUser(res.data); } catch { // Token is invalid or expired, clear it clearToken(); setUser(null); } } setIsLoading(false); }; checkAuth(); }, []); const login = async (email: string, password: string) => { const response = await authApi.login({ email, password }); // Token is automatically stored by authApi.login setUser(response.user); }; const register = async (email: string, password: string, name?: string) => { const response = await authApi.register({ email, password, name }); // Token is automatically stored by authApi.register setUser(response.user); }; const logout = () => { authApi.logout(); setUser(null); }; const isAuthenticated = authApi.isAuthenticated(); return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (!context) { throw new Error("useAuth must be used within an AuthProvider"); } return context; }