import React, { useState, useEffect } from 'react'; import { Card } from '../ui/card'; import { Button } from '../ui/button'; import { SearchInput } from '../ui/input'; import { UserTableRow } from './UserTableRow'; import { BanUserModal } from './modals/BanUserModal'; import { User } from '../../types'; import { Filter, Download, UserPlus, Loader2 } from 'lucide-react'; import { useToast } from '../../context/ToastContext'; 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 instanceof Error ? e.message : String(e), stack: e instanceof Error ? e.stack : undefined, }); addToast('Failed to load users', 'error'); } finally { setLoading(false); } }; loadUsers(); }, []); const handleBan = (reason: string, _details: string, duration: string) => { if (!selectedUser) return; addToast( `Banned ${selectedUser.username} for ${duration}. Reason: ${reason}`, 'success', ); setUsers(users.filter((u) => u.id !== selectedUser.id)); // Mock remove setSelectedUser(null); }; const handleDelete = (user: User) => { if ( confirm( `Are you sure you want to delete ${user.username}? This cannot be undone.`, ) ) { setUsers(users.filter((u) => u.id !== user.id)); addToast(`Deleted user ${user.username}`, 'info'); } }; const filteredUsers = users.filter( (u) => u.username.toLowerCase().includes(search.toLowerCase()) || u.email.toLowerCase().includes(search.toLowerCase()), ); return (

USER MANAGEMENT

Manage accounts, roles, and permissions.

setSearch(e.target.value)} />
{loading ? (
) : (
{filteredUsers.map((user) => ( setSelectedUser(user)} onDelete={() => handleDelete(user)} onEditRole={() => addToast(`Editing role for ${user.username}`) } /> ))} {filteredUsers.length === 0 && ( )}
User Email Roles Plan Joined Last Login Actions
No users found.
)}
Showing {filteredUsers.length} of {users.length} users
{selectedUser && ( setSelectedUser(null)} onConfirm={handleBan} /> )}
); };