import { createContext, useContext, useState, useEffect, useCallback } from 'react'; import api from '../services/api'; const AuthContext = createContext(null); export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const token = localStorage.getItem('token'); if (token) { api.get('/auth/me') .then(res => setUser(res.data.user)) .catch(() => { localStorage.removeItem('token'); }) .finally(() => setLoading(false)); } else { setLoading(false); } }, []); const login = useCallback(async (email, password) => { const res = await api.post('/auth/login', { email, password }); localStorage.setItem('token', res.data.token); setUser(res.data.user); return res.data.user; }, []); const register = useCallback(async (username, displayName, email, password, inviteToken) => { const payload = { username, display_name: displayName, email, password }; if (inviteToken) payload.invite_token = inviteToken; const res = await api.post('/auth/register', payload); if (res.data.needsVerification) { return { needsVerification: true }; } localStorage.setItem('token', res.data.token); setUser(res.data.user); return res.data.user; }, []); const logout = useCallback(async () => { try { await api.post('/auth/logout'); } catch { // ignore — token is removed locally regardless } localStorage.removeItem('token'); setUser(null); }, []); const updateUser = useCallback((updatedUser) => { setUser(updatedUser); }, []); return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }