import React, { useState, useEffect, useCallback } from "react"; import { agentApiService } from "@/modules/agent"; import type { TokenUser, TokenCreate, TokenUpdatePermissions, TokenPasswordReset } from "@/modules/agent"; import { FiUsers, FiUserPlus, FiEdit2, FiTrash2, FiUnlock, FiLock, FiKey, FiX, FiCheck, FiSearch } from "react-icons/fi"; export const AdminPage: React.FC = () => { const [users, setUsers] = useState([]); const [inactiveUsers, setInactiveUsers] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); const [activeTab, setActiveTab] = useState<"active" | "inactive">("active"); const [searchQuery, setSearchQuery] = useState(""); // Modal states const [showCreateModal, setShowCreateModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [showPasswordModal, setShowPasswordModal] = useState(false); const [selectedUser, setSelectedUser] = useState(null); // Form states const [createData, setCreateData] = useState({ login: "", name: "", last_name: "", password: "", permission_admin: false, permission_manage_agent: false, permission_view: false, is_active: false, }); const [editData, setEditData] = useState({ is_active: false, permission_admin: false, permission_manage_agent: false, permission_view: false, }); const [passwordData, setPasswordData] = useState({ new_password: "", }); const fetchUsers = useCallback(async () => { setIsLoading(true); setError(null); try { const [active, inactive] = await Promise.all([ agentApiService.getUsers(), agentApiService.getInactiveUsers(), ]); setUsers(active); setInactiveUsers(inactive); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при загрузке пользователей"); } finally { setIsLoading(false); } }, []); useEffect(() => { fetchUsers(); }, [fetchUsers]); const handleCreateUser = async (e: React.FormEvent) => { e.preventDefault(); setError(null); try { await agentApiService.createUser(createData); setSuccessMessage("Пользователь успешно создан"); setShowCreateModal(false); setCreateData({ login: "", name: "", last_name: "", password: "", permission_admin: false, permission_manage_agent: false, permission_view: false, is_active: false, }); await fetchUsers(); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при создании пользователя"); } }; const handleUpdatePermissions = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedUser) return; setError(null); try { await agentApiService.updateUserPermissions(selectedUser.login, editData); setSuccessMessage("Права пользователя обновлены"); setShowEditModal(false); await fetchUsers(); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при обновлении прав"); } }; const handleResetPassword = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedUser) return; setError(null); try { await agentApiService.resetUserPassword(selectedUser.login, passwordData); setSuccessMessage("Пароль изменен"); setShowPasswordModal(false); setPasswordData({ new_password: "" }); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при сбросе пароля"); } }; const handleActivateUser = async (login: string) => { setError(null); try { await agentApiService.activateUser(login); setSuccessMessage("Пользователь активирован"); await fetchUsers(); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при активации пользователя"); } }; const handleDeactivateUser = async (login: string) => { setError(null); try { await agentApiService.deactivateUser(login); setSuccessMessage("Пользователь деактивирован"); await fetchUsers(); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при деактивации пользователя"); } }; const handleDeleteUser = async (login: string) => { if (!confirm(`Вы уверены, что хотите удалить пользователя ${login}?`)) return; setError(null); try { await agentApiService.deleteUser(login); setSuccessMessage("Пользователь удален"); await fetchUsers(); } catch (err) { setError(err instanceof Error ? err.message : "Ошибка при удалении пользователя"); } }; const openEditModal = (user: TokenUser) => { setSelectedUser(user); setEditData({ is_active: user.is_active, permission_admin: user.permission_admin, permission_manage_agent: user.permission_manage_agent, permission_view: user.permission_view, }); setShowEditModal(true); }; const openPasswordModal = (user: TokenUser) => { setSelectedUser(user); setPasswordData({ new_password: "" }); setShowPasswordModal(true); }; const filteredUsers = (activeTab === "active" ? users : inactiveUsers).filter( (user) => user.login.toLowerCase().includes(searchQuery.toLowerCase()) || user.name.toLowerCase().includes(searchQuery.toLowerCase()) || user.last_name.toLowerCase().includes(searchQuery.toLowerCase()) ); const inputStyle: React.CSSProperties = { width: "100%", padding: "10px 12px", border: "1px solid var(--border)", borderRadius: "8px", backgroundColor: "var(--input-bg)", color: "var(--text-primary)", fontSize: "14px", }; const labelStyle: React.CSSProperties = { display: "block", marginBottom: "8px", color: "var(--text-secondary)", fontSize: "14px", fontWeight: 500, }; const buttonBaseStyle: React.CSSProperties = { padding: "8px 16px", borderRadius: "8px", border: "none", fontSize: "14px", fontWeight: 500, cursor: "pointer", display: "inline-flex", alignItems: "center", gap: "6px", }; return (
{/* Header */}

Управление пользователями

Администрирование учетных записей

{/* Messages */} {successMessage && (
{successMessage}
)} {error && (
{error}
)} {/* Tabs and Actions */}
{/* Tabs */}
{/* Create Button */}
{/* Search */}
setSearchQuery(e.target.value)} placeholder="Поиск по логину, имени или фамилии..." className="w-full pl-10 pr-4 py-2.5 rounded-lg border" style={{ backgroundColor: "var(--input-bg)", borderColor: "var(--border)", color: "var(--text-primary)", }} />
{/* Users Table */} {isLoading ? (
Загрузка...
) : filteredUsers.length === 0 ? (
Пользователи не найдены
) : (
{filteredUsers.map((user, index) => ( ))}
Логин Имя Фамилия Админ Управление Просмотр Действия
{user.login} {user.name} {user.last_name} {user.permission_admin ? ( ) : ( )} {user.permission_manage_agent ? ( ) : ( )} {user.permission_view ? ( ) : ( )}
{activeTab === "active" ? ( ) : ( )}
)}
{/* Create User Modal */} {showCreateModal && (

Создать пользователя

setCreateData({ ...createData, login: e.target.value })} required style={inputStyle} />
setCreateData({ ...createData, name: e.target.value })} required style={inputStyle} />
setCreateData({ ...createData, last_name: e.target.value })} required style={inputStyle} />
setCreateData({ ...createData, password: e.target.value })} required style={inputStyle} />
)} {/* Edit Permissions Modal */} {showEditModal && selectedUser && (

Редактировать: {selectedUser.login}

)} {/* Reset Password Modal */} {showPasswordModal && selectedUser && (

Сброс пароля: {selectedUser.login}

setPasswordData({ new_password: e.target.value })} required style={inputStyle} />
)}
); };