"use client" import { useState, useEffect } from "react" import Link from "next/link" interface Stats { total_users: number total_applications: number applied: number interviews: number conversion_rate: number api_usage: { source: string; searches: number; total_jobs: number }[] daily_applications: { date: string; count: number }[] top_companies: { company: string; count: number }[] } interface User { id: string email: string name: string created_at: string applications: number interviews: number } interface Application { id: string email: string name: string job_title: string company: string location: string status: string applied_at: string } export default function AdminPage() { const [stats, setStats] = useState(null) const [users, setUsers] = useState([]) const [applications, setApplications] = useState([]) const [tab, setTab] = useState<"overview" | "users" | "applications">("overview") const [loading, setLoading] = useState(true) useEffect(() => { loadData() }, []) const loadData = async () => { setLoading(true) try { const [statsRes, usersRes, appsRes] = await Promise.all([ fetch("/api/admin/stats"), fetch("/api/admin/users"), fetch("/api/admin/applications") ]) const statsData = await statsRes.json() const usersData = await usersRes.json() const appsData = await appsRes.json() setStats(statsData) setUsers(usersData) setApplications(appsData) } catch (err) { console.error("Failed to load admin data:", err) } setLoading(false) } const statusColor: Record = { pending: "bg-yellow-500/20 text-yellow-400", applied: "bg-blue-500/20 text-blue-400", interview: "bg-green-500/20 text-green-400", rejected: "bg-red-500/20 text-red-400", offer: "bg-purple-500/20 text-purple-400" } if (loading) { return (
Loading admin data...
) } return (
{/* Header */}
AutoJobs / Admin
← Back to Dashboard

Admin Dashboard

{/* Tabs */}
{["overview", "users", "applications"].map(t => ( ))}
{/* Overview Tab */} {tab === "overview" && stats && (
{/* KPI Cards */}
{[ { label: "Total Users", value: stats.total_users, icon: "👥" }, { label: "Applications", value: stats.total_applications, icon: "📋" }, { label: "Interviews", value: stats.interviews, icon: "🎯" }, { label: "Conversion Rate", value: `${stats.conversion_rate}%`, icon: "📈" }, ].map(kpi => (
{kpi.icon}
{kpi.value}
{kpi.label}
))}
{/* Charts placeholder + tables */}
{/* Top Companies */}

Top Companies Applied To

{stats.top_companies.length > 0 ? (
{stats.top_companies.map((c, i) => (
{c.company} {c.count}
))}
) : (

No data yet

)}
{/* API Usage */}

API Usage

{stats.api_usage.length > 0 ? (
{stats.api_usage.map((u, i) => (
{u.source}
{u.searches} {u.total_jobs} jobs found
))}
) : (

No searches yet

)}
{/* Daily Applications */}

Daily Applications (Last 30 Days)

{stats.daily_applications.length > 0 ? (
{stats.daily_applications.slice(-14).map((d, i) => { const max = Math.max(...stats.daily_applications.map(x => x.count)) const height = max > 0 ? (d.count / max) * 100 : 0 return (
{d.date?.slice(5)}
) })}
) : (

No data yet

)}
)} {/* Users Tab */} {tab === "users" && (
{users.map((u) => ( ))} {users.length === 0 && ( )}
User Email Joined Applications Interviews
{u.name || "—"} {u.email} {new Date(u.created_at).toLocaleDateString()} {u.applications} {u.interviews}
No users yet
)} {/* Applications Tab */} {tab === "applications" && (
{applications.map((a) => ( ))} {applications.length === 0 && ( )}
User Job Company Location Applied Status
{a.name || a.email} {a.job_title} {a.company} {a.location} {new Date(a.applied_at).toLocaleDateString()} {a.status}
No applications yet
)}
) }