"use client"; import Link from "next/link"; import { useCachedFetch } from "@/hooks/useCachedFetch"; import { Building2, Users, ClipboardList, Clock, CheckCircle2, ClipboardCheck, } from "lucide-react"; import { Skeleton } from "@/components/ui/Skeleton"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, Legend, } from "recharts"; interface Stats { departments: number; members: number; total_issues: number; pending_issues: number; resolved_issues: number; verification_needed: number; issues_by_category: { name: string; value: number }[]; issues_activity: { name: string; reported: number; resolved: number }[]; } export default function AdminDashboard() { const { data: stats, loading } = useCachedFetch("/admin/stats"); const COLORS = [ "#3B82F6", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6", "#EC4899", ]; if (loading) { return (
{Array.from({ length: 6 }).map((_, i) => ( ))}
); } const hasChartData = stats?.issues_by_category && stats.issues_by_category.length > 0; const hasActivityData = stats?.issues_activity && stats.issues_activity.length > 0; return (

Overview

City operations at a glance

} /> } /> } /> } alert={true} /> } alert={(stats?.verification_needed || 0) > 0} /> } />

Weekly Activity

{hasActivityData ? (
) : (
No activity data available yet.
)}

Issues by Category

{hasChartData ? (
{stats?.issues_by_category?.map((entry, index) => ( ))}
) : (
No category data available yet.
)}
); } function StatCard({ title, value, icon, alert = false, }: { title: string; value: number; icon: React.ReactNode; alert?: boolean; }) { return (
{icon}

{title}

{value}

); }