import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; import { User, UserRole } from '../types'; interface AuthContextType { user: User | null; login: (email: string, password: string) => Promise; logout: () => void; isAuthenticated: boolean; } const AuthContext = createContext(undefined); export const useAuth = () => { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within AuthProvider'); } return context; }; // Mock users database - in production, this would be in a real database const MOCK_USERS = [ { id: '1', email: 'admin@company.com', password: 'admin123', name: 'Admin User', role: 'admin' as UserRole, }, { id: '2', email: 'hr@company.com', password: 'hr123', name: 'HR Manager', role: 'hr' as UserRole, }, { id: '3', email: 'payroll@company.com', password: 'payroll123', name: 'Payroll Admin', role: 'payroll' as UserRole, }, { id: '4', email: 'manager@company.com', password: 'manager123', name: 'Team Manager', role: 'manager' as UserRole, }, { id: '5', email: 'employee@company.com', password: 'employee123', name: 'John Doe', role: 'employee' as UserRole, }, ]; export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const [user, setUser] = useState(null); useEffect(() => { // Check for stored session const storedUser = localStorage.getItem('user'); if (storedUser) { try { setUser(JSON.parse(storedUser)); } catch (e) { localStorage.removeItem('user'); } } }, []); const login = async (email: string, password: string): Promise => { // Simulate API call delay await new Promise(resolve => setTimeout(resolve, 500)); const foundUser = MOCK_USERS.find( u => u.email === email && u.password === password ); if (foundUser) { const userData: User = { id: foundUser.id, name: foundUser.name, email: foundUser.email, role: foundUser.role, }; setUser(userData); localStorage.setItem('user', JSON.stringify(userData)); return true; } return false; }; const logout = () => { setUser(null); localStorage.removeItem('user'); }; return ( {children} ); };