Axion/src/context/AuthContext.tsx
2025-12-07 12:14:33 -04:00

110 lines
2.5 KiB
TypeScript

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<boolean>;
logout: () => void;
isAuthenticated: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(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<User | null>(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<boolean> => {
// 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 (
<AuthContext.Provider value={{ user, login, logout, isAuthenticated: !!user }}>
{children}
</AuthContext.Provider>
);
};