import React, { useState, useEffect } from 'react'; import { Layout } from '../components/Layout/Layout'; import { Users, Edit, Trash2, Plus, Search, Filter, Save, X } from 'lucide-react'; import { User, UserRole } from '../types'; import { useAuth } from '../context/AuthContext'; const API_URL = 'http://localhost:3001/api'; export const UserManagement: React.FC = () => { const { user: currentUser } = useAuth(); const [users, setUsers] = useState([]); const [searchTerm, setSearchTerm] = useState(''); const [showForm, setShowForm] = useState(false); const [editingUser, setEditingUser] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [formData, setFormData] = useState({ name: '', email: '', role: 'employee' as UserRole, jobTitle: '', department: '', phone: '', address: '', }); useEffect(() => { loadUsers(); }, []); const getAuthHeaders = () => { const token = localStorage.getItem('token'); return { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, }; }; const loadUsers = async () => { try { setLoading(true); const response = await fetch(`${API_URL}/users`, { headers: getAuthHeaders(), }); if (!response.ok) { throw new Error('Failed to load users'); } const data = await response.json(); // Map API response to User type const mappedUsers: User[] = data.map((u: any) => ({ id: u.id, name: u.name, email: u.email, role: u.role, })); setUsers(mappedUsers); } catch (error) { console.error('Error loading users:', error); setError('Failed to load users'); } finally { setLoading(false); } }; const handleCreate = () => { setEditingUser(null); setFormData({ name: '', email: '', role: 'employee', jobTitle: '', department: '', phone: '', address: '' }); setShowForm(true); setError(''); }; const handleEdit = (user: User) => { setEditingUser(user); setFormData({ name: user.name, email: user.email, role: user.role, jobTitle: '', department: '', phone: '', address: '', }); setShowForm(true); setError(''); }; const handleDelete = async (id: string) => { if (!window.confirm('Are you sure you want to delete this user?')) { return; } try { setLoading(true); const response = await fetch(`${API_URL}/users/${id}`, { method: 'DELETE', headers: getAuthHeaders(), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to delete user'); } await loadUsers(); } catch (error: any) { console.error('Error deleting user:', error); setError(error.message || 'Failed to delete user'); } finally { setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setLoading(true); try { if (editingUser) { // Update existing user const response = await fetch(`${API_URL}/users/${editingUser.id}`, { method: 'PUT', headers: getAuthHeaders(), body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to update user'); } await loadUsers(); setShowForm(false); setEditingUser(null); } else { // Create new user const response = await fetch(`${API_URL}/users`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || 'Failed to create user'); } await loadUsers(); setShowForm(false); setFormData({ name: '', email: '', role: 'employee', jobTitle: '', department: '', phone: '', address: '' }); } } catch (error: any) { console.error('Error saving user:', error); setError(error.message || 'Failed to save user'); } finally { setLoading(false); } }; const filteredUsers = users.filter(u => u.name.toLowerCase().includes(searchTerm.toLowerCase()) || u.email.toLowerCase().includes(searchTerm.toLowerCase()) ); return (

User & Role Management

{/* Search and Filters */}
setSearchTerm(e.target.value)} className="bg-transparent border-none outline-none flex-1" />
{/* Error Message */} {error && (
{error}
)} {/* Users Table */}
{loading && !users.length ? (
Loading users...
) : ( {filteredUsers.length === 0 ? ( ) : ( filteredUsers.map((user) => ( )) )}
Name Email Role Actions
No users found
{user.name}
{user.email}
{user.role.toUpperCase()}
{user.id !== currentUser?.id && ( )}
)}
{/* Create/Edit Form Modal */} {showForm && (

{editingUser ? 'Edit User' : 'Create New User'}

{error && (
{error}
)}
setFormData({ ...formData, name: e.target.value })} required className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
setFormData({ ...formData, email: e.target.value })} required className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
{formData.role !== 'admin' && ( <>
setFormData({ ...formData, jobTitle: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
setFormData({ ...formData, department: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
setFormData({ ...formData, phone: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
setFormData({ ...formData, address: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
)}
)}
); };