import React, { useState, useEffect } from 'react'; import { User, UserRole } from '../../types'; import { AccountStatus } from '../../services/auth/auth.constants'; import { databaseService } from '../../services/database'; import { useUser } from '../../contexts/UserContext'; interface AdminInterfaceProps { onClose: () => void; } const AdminInterface: React.FC = ({ onClose }) => { const { user: currentUser } = useUser(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [selectedUser, setSelectedUser] = useState(null); const [newPassword, setNewPassword] = useState(''); useEffect(() => { loadUsers(); }, []); const loadUsers = async () => { try { const users = await databaseService.getAllUsers(); setUsers(users); } catch (error) { setError('Failed to load users'); console.error('Error loading users:', error); } finally { setLoading(false); } }; const handleSuspendUser = async (userId: string) => { try { await databaseService.suspendUser(userId); await loadUsers(); } catch (error) { setError('Failed to suspend user'); console.error('Error suspending user:', error); } }; const handleActivateUser = async (userId: string) => { try { await databaseService.activateUser(userId); await loadUsers(); } catch (error) { setError('Failed to activate user'); console.error('Error activating user:', error); } }; const handleDeleteUser = async (userId: string) => { if ( !confirm( 'Are you sure you want to delete this user? This action cannot be undone.' ) ) { return; } try { await databaseService.deleteUser(userId); await loadUsers(); } catch (error) { setError('Failed to delete user'); console.error('Error deleting user:', error); } }; const handleChangePassword = async (userId: string) => { if (!newPassword || newPassword.length < 6) { setError('Password must be at least 6 characters long'); return; } try { await databaseService.changeUserPassword(userId, newPassword); setNewPassword(''); setSelectedUser(null); setError(''); alert('Password changed successfully'); } catch (error) { setError('Failed to change password'); console.error('Error changing password:', error); } }; const getStatusColor = (status?: AccountStatus) => { switch (status) { case AccountStatus.ACTIVE: return 'text-green-600 bg-green-100'; case AccountStatus.SUSPENDED: return 'text-red-600 bg-red-100'; case AccountStatus.PENDING: return 'text-yellow-600 bg-yellow-100'; default: return 'text-gray-600 bg-gray-100'; } }; const getRoleColor = (role?: UserRole) => { return role === UserRole.ADMIN ? 'text-purple-600 bg-purple-100' : 'text-blue-600 bg-blue-100'; }; if (currentUser?.role !== UserRole.ADMIN) { return (

Access Denied

You don't have permission to access the admin interface.

); } return (

Admin Interface

{error && (
{error}
)} {loading ? (

Loading users...

) : (

User Management ({users.length} users)

{users.map(user => ( ))}
User Email Status Role Created Actions
{user.avatar ? ( {user.username} ) : (
{user.username.charAt(0).toUpperCase()}
)}
{user.username}
ID: {user._id.slice(-8)}
{user.email} {user.emailVerified && ( )} {user.status || 'Unknown'} {user.role || 'USER'} {user.createdAt ? new Date(user.createdAt).toLocaleDateString() : 'Unknown'}
{user.status === AccountStatus.ACTIVE ? ( ) : ( )} {user.password && ( )}
)}
{/* Password Change Modal */} {selectedUser && (

Change Password for {selectedUser.username}

setNewPassword(e.target.value)} className='w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 dark:bg-slate-700 dark:border-slate-600 dark:text-white' placeholder='Enter new password (min 6 characters)' />
)}
); }; export default AdminInterface;