import { KeyRound, Pencil } from "lucide-react"; import { useState } from "react"; import { ApiError } from "../../api/client"; import { Spinner } from "../../components/Spinner"; import { useToast } from "../../context/ToastContext"; import { useAdminSetPassword, useAdminUpdateUser, useAdminUsers } from "../../hooks/admin"; // DEV-ТОЛЬКО: удаление аккаунтов. Импорт используется лишь под import.meta.env.DEV, // поэтому в прод-сборке вырезается тришейкингом (как и dev-вход). import { DevDeleteAccountButton } from "./DevDeleteAccountButton"; export function AdminAccountsPage() { const { data: users, isLoading } = useAdminUsers(); const update = useAdminUpdateUser(); const setPassword = useAdminSetPassword(); const toast = useToast(); const [editId, setEditId] = useState(null); const [editName, setEditName] = useState(""); // Новый пароль игроку (восстановление забытого): отдельный режим строки, как переименование. const [passwordId, setPasswordId] = useState(null); const [newPassword, setNewPassword] = useState(""); if (isLoading) return ; const startEdit = (id: number, nickname: string) => { setPasswordId(null); setEditId(id); setEditName(nickname); }; const startPassword = (id: number) => { setEditId(null); setPasswordId(id); setNewPassword(""); }; const savePassword = async () => { if (passwordId == null || !newPassword) return; try { await setPassword.mutateAsync({ userId: passwordId, password: newPassword }); toast.show("Пароль задан — сообщите его игроку"); setPasswordId(null); setNewPassword(""); } catch (e) { toast.error(e instanceof ApiError ? e.message : "Не удалось задать пароль"); } }; const saveName = async () => { const name = editName.trim(); if (editId == null || !name) return; try { await update.mutateAsync({ userId: editId, nickname: name }); setEditId(null); } catch (e) { toast.error(e instanceof ApiError ? e.message : "Не удалось переименовать"); } }; const toggleActive = async (id: number, isActive: boolean) => { try { await update.mutateAsync({ userId: id, is_active: !isActive }); } catch (e) { toast.error(e instanceof ApiError ? e.message : "Не удалось сохранить"); } }; return (
{/* Название раздела уже в активной вкладке админки. */}
{(users ?? []).map((u) => (
{editId === u.id ? ( // Режим переименования.
setEditName(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") saveName(); if (e.key === "Escape") setEditId(null); }} />
) : passwordId === u.id ? ( // Режим «задать пароль».
setNewPassword(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") savePassword(); if (e.key === "Escape") setPasswordId(null); }} />
) : (
{u.nickname} {u.role === "admin" && админ}
#{u.id} · {u.auth_provider} · {u.is_active ? "активен" : "отключён"} {u.role !== "admin" && !u.has_password && " · без пароля"}
{u.role !== "admin" && (
{import.meta.env.DEV && ( )}
)}
)}
))}
); }