import { useEffect, useState } from 'react' import { apiRequest, listUsers, createUser, deleteUser, toggleUserActive } from '../api/client' import { Plus, Trash2, UserCheck, UserX } from 'lucide-react' interface UserRecord { id: number username: string email: string is_active: boolean is_superuser: boolean } export function UsersPage() { const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [showCreate, setShowCreate] = useState(false) const [creating, setCreating] = useState(false) const [createError, setCreateError] = useState('') const [currentUserId, setCurrentUserId] = useState(null) const loadUsers = () => { setLoading(true) listUsers() .then((data) => { setUsers(data) apiRequest<{ id: number }>('/auth/me').then((me) => setCurrentUserId(me.id)) }) .catch((err) => setError(err.message)) .finally(() => setLoading(false)) } useEffect(() => { loadUsers() }, []) const handleCreate = (e: React.FormEvent) => { e.preventDefault() const form = e.currentTarget const username = (form.elements.namedItem('username') as HTMLInputElement).value.trim() const password = (form.elements.namedItem('password') as HTMLInputElement).value const email = (form.elements.namedItem('email') as HTMLInputElement).value.trim() if (!username || username.length < 2) { setCreateError('Username must be at least 2 characters') return } if (!password || password.length < 6) { setCreateError('Password must be at least 6 characters') return } setCreating(true) setCreateError('') createUser({ username, password, email }) .then(() => { setShowCreate(false) form.reset() loadUsers() }) .catch((err) => setCreateError(err.message)) .finally(() => setCreating(false)) } const handleDelete = (id: number, username: string) => { if (!confirm(`Delete user "${username}"?`)) return deleteUser(id) .then(loadUsers) .catch((err) => setError(err.message)) } const handleToggleActive = (id: number) => { toggleUserActive(id) .then(loadUsers) .catch((err) => setError(err.message)) } if (loading && users.length === 0) return
Loading...
if (error) return
{error}
return (

Users

{users.map((u) => ( ))}
Username Email Status Role Actions
{u.username} {u.email || '-'} {u.is_active ? 'Active' : 'Inactive'} {u.is_superuser ? 'Admin' : 'User'} {u.id !== currentUserId && ( <> )}
{showCreate && (

Add User

{createError && (
{createError}
)}
)}
) }