import { useState, useCallback, useMemo } from "preact/hooks"; import { useT } from "../../../shared/i18n/context"; import { useAccounts } from "../../../shared/hooks/use-accounts"; import { AccountTable } from "../components/AccountTable"; import { AccountBulkActions } from "../components/AccountBulkActions"; import { AccountImportExport } from "../components/AccountImportExport"; import type { AssignmentAccount } from "../../../shared/hooks/use-proxy-assignments"; import type { TranslationKey } from "../../../shared/i18n/translations"; const statusOrder: Array<{ key: string; label: TranslationKey }> = [ { key: "active", label: "active" }, { key: "expired", label: "expired" }, { key: "rate_limited", label: "rateLimited" }, { key: "refreshing", label: "refreshing" }, { key: "disabled", label: "disabled" }, { key: "banned", label: "banned" }, ]; export function AccountManagement() { const t = useT(); const { list, loading: listLoading, batchDelete, batchSetStatus, exportAccounts, importAccounts } = useAccounts(); const [selectedIds, setSelectedIds] = useState>(new Set()); const [statusFilter, setStatusFilter] = useState("all"); const [message, setMessage] = useState<{ text: string; error?: boolean } | null>(null); const [busy, setBusy] = useState(false); const tableAccounts: AssignmentAccount[] = useMemo( () => list.map((a) => ({ id: a.id, email: a.email || a.id.slice(0, 8), status: a.status, proxyId: a.proxyId || "global", proxyName: "", })), [list], ); const statusCounts = useMemo(() => { const counts: Record = {}; for (const a of list) { counts[a.status] = (counts[a.status] || 0) + 1; } return counts; }, [list]); const showMessage = useCallback((text: string, error = false) => { setMessage({ text, error }); setTimeout(() => setMessage(null), 3000); }, []); const handleBatchDelete = useCallback(async () => { setBusy(true); try { const err = await batchDelete([...selectedIds]); if (err) { showMessage(err, true); } else { setSelectedIds(new Set()); showMessage(t("deleteSuccess")); } } finally { setBusy(false); } }, [selectedIds, batchDelete, t, showMessage]); const handleSetActive = useCallback(async () => { setBusy(true); try { const err = await batchSetStatus([...selectedIds], "active"); if (err) { showMessage(err, true); } else { setSelectedIds(new Set()); showMessage(t("statusChangeSuccess")); } } finally { setBusy(false); } }, [selectedIds, batchSetStatus, t, showMessage]); const handleSetDisabled = useCallback(async () => { setBusy(true); try { const err = await batchSetStatus([...selectedIds], "disabled"); if (err) { showMessage(err, true); } else { setSelectedIds(new Set()); showMessage(t("statusChangeSuccess")); } } finally { setBusy(false); } }, [selectedIds, batchSetStatus, t, showMessage]); const handleStatusChipClick = useCallback((status: string) => { setStatusFilter((prev) => (prev === status ? "all" : status)); }, []); return (
{/* Header */}
← {t("backToDashboard")}

{t("accountManagement")}

{/* Main content */}
{/* Status summary chips */}
{statusOrder.map(({ key, label }) => { const count = statusCounts[key] || 0; if (count === 0) return null; const isActive = statusFilter === key; return ( ); })} {list.length} {t("totalItems")}
{/* Message toast */} {message && (
{message.text}
)} {/* Table */} {listLoading ? (
Loading...
) : ( )}
{/* Bulk actions bar */}
); }