import React, { createContext, useContext, useState, useEffect, useMemo, useCallback, } from "react"; import axios from "axios"; const AuthContext = createContext(null); const API = `${process.env.REACT_APP_BACKEND_URL}/api`; export const AuthProvider = ({ children }) => { const [user, setUser] = useState(null); const [token, setToken] = useState(localStorage.getItem("token")); const [loading, setLoading] = useState(true); useEffect(() => { const initAuth = async () => { const storedToken = localStorage.getItem("token"); if (storedToken) { try { const response = await axios.get(`${API}/auth/me`, { headers: { Authorization: `Bearer ${storedToken}` }, }); setUser(response.data); setToken(storedToken); } catch (error) { localStorage.removeItem("token"); setToken(null); setUser(null); } } setLoading(false); }; initAuth(); }, []); const login = useCallback(async (email, password) => { const response = await axios.post(`${API}/auth/login`, { email, password }); const { access_token, user: userData } = response.data; localStorage.setItem("token", access_token); setToken(access_token); setUser(userData); return userData; }, []); const register = useCallback(async (name, email, password) => { const response = await axios.post(`${API}/auth/register`, { name, email, password, }); const { access_token, user: userData } = response.data; localStorage.setItem("token", access_token); setToken(access_token); setUser(userData); return userData; }, []); const logout = useCallback(() => { localStorage.removeItem("token"); setToken(null); setUser(null); }, []); const value = useMemo( () => ({ user, token, loading, login, register, logout, isAuthenticated: !!token, }), [user, token, loading, login, register, logout] ); return {children}; }; export const useAuth = () => { const context = useContext(AuthContext); if (!context) { throw new Error("useAuth must be used within an AuthProvider"); } return context; };