"use client"; import { useState, useEffect } from "react"; import Link from "next/link"; import { LayoutDashboard, Users, ScanText, Key, Shield, ScrollText, Activity, Search, Ban, CircleCheck, ChevronDown, ChevronUp, Trash2, Crown, ArrowLeft, RefreshCw, TriangleAlert, UserCheck, Eye, EyeOff } from "lucide-react"; type Tab = "overview" | "users" | "scans" | "teams" | "api-keys" | "logs"; export default function AdminPage() { const [tab, setTab] = useState("overview"); const [stats, setStats] = useState(null); const [users, setUsers] = useState([]); const [scans, setScans] = useState([]); const [teams, setTeams] = useState([]); const [apiKeys, setApiKeys] = useState([]); const [logs, setLogs] = useState([]); const [search, setSearch] = useState(""); const [loading, setLoading] = useState(false); const [userTotal, setUserTotal] = useState(0); const [scanTotal, setScanTotal] = useState(0); async function fetchData(action: string, params?: Record) { const qs = new URLSearchParams({ action, ...params }); const res = await fetch(`/api/admin?${qs}`); if (!res.ok) { window.location.href = "/dashboard-pages/dashboard"; return null; } return res.json(); } async function adminAction(body: any) { setLoading(true); await fetch("/api/admin", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) }); setLoading(false); loadTab(tab); } async function loadTab(t: Tab) { setLoading(true); switch (t) { case "overview": { const d = await fetchData("stats"); if (d) setStats(d); break; } case "users": { const d = await fetchData("users", search ? { search } : {}); if (d) { setUsers(d.users); setUserTotal(d.total); } break; } case "scans": { const d = await fetchData("scans"); if (d) { setScans(d.scans); setScanTotal(d.total); } break; } case "teams": { const d = await fetchData("teams"); if (d) setTeams(d.teams); break; } case "api-keys": { const d = await fetchData("api-keys"); if (d) setApiKeys(d.keys); break; } case "logs": { const d = await fetchData("logs"); if (d) setLogs(d.logs); break; } } setLoading(false); } useEffect(() => { loadTab(tab); }, [tab]); const TABS: { key: Tab; label: string; icon: any }[] = [ { key: "overview", label: "Overview", icon: LayoutDashboard }, { key: "users", label: "Users", icon: Users }, { key: "scans", label: "Scans", icon: ScanText }, { key: "teams", label: "Teams", icon: Shield }, { key: "api-keys", label: "API Keys", icon: Key }, { key: "logs", label: "Activity", icon: Activity }, ]; const planBadge = (plan: string) => { const c: Record = { free: "bg-zinc-100 text-zinc-600", pro: "bg-blue-50 text-blue-700", team: "bg-purple-50 text-purple-700" }; return {plan}; }; return (
{/* Header */}
Dashboard

Admin Panel

{/* Tabs */}
{TABS.map((t) => ( ))}
{/* Overview */} {tab === "overview" && stats && (
{[ { label: "Total Users", value: stats.total_users, sub: `${stats.banned_users} banned` }, { label: "Pro Users", value: stats.pro_users }, { label: "Team Users", value: stats.team_users }, { label: "Free Users", value: stats.free_users }, { label: "Total Scans", value: stats.total_scans }, { label: "Scans Today", value: stats.scans_today }, { label: "Teams", value: stats.total_teams }, { label: "Active API Keys", value: stats.total_api_keys }, ].map((s, i) => (

{s.label}

{s.value}

{s.sub &&

{s.sub}

}
))}
)} {/* Users */} {tab === "users" && (
setSearch(e.target.value)} onKeyDown={(e) => e.key === "Enter" && loadTab("users")} placeholder="Search by email or name..." className="w-full pl-10 pr-4 py-2.5 border border-zinc-200 rounded-lg text-sm focus:outline-none focus:border-zinc-400" />

{userTotal} users total

{users.map((u) => ( ))}
User Plan Scans Joined Actions

{u.full_name || u.email} {u.role === "admin" && } {u.is_banned && }

{u.email}

{planBadge(u.plan)} {u.analyses_this_month}/mo {new Date(u.created_at).toLocaleDateString()}
)} {/* Scans */} {tab === "scans" && (

{scanTotal} scans total

{scans.map((s) => ( ))}
Source Grade Risk Clauses Date Actions
{s.source_url || "Manual scan"} {s.grade} {s.risk_score}/100 {s.flagged_count}/{s.total_clauses} {new Date(s.created_at).toLocaleDateString()}
)} {/* Teams */} {tab === "teams" && (
{teams.map((t) => ( ))} {teams.length === 0 && }
Team Owner Seats Created Actions
{t.name} {t.owner_id.slice(0, 8)}... {t.max_seats} {new Date(t.created_at).toLocaleDateString()}
No teams yet.
)} {/* API Keys */} {tab === "api-keys" && (
{apiKeys.map((k) => ( ))} {apiKeys.length === 0 && }
Name Key Usage Status Actions
{k.name} {k.key_prefix} {k.calls_this_month}/{k.calls_limit} {k.is_active ? "Active" : "Revoked"} {k.is_active && ( )}
No API keys.
)} {/* Activity Logs */} {tab === "logs" && (
{logs.map((l) => ( ))} {logs.length === 0 && }
Action Target Details Time
{l.action} {l.target_type}: {l.target_id?.slice(0, 8)}... {l.details ? JSON.stringify(l.details) : "—"} {new Date(l.created_at).toLocaleString()}
No admin actions yet.
)}
); }