"use client"; import { createContext, useContext, useState, useEffect, ReactNode } from "react"; const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000"; interface User { id: number; email: string; } interface AuthContextType { user: User | null; isLoading: boolean; login: (email: string, password: string) => Promise; register: (email: string, password: string) => Promise; logout: () => Promise; } const AuthContext = createContext(null); export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { checkAuth(); }, []); const checkAuth = async () => { try { const res = await fetch(`${API_URL}/api/auth/me`, { credentials: "include", }); if (res.ok) { const userData = await res.json(); setUser(userData); } } catch { // Not authenticated } finally { setIsLoading(false); } }; const login = async (email: string, password: string) => { const res = await fetch(`${API_URL}/api/auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, credentials: "include", body: JSON.stringify({ email, password }), }); if (!res.ok) { const error = await res.json(); throw new Error(error.detail || "Login failed"); } const userData = await res.json(); setUser(userData); }; const register = async (email: string, password: string) => { const res = await fetch(`${API_URL}/api/auth/register`, { method: "POST", headers: { "Content-Type": "application/json" }, credentials: "include", body: JSON.stringify({ email, password }), }); if (!res.ok) { const error = await res.json(); throw new Error(error.detail || "Registration failed"); } const userData = await res.json(); setUser(userData); }; const logout = async () => { await fetch(`${API_URL}/api/auth/logout`, { method: "POST", credentials: "include", }); 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; }