import React, { useState, useEffect } from 'react'; import { X, UserPlus, Shield, Key, Trash2, CheckCircle2, AlertCircle, Users, Lock, Edit2, Sliders, } from 'lucide-react'; import { User, UserPermissions } from '../types'; import { api } from '../services/api'; import { SCHOOL_SUBJECTS } from '../data/subjects'; interface AdminUsersModalProps { isOpen: boolean; onClose: () => void; currentUser: User; } export const AdminUsersModal: React.FC = ({ isOpen, onClose, currentUser }) => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); // Form State for New Account Creation const [newUsername, setNewUsername] = useState(''); const [newPassword, setNewPassword] = useState(''); const [newRole, setNewRole] = useState<'admin' | 'user'>('user'); const [canEditDeleteOthers, setCanEditDeleteOthers] = useState(false); const [canManageUsersRestricted, setCanManageUsersRestricted] = useState(false); const [selectedGroups, setSelectedGroups] = useState(['ALL']); // State for Editing Password / Special Perms const [editingUser, setEditingUser] = useState(null); const [editPassword, setEditPassword] = useState(''); const isFullAdmin = currentUser.role === 'admin'; const loadUsers = async () => { setLoading(true); try { const u = await api.getUsers(); setUsers(u); } catch (err: any) { setError(err.message || 'Failed to load user accounts'); } finally { setLoading(false); } }; useEffect(() => { if (isOpen) { loadUsers(); } }, [isOpen]); if (!isOpen) return null; const handleCreateUser = async (e: React.FormEvent) => { e.preventDefault(); if (!newUsername.trim() || !newPassword.trim()) { setError('Username and initial password are required'); return; } setError(null); setSuccess(null); const permissions: UserPermissions = { canEditDeleteOthers, canManageUsersRestricted, allowedGroups: selectedGroups.length > 0 ? selectedGroups : ['ALL'], }; try { const res = await api.createUser({ username: newUsername.trim(), password: newPassword.trim(), role: isFullAdmin ? newRole : 'user', permissions, }); setSuccess(res.message); setNewUsername(''); setNewPassword(''); setCanEditDeleteOthers(false); setCanManageUsersRestricted(false); await loadUsers(); } catch (err: any) { setError(err.message || 'Failed to create user account'); } }; const handleSaveUserUpdate = async (e: React.FormEvent) => { e.preventDefault(); if (!editingUser) return; setError(null); setSuccess(null); try { const message = await api.updateUser(editingUser.username, { password: editPassword.trim() || undefined, permissions: editingUser.permissions, role: editingUser.role, }); setSuccess(message); setEditingUser(null); setEditPassword(''); await loadUsers(); } catch (err: any) { setError(err.message || 'Failed to update user account'); } }; const handleDeleteUser = async (username: string) => { if (!window.confirm(`Are you sure you want to permanently delete account "${username}"?`)) return; setError(null); setSuccess(null); try { const message = await api.deleteUser(username); setSuccess(message); await loadUsers(); } catch (err: any) { setError(err.message || 'Failed to delete user account'); } }; const toggleGroupPermission = (grp: string) => { if (grp === 'ALL') { setSelectedGroups(['ALL']); return; } let current = selectedGroups.filter((g) => g !== 'ALL'); if (current.includes(grp)) { current = current.filter((g) => g !== grp); } else { current.push(grp); } if (current.length === 0) current = ['ALL']; setSelectedGroups(current); }; return (
{/* Header */}

User Account Management & Special Permissions

Admins create student accounts & configure special permissions saved in /Archives/users.json

{error && (
{error}
)} {success && (
{success}
)} {/* Modal Body Grid */}
{/* Left Column: Create New Account Form */}

Create Account (Admin Rights)

setNewUsername(e.target.value)} placeholder="e.g. Rahul_S, Priya_Maths" className="w-full px-3 py-2 text-xs rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-100 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
setNewPassword(e.target.value)} placeholder="Set account password" className="w-full px-3 py-2 text-xs rounded-xl border border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-900 text-slate-900 dark:text-slate-100 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
{isFullAdmin && (
)} {/* Special Permissions Config */}
Special Permission Rights {canEditDeleteOthers && (
{['ALL', ...SCHOOL_SUBJECTS.map((s) => s.id)].map((subId) => ( ))}
)}
{/* Right Column: Registered Accounts List */}

Registered Accounts ({users.length})

{users.map((u) => { const isCurrentAdminAccount = u.username.toLowerCase() === 'harsha' || u.username.toLowerCase() === 'anirudh'; return (
{u.username} {u.role === 'admin' ? ( Admin ) : ( User )}
{/* Display Passwords to Full Admin */} {isFullAdmin && u.password && (

Pass: {u.password}

)} {/* Display Special Permissions */}
{u.permissions?.canEditDeleteOthers && ( Edit/Delete Files ({u.permissions.allowedGroups?.join(', ') || 'ALL'}) )} {u.permissions?.canManageUsersRestricted && ( Restricted Mgmt )}
{/* Actions */}
{!isCurrentAdminAccount && isFullAdmin && ( )}
); })}
{/* Edit Password Sub-modal */} {editingUser && (

Update Account for {editingUser.username}

setEditPassword(e.target.value)} placeholder="Enter new password" className="w-full px-3 py-2 text-xs rounded-xl border border-slate-200 dark:border-slate-700 bg-slate-50 dark:bg-slate-800 text-slate-900 dark:text-slate-100 focus:outline-none focus:ring-2 focus:ring-indigo-500" />
)}
); };