import { createContext, useContext, useState, useEffect } from 'react'; const AuthContext = createContext(); export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { // Check for existing token on app load const token = localStorage.getItem('auth_token'); if (token) { // Verify token and set user verifyToken(token); } else { setLoading(false); } }, []); const verifyToken = async (token) => { try { const response = await fetch('/api/auth/verify', { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const userData = await response.json(); setUser(userData); // API returns user data directly, not wrapped in .user } else { localStorage.removeItem('auth_token'); } } catch (error) { console.error('Token verification failed:', error); localStorage.removeItem('auth_token'); } finally { setLoading(false); } }; const login = async (email, password) => { try { const response = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, password }), }); const data = await response.json(); if (response.ok) { localStorage.setItem('auth_token', data.token); setUser(data.user); return { success: true }; } else { return { success: false, error: data.error }; } } catch (error) { return { success: false, error: 'Network error' }; } }; const register = async (email, password) => { try { const response = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, password }), }); const data = await response.json(); if (response.ok) { localStorage.setItem('auth_token', data.token); setUser(data.user); return { success: true }; } else { return { success: false, error: data.error }; } } catch (error) { return { success: false, error: 'Network error' }; } }; const logout = () => { localStorage.removeItem('auth_token'); setUser(null); }; const value = { user, loading, login, register, logout, }; return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }