"use client"; import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { CheckCircle2, ChevronDown, Loader2, ScrollText, XCircle, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { formatDateTime } from "@/lib/format"; import { useTranslations } from "@/lib/i18n/context"; import { type AdminAuditEntry } from "./_shared"; export function LoginOverviewSection({ id }: { id?: string } = {}) { const { t } = useTranslations(); const [expanded, setExpanded] = useState(false); const [filter, setFilter] = useState<"all" | "failed">("all"); const AUTH_ACTION_LABELS: Record = { "auth.register": t("admin.authRegister"), "auth.login": t("admin.authLogin"), "auth.login.passkey": t("admin.authLoginPasskey"), "auth.login.password": t("admin.authLoginPassword"), "auth.login.failed": t("admin.authLoginFailed"), "auth.logout": t("admin.authLogout"), "auth.passkey.register": t("admin.authPasskeyRegister"), "auth.passkey.delete": t("admin.authPasskeyDelete"), }; const { data, isLoading } = useQuery({ queryKey: ["admin", "audit-log", filter], queryFn: async () => { const res = await fetch(`/api/admin/audit-log?limit=100&filter=auth`); if (!res.ok) throw new Error("Failed"); return (await res.json()).data as { entries: AdminAuditEntry[]; meta: { total: number }; }; }, enabled: expanded, }); const entries = filter === "failed" ? data?.entries?.filter((e) => e.action === "auth.login.failed") : data?.entries; return (

{t("admin.loginOverview")}

{expanded && (
{isLoading ? (
) : !entries?.length ? (

{t("admin.noEntries")}

) : (
{entries.map((entry, i) => { const isFailed = entry.action === "auth.login.failed"; return ( ); })}
{t("admin.status")} {t("admin.users")} {t("admin.action")} {t("admin.ip")} {t("admin.location")} {t("admin.timestamp")}
{isFailed ? ( ) : ( )} {entry.user?.username ?? t("common.unknown")} {AUTH_ACTION_LABELS[entry.action] ?? entry.action} {entry.ipAddress ?? "—"} {entry.location ?? "—"} {formatDateTime(entry.createdAt)}
{data && data.meta.total > entries.length && (

{t("admin.showingEntries", { count: entries.length, total: data.meta.total, })}

)}
)}
)}
); }