import React, { createContext, useContext, useState, useEffect } from 'react'; // This acts as our authentication context for the React application interface User { username: string; email?: string; full_name?: string; scopes: string[]; } interface AuthContextType { token: string | null; user: User | null; login: (token: string, user: User) => void; logout: () => void; isAuthenticated: boolean; } const AuthContext = createContext(undefined); export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [token, setToken] = useState(localStorage.getItem('token')); const [user, setUser] = useState(null); useEffect(() => { const storedUser = localStorage.getItem('user'); if (storedUser) { try { setUser(JSON.parse(storedUser)); } catch (e) { console.error('Failed to parse stored user', e); } } }, []); const login = (newToken: string, newUser: User) => { localStorage.setItem('token', newToken); localStorage.setItem('user', JSON.stringify(newUser)); setToken(newToken); setUser(newUser); }; const logout = () => { localStorage.removeItem('token'); localStorage.removeItem('user'); setToken(null); setUser(null); }; return ( {children} ); }; export const useAuth = () => { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; };