import React, { createContext, useContext, useState, useEffect } from 'react'; const API_BASE = import.meta.env.PROD ? '/api' : 'http://localhost:3001/api'; const AuthContext = createContext(); export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; } export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Check if user is already authenticated on app start useEffect(() => { checkAuth(); }, []); const checkAuth = async () => { try { console.log('Checking auth status...'); const response = await fetch(`${API_BASE}/auth/me`, { credentials: 'include' }); console.log('Auth check response:', response.status, response.statusText); if (response.ok) { const data = await response.json(); console.log('Auth check data:', data); setUser(data.user); } else { console.log('Auth check failed, user not authenticated'); setUser(null); } } catch (err) { console.error('Auth check failed:', err); setUser(null); } finally { setLoading(false); } }; const login = async (username, password) => { try { setLoading(true); setError(null); const response = await fetch(`${API_BASE}/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, credentials: 'include', body: JSON.stringify({ username, password }), }); const data = await response.json(); if (response.ok) { setUser(data.user); return { success: true }; } else { setError(data.error || 'Login failed'); return { success: false, error: data.error || 'Login failed' }; } } catch (err) { const errorMessage = 'Network error. Please check if the server is running.'; setError(errorMessage); return { success: false, error: errorMessage }; } finally { setLoading(false); } }; const logout = async () => { try { await fetch(`${API_BASE}/auth/logout`, { method: 'POST', credentials: 'include', }); } catch (err) { console.error('Logout request failed:', err); } finally { setUser(null); setError(null); } }; const changePassword = async (currentPassword, newPassword) => { try { const response = await fetch(`${API_BASE}/auth/change-password`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, credentials: 'include', body: JSON.stringify({ currentPassword, newPassword }), }); const data = await response.json(); if (response.ok) { return { success: true, message: data.message }; } else { return { success: false, error: data.error || 'Password change failed' }; } } catch (err) { return { success: false, error: 'Network error. Please try again.' }; } }; const value = { user, loading, error, login, logout, changePassword, isAdmin: user?.role === 'admin', isAuthenticated: !!user, }; return ( {children} ); }