"use client"; import { useEffect, useState } from "react"; import { Users, Building2, Shield, Activity, RefreshCw, Lock, Calendar, Mail, Phone, } from "lucide-react"; import { AdminLayout } from "@/components/admin/admin-layout"; import { useLanguage } from "@/components/language-provider"; import { apiFetch } from "@/lib/api"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; interface ApiResult { count: number; results: any[]; } interface NavItem { id: string; label: string; icon: React.ComponentType<{ className?: string }>; href: string; } export default function AdminDashboardPage() { const { t, lang } = useLanguage(); const [activeSessions, setActiveSessions] = useState(0); const [stats, setStats] = useState(null); const [sessions, setSessions] = useState([]); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const token = localStorage.getItem("access_token"); if (!token) { window.location.href = "/login?redirect=/admin"; return; } const fetchData = async () => { try { const [usersRes, orgsRes, appsRes, sessionsRes, eventsRes] = await Promise.all([ apiFetch("/users/"), apiFetch("/organizations/"), apiFetch("/applications/"), apiFetch("/sessions/"), apiFetch("/security/events/"), ]); const usersData = await usersRes.json(); const orgsData = await orgsRes.json(); const appsData = await appsRes.json(); const sessionsData = await sessionsRes.json(); const eventsData = await eventsRes.json(); setStats({ count: 4, results: [ { name: "users", count: usersData.count || 0 }, { name: "organizations", count: orgsData.count || 0 }, { name: "applications", count: appsData.count || 0 }, { name: "sessions", count: sessionsData.count || 0 }, ], }); const sessionsList = sessionsData.results || []; setSessions(sessionsList); const active = sessionsList.filter( (s: any) => s.status === "active" ).length; setActiveSessions(active); setEvents(eventsData.results || []); } catch (e) { console.error("Admin fetch error:", e); } finally { setLoading(false); } }; fetchData(); }, []); const navItems: NavItem[] = [ { id: "home", label: t.admin.dashboard, icon: Users, href: "/admin" }, { id: "users", label: t.admin.users, icon: Users, href: "/admin/users" }, { id: "organizations", label: t.admin.orgs as string, icon: Building2, href: "/admin/orgs" }, { id: "applications", label: t.admin.apps as string, icon: Shield, href: "/admin/apps" }, { id: "security", label: t.admin.security as string, icon: Lock, href: "/admin/security" }, { id: "audit", label: t.admin.auditLog, icon: Calendar, href: "/admin/audit" }, ]; const cards = [ { name: "users", labelFa: "کاربران", labelEn: "Users", icon: Users, color: "text-blue-400", bg: "bg-blue-500/10" }, { name: "organizations", labelFa: "سازمان\u200cها", labelEn: "Organizations", icon: Building2, color: "text-emerald-400", bg: "bg-emerald-500/10" }, { name: "applications", labelFa: "اپلیکیشن\u200cها", labelEn: "Applications", icon: Shield, color: "text-purple-400", bg: "bg-purple-500/10" }, { name: "sessions", labelFa: "نشست\u200cها", labelEn: "Sessions", icon: Activity, color: "text-amber-400", bg: "bg-amber-500/10" }, ]; if (loading) { return (
); } return ( {/* Left Sidebar */} {/* Main Content */}
{/* Header / Quick Stats */}
{cards.map((card) => { const value = stats?.results.find((r) => r.name === card.name)?.count || 0; return (
{value}
{card.labelEn}
); })}
{/* Quick Action Cards */}

Manage Users

{t.admin.manageUsers}

Organizations

{t.admin.manageOrgs}

Security

{t.admin.securitySettings}

{/* Active Sessions Section */}

{t.dashboard.activeSessions!}

{activeSessions} {t.dashboard.of as string} {stats?.results.find((r) => r.name === "sessions")?.count || 0} {t.dashboard.totalSessions as string}

{sessions.slice(0, 5).length === 0 ? ( ) : ( sessions.slice(0, 5).map((r: any, i: number) => ( )) )}
User App Location Status
{lang === "fa" ? "نشست فعالی یافت نشد" : "No active sessions found"}
{(r.user_email || "?").charAt(0).toUpperCase()}
{r.user_email || (lang === "fa" ? "کاربر ناشناس" : "Unknown user")}
{r.application_name || "—"} {r.ip_address || "—"} {r.status === "active" ? lang === "fa" ? "فعال" : "Active" : r.status === "revoked" ? lang === "fa" ? "لغو شده" : "Revoked" : lang === "fa" ? "منقضی" : "Expired"}
{/* Recent Security Events */}

{t.dashboard.recentEvents}

{events.length === 0 ? (

{lang === "fa" ? "رخداد امنیتی یافت نشد" : "No security events"}

) : ( events.slice(0, 6).map((r: any, i: number) => (
{(r.user_email || "?").charAt(0).toUpperCase()}
{r.event_type}
{r.occurred_at ? new Date(r.occurred_at).toLocaleString(lang === "fa" ? "fa-IR" : "en-US") : ""}
{r.user_email || (lang === "fa" ? "ناشناس" : "anonymous")} {r.severity || r.status || ""}
)) )}
); }