import React, { createContext, useContext, useState, ReactNode } from 'react'; export interface AuthUser { userId: string; username: string; email: string; token: string; isAdmin?: boolean; } interface AuthContextType { user: AuthUser | null; login: (email: string, password: string) => Promise; register: (username: string, email: string, password: string) => Promise; logout: () => void; loading: boolean; isAuthenticated: boolean; } const AuthContext = createContext(undefined); export const useAuth = (): AuthContextType => { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }; interface AuthProviderProps { children: ReactNode; } // Mock user for testing const mockUser: AuthUser = { userId: 'mock-user-id', username: 'TestUser', email: 'test@example.com', token: 'mock-jwt-token', isAdmin: true, }; export const AuthProvider: React.FC = ({ children }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(false); const login = async (email: string, password: string): Promise => { setLoading(true); try { // Simulate API call delay await new Promise(resolve => setTimeout(resolve, 1000)); // Accept any email/password for demo setUser(mockUser); localStorage.setItem('token', mockUser.token); localStorage.setItem('user', JSON.stringify(mockUser)); } catch (error) { throw error; } finally { setLoading(false); } }; const register = async (username: string, email: string, password: string): Promise => { setLoading(true); try { // Simulate API call delay await new Promise(resolve => setTimeout(resolve, 1000)); const newUser = { ...mockUser, username, email, }; setUser(newUser); localStorage.setItem('token', newUser.token); localStorage.setItem('user', JSON.stringify(newUser)); } catch (error) { throw error; } finally { setLoading(false); } }; const logout = (): void => { setUser(null); localStorage.removeItem('token'); localStorage.removeItem('user'); }; const value: AuthContextType = { user, login, register, logout, loading, isAuthenticated: !!user, }; return {children}; };