import React, { useState, useEffect } from 'react'; import { Card } from '../ui/card'; import { Button } from '../ui/button'; import { Input } from '../ui/input'; import { UserTableRow } from './UserTableRow'; import { BanUserModal } from './modals/BanUserModal'; import { User } from '../../types'; import { Search, Shield, Activity, Users, Download, UserPlus, Loader2 } from 'lucide-react'; import { useToast } from '../../components/feedback/ToastProvider'; import { userService } from '../../services/userService'; import { logger } from '@/utils/logger'; export const AdminUsersView: React.FC = () => { const { addToast } = useToast(); const [search, setSearch] = useState(''); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [selectedUser, setSelectedUser] = useState(null); useEffect(() => { const loadUsers = async () => { setLoading(true); try { const res = await userService.list(); setUsers(res.users); } catch (e) { logger.error('Failed to load users', { error: e }); addToast('Failed to load neural identities', 'error'); } finally { setLoading(false); } }; loadUsers(); }, []); const handleBan = (duration: string) => { if (!selectedUser) return; addToast(`Node ${selectedUser.username} quarantined for ${duration}.`, 'success'); setUsers(users.filter((u) => u.id !== selectedUser.id)); setSelectedUser(null); }; const handleDelete = (user: User) => { if (confirm(`INITIATE PERMANENT DELETION: ${user.username}?`)) { setUsers(users.filter((u) => u.id !== user.id)); addToast(`Identity purged: ${user.username}`, 'info'); } }; const filteredUsers = users.filter( (u) => u.username.toLowerCase().includes(search.toLowerCase()) || u.email.toLowerCase().includes(search.toLowerCase()), ); return (

IDENTITY GRID

USER DIRECTORY • ACCESS PERMISSIONS

} placeholder="Search by ID or frequency..." value={search} onChange={(e: React.ChangeEvent) => setSearch(e.target.value)} className="bg-muted/30 border-border" />
{loading ? (
) : (
{filteredUsers.map((user) => ( setSelectedUser(user)} onDelete={() => handleDelete(user)} onEditRole={() => addToast(`Modifying access roles for ${user.username}`, 'info')} /> ))} {filteredUsers.length === 0 && ( )}
Identity Access Origin Assigned Roles Network Plan Registered Last Sync Management
No entities found.
)}
Displaying {filteredUsers.length} / {users.length} active nodes
{selectedUser && ( setSelectedUser(null)} onConfirm={(reason, details, duration) => handleBan(duration)} /> )}
); };