import { ChevronRight, Loader2, RefreshCw, Search } from "lucide-react"; import { useEffect, useState } from "react"; import { api, errorMessage } from "../api"; import { Avatar } from "../components/Avatar"; import { Alert, Badge, EmptyRow, Metric, PageFrame, QueryPanel } from "../components/ui"; import { useI18n } from "../i18n"; import { displayName, displayPhone, displayUsername, formatDate, formatUnix } from "../lib/format"; import { accountMetrics } from "../lib/metrics"; import type { Navigate } from "../routing"; import type { AccountListResponse } from "../types"; export function AccountsPage({ navigate }: { navigate: Navigate }) { const { t } = useI18n(); const [q, setQ] = useState(""); const [limit, setLimit] = useState("50"); const [data, setData] = useState(null); const [cursor, setCursor] = useState({ beforeID: 0, beforeActiveUS: 0 }); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); async function load(next = false) { setBusy(true); setError(""); const params = new URLSearchParams({ limit }); if (q.trim()) { params.set("q", q.trim()); } else if (next) { params.set("before_id", String(cursor.beforeID)); params.set("before_active_us", String(cursor.beforeActiveUS)); } try { const result = await api.accounts(params); setData(result); setCursor({ beforeID: result.next_before_id, beforeActiveUS: result.next_before_active_us }); } catch (err) { setError(errorMessage(err)); } finally { setBusy(false); } } useEffect(() => { void load(false); }, []); const metrics = accountMetrics(data?.rows ?? []); return ( load(false)} disabled={busy}> {t("common.refresh")} } > {error && {error}}
0 ? "danger" : "neutral"} />
{ event.preventDefault(); void load(false); }}> {data?.listing && data.has_more && ( )}
{data?.rows.map((row) => ( ))} {(!data || data.rows.length === 0) && }
{t("account.userID")} {t("account.phone")} {t("common.username")} {t("common.name")} {t("account.loginEmail")} {t("common.device")} {t("account.lastActive")} {t("account.premium")} {t("common.verified")} {t("account.frozen")} {t("common.updatedAt")}
{row.ID} {displayPhone(row.Phone)} {displayUsername(row.Username)} {displayName(row)} {row.LoginEmail || {t("common.none")}} {row.DeviceCount} {formatDate(row.LastActiveAt)} {row.PremiumUntil > 0 ? {t("account.premium")} {formatUnix(row.PremiumUntil)} : {t("common.none")}} {row.Verified ? {t("common.verified")} : {t("account.notVerified")}} {row.Frozen ? {t("account.frozen")} : {t("common.normal")}} {formatDate(row.UpdatedAt)}
); }