import { trpc } from "@/providers/trpc"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Badge } from "@/components/ui/badge"; import { Users, MapPin, ClipboardList, TrendingUp, Clock, CheckCircle, } from "lucide-react"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, } from "recharts"; const COLORS = ["#4f46e5", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6"]; export default function Dashboard() { const { data: stats, isLoading: statsLoading } = trpc.dashboard.stats.useQuery(); const { data: activities, isLoading: actLoading } = trpc.dashboard.activities.useQuery({ limit: 10 }); const statCards = [ { title: "Total Penerima", value: stats?.totalRecipients ?? 0, icon: Users, subtitle: `${stats?.activeRecipients ?? 0} aktif`, color: "text-indigo-600", bg: "bg-indigo-50", }, { title: "Penerima Aktif", value: stats?.activeRecipients ?? 0, icon: CheckCircle, subtitle: `${stats?.pendingRecipients ?? 0} menunggu verifikasi`, color: "text-emerald-600", bg: "bg-emerald-50", }, { title: "Rumah Ibadah", value: stats?.totalPlaces ?? 0, icon: MapPin, subtitle: `${stats?.activePlaces ?? 0} aktif`, color: "text-amber-600", bg: "bg-amber-50", }, { title: "Distribusi Bantuan", value: stats?.totalDistributions ?? 0, icon: ClipboardList, subtitle: `Rp ${((stats?.totalAidAmount ?? 0) / 1000000).toFixed(1)}M total`, color: "text-violet-600", bg: "bg-violet-50", }, ]; return (
{/* Welcome */}

Dashboard

Ringkasan data pemetaan kemiskinan dan distribusi bantuan

{/* Stat Cards */}
{statCards.map((card) => (

{card.title}

{statsLoading ? ( ) : (

{card.value}

)}

{card.subtitle}

))}
{/* Charts Row */}
{/* Monthly Distribution Chart */} Distribusi Bulanan {statsLoading ? ( ) : (stats?.monthlyDist ?? []).length === 0 ? (
Tidak ada data distribusi
) : ( )}
{/* Status Distribution Pie Chart */} Status Penerima {statsLoading ? ( ) : (stats?.byStatus ?? []).length === 0 ? (
Tidak ada data
) : (
{(stats?.byStatus ?? []).map((_, index) => ( ))}
{(stats?.byStatus ?? []).map((item, index) => (
{item.status} {item.count}
))}
)}
{/* Activity Table */} Aktivitas Terbaru {actLoading ? (
{Array.from({ length: 5 }).map((_, i) => ( ))}
) : (activities ?? []).length === 0 ? (
Belum ada aktivitas
) : (
{(activities ?? []).map((act) => ( ))}
Aksi Entitas Detail Waktu
{act.action.toLowerCase()} {act.entityType.replace(/_/g, " ")} {act.details} {act.createdAt ? new Date(act.createdAt).toLocaleDateString("id-ID", { day: "numeric", month: "short", year: "numeric", hour: "2-digit", minute: "2-digit", }) : "-"}
)}
); }