import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; import { message } from 'antd'; import { apiService } from '../services/apiService'; interface User { email: string; permissions: string[]; } interface AuthContextType { user: User | null; login: (email: string) => Promise; logout: () => void; loading: boolean; } const AuthContext = createContext(undefined); export const useAuth = () => { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }; interface AuthProviderProps { children: ReactNode; } export const AuthProvider: React.FC = ({ children }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { // Check if user is already logged in (from localStorage) const savedUser = localStorage.getItem('kms_user'); if (savedUser) { try { const parsedUser = JSON.parse(savedUser); setUser(parsedUser); } catch (error) { console.error('Error parsing saved user:', error); localStorage.removeItem('kms_user'); } } setLoading(false); }, []); const login = async (email: string): Promise => { try { setLoading(true); // Test API connectivity with health check await apiService.healthCheck(); // For demo purposes, we'll simulate login with the provided email // In a real implementation, this would involve proper authentication const userData: User = { email, permissions: ['app.read', 'app.write', 'token.read', 'token.create', 'token.revoke'] }; setUser(userData); localStorage.setItem('kms_user', JSON.stringify(userData)); message.success('Login successful!'); return true; } catch (error) { console.error('Login error:', error); message.error('Login failed. Please check your connection and try again.'); return false; } finally { setLoading(false); } }; const logout = () => { setUser(null); localStorage.removeItem('kms_user'); message.success('Logged out successfully'); }; const value: AuthContextType = { user, login, logout, loading, }; return ( {children} ); };