import React, { useEffect, useMemo, useState } from 'react'; import DataTable from '../components/DataTable'; import { usersAPI } from '../services/api'; import { Plus, Trash2, Search, Pencil, ShieldOff, RefreshCcw } from 'lucide-react'; const Users = () => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); const [email, setEmail] = useState(''); const [filter, setFilter] = useState(''); const [isModalOpen, setIsModalOpen] = useState(false); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [editingUser, setEditingUser] = useState(null); const fetchUsers = async (q = '') => { try { setLoading(true); const list = await usersAPI.list(q); setUsers(Array.isArray(list) ? list : []); } catch (e) { setError('Failed to load users'); } finally { setLoading(false); } }; useEffect(() => { fetchUsers(); }, []); const onAddUser = async (e) => { e.preventDefault(); if (!firstName.trim() || !lastName.trim() || !email.trim()) return; try { await usersAPI.create({ firstName, lastName, email }); setFirstName(''); setLastName(''); setEmail(''); await fetchUsers(filter); setIsModalOpen(false); } catch (_) { setError('Failed to create user'); } }; const onDelete = async (id) => { if (!window.confirm('Are you sure you want to delete this user?')) return; await usersAPI.remove(id); await fetchUsers(filter); }; const openEdit = (user) => { setEditingUser(user); setFirstName(user.firstName || ''); setLastName(user.lastName || ''); setEmail(user.email || ''); setIsEditModalOpen(true); }; const onUpdateUser = async (e) => { e.preventDefault(); if (!editingUser) return; try { await usersAPI.update(editingUser.id, { firstName, lastName, email }); await fetchUsers(filter); setIsEditModalOpen(false); setEditingUser(null); setFirstName(''); setLastName(''); setEmail(''); } catch (_) { setError('Failed to update user'); } }; const onToggleActivation = async (id) => { await usersAPI.toggleActivation(id); await fetchUsers(filter); }; const onResetPassword = async (id) => { await usersAPI.resetPassword(id); alert('Password reset successfully.'); }; const columns = useMemo(() => [ { key: 'firstName', header: 'First Name' }, { key: 'lastName', header: 'Last Name' }, { key: 'email', header: 'Email' }, { key: 'isActive', header: 'Active', render: (val) => val ? '✅' : '❌' }, { key: 'actions', header: 'Actions', render: (_val, row) => (
), }, ], []); return (

Users

Manage users: add, edit, activate/deactivate and reset password

{/* Add Modal */} {isModalOpen && ( <>
setIsModalOpen(false)} />

Add User

setFirstName(e.target.value)} className="w-full p-2 border rounded-lg" placeholder="First Name" /> setLastName(e.target.value)} className="w-full p-2 border rounded-lg" placeholder="Last Name" /> setEmail(e.target.value)} className="w-full p-2 border rounded-lg" placeholder="Email" />
)} {/* Edit Modal */} {isEditModalOpen && ( <>
setIsEditModalOpen(false)} />

Edit User

setFirstName(e.target.value)} className="w-full p-2 border rounded-lg" placeholder="First Name" /> setLastName(e.target.value)} className="w-full p-2 border rounded-lg" placeholder="Last Name" /> setEmail(e.target.value)} className="w-full p-2 border rounded-lg" placeholder="Email" />
)} {/* Filter */}
{ const v = e.target.value; setFilter(v); await fetchUsers(v); }} placeholder="Filter by name or email" className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500" />
{error && (
{error}
)}
); }; export default Users;