import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/hooks/useAuth"; import { AppLayout } from "@/components/AppLayout"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { formatIDR } from "@/lib/format"; import { Package, Users, Receipt, TrendingUp, BookOpen, Calendar } from "lucide-react"; interface Stats { totalProducts: number; totalMembers: number; totalOrders: number; totalRevenue: number; pendingOrders: number; activeBootcamps: number; } export default function AdminDashboard() { const { user, isAdmin, loading: authLoading } = useAuth(); const navigate = useNavigate(); const [stats, setStats] = useState(null); const [recentOrders, setRecentOrders] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (!authLoading) { if (!user) navigate("/auth"); else if (!isAdmin) navigate("/dashboard"); else fetchData(); } }, [user, isAdmin, authLoading]); const fetchData = async () => { const [productsRes, profilesRes, ordersRes, paidOrdersRes, bootcampRes] = await Promise.all([ supabase.from("products").select("id", { count: "exact" }), supabase.from("profiles").select("id", { count: "exact" }), supabase.from("orders").select("*").order("created_at", { ascending: false }).limit(5), supabase.from("orders").select("total_amount").eq("payment_status", "paid"), supabase.from("products").select("id", { count: "exact" }).eq("type", "bootcamp").eq("is_active", true), ]); const pendingRes = await supabase.from("orders").select("id", { count: "exact" }).eq("payment_status", "pending"); const totalRevenue = paidOrdersRes.data?.reduce((sum, o) => sum + (o.total_amount || 0), 0) || 0; setStats({ totalProducts: productsRes.count || 0, totalMembers: profilesRes.count || 0, totalOrders: ordersRes.data?.length || 0, totalRevenue, pendingOrders: pendingRes.count || 0, activeBootcamps: bootcampRes.count || 0, }); setRecentOrders(ordersRes.data || []); setLoading(false); }; if (authLoading || loading) { return (
{[...Array(4)].map((_, i) => ( ))}
); } const statCards = [ { label: "Total Produk", value: stats?.totalProducts || 0, icon: Package, color: "text-primary" }, { label: "Total Member", value: stats?.totalMembers || 0, icon: Users, color: "text-accent" }, { label: "Order Pending", value: stats?.pendingOrders || 0, icon: Receipt, color: "text-secondary-foreground" }, { label: "Total Pendapatan", value: formatIDR(stats?.totalRevenue || 0), icon: TrendingUp, color: "text-primary" }, { label: "Bootcamp Aktif", value: stats?.activeBootcamps || 0, icon: BookOpen, color: "text-accent" }, ]; return (

Admin Dashboard

Ringkasan statistik platform

{statCards.map((stat) => (

{stat.value}

{stat.label}

))}
Order Terbaru {recentOrders.length === 0 ? (

Belum ada order

) : (
{recentOrders.map((order) => (

{order.id.slice(0, 8)}

{new Date(order.created_at).toLocaleDateString("id-ID")}

{formatIDR(order.total_amount)}

{order.payment_status === "paid" ? "Lunas" : "Pending"}
))}
)}
); }