import { useEffect, useState } from "react"; import { useAuth } from "../context/AuthContext"; import { fetchUsageStats, type UsageStats } from "../api/admin-usage"; import { useDocumentTitle } from "../hooks/useDocumentTitle"; import styles from "./AdminUsage.module.css"; function formatNumber(n: number): string { if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`; if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`; return n.toLocaleString(); } function shortDay(dateStr: string): string { const d = new Date(dateStr + "T00:00:00"); return d.toLocaleDateString(undefined, { weekday: "short" }); } export default function AdminUsage() { useDocumentTitle("Usage — Admin"); const { token } = useAuth(); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { if (!token) return; setLoading(true); fetchUsageStats(token) .then(setStats) .catch((e) => setError(e.message || "Failed to load usage stats")) .finally(() => setLoading(false)); }, [token]); if (loading) { return (

Usage

Loading usage stats…

); } if (error || !stats) { return (

Usage

{error || "No data available"}

); } const maxDaily = Math.max(...stats.daily_counts.map((d) => d.request_count), 1); return (

Usage

{/* Summary cards */}
{([ { label: "Today", data: stats.today }, { label: "This Week", data: stats.week }, { label: "This Month", data: stats.month }, ] as const).map(({ label, data }) => (
{label} {formatNumber(data.total_tokens)} tokens {data.request_count} request{data.request_count !== 1 ? "s" : ""} {" · "} {formatNumber(data.prompt_tokens)} prompt / {formatNumber(data.completion_tokens)} completion
))}
{/* Daily bar chart */} {stats.daily_counts.length > 0 && (

Last 7 Days

{stats.daily_counts.map((d) => (
{d.request_count}
{shortDay(d.date)}
))}
)} {/* Top creators */}

Top Creators (This Month)

{stats.top_creators.length === 0 ? (

No creator usage data yet.

) : ( {stats.top_creators.map((c) => ( ))}
Creator Requests Tokens
{c.creator_slug} {c.request_count.toLocaleString()} {formatNumber(c.total_tokens)}
)}
{/* Top users */}

Top Users (This Month)

{stats.top_users.length === 0 ? (

No user usage data yet.

) : ( {stats.top_users.map((u, i) => ( ))}
User / IP Requests Tokens
{u.identifier} {u.request_count.toLocaleString()} {formatNumber(u.total_tokens)}
)}
); }