import React, { useEffect, useState } from "react"; import { PieChart, Pie, Cell, ResponsiveContainer } from "recharts"; import { Search, ChevronDown, Users, UserCheck, UserX, Clock } from "lucide-react"; import NavbarAdmin from "../Layout/NavbarAdmin"; import SidebarAdmin from "../Layout/SidebarAdmin"; type ChartDataItem = { name: string; value: number; }; type StatCard = { title: string; value: number; subtitle: string; icon: React.ReactNode; iconColor: string; }; type DashboardApiResponse = { totalPendaftar: number; totalDiterima: number; totalDitolak: number; totalDiproses: number; universitas: ChartDataItem[]; negara: ChartDataItem[]; }; const UNIVERSITAS_COLORS = ["#001a66", "#334d99", "#6699cc", "#99b3ff"]; const PENERIMAAN_COLORS = ["#0088ff", "#00cc00", "#ff3333"]; const NEGARA_COLORS = ["#cc3333", "#dd6666", "#ee9999", "#f0b3b3", "#f5cccc"]; const Dashboard: React.FC = () => { const [loading, setLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(""); const [statCards, setStatCards] = useState([]); const [universitasData, setUniversitasData] = useState([]); const [penerimaanData, setPenerimaanData] = useState([]); const [negaraData, setNegaraData] = useState([]); useEffect(() => { const fetchDashboardData = async () => { try { const response = await fetch( `${import.meta.env.VITE_API_BASE_URL}/lowongan-magang-api/get` ); const result = await response.json(); if (!response.ok) { console.error("Gagal mengambil data dashboard:", result.message); setErrorMessage(result.message || "Gagal mengambil data dashboard."); setLoading(false); return; } const data: DashboardApiResponse = result.data; const statCardsFromApi: StatCard[] = [ { title: "Total Pendaftar", value: data.totalPendaftar, subtitle: "+200 dari batch sebelumnya", // sesuaikan bila BE sudah support icon: , iconColor: "#0088ff", }, { title: "Total Diterima", value: data.totalDiterima, subtitle: `${( (data.totalDiterima / (data.totalPendaftar || 1)) * 100 ).toFixed(1)}% acceptance rate`, icon: , iconColor: "#00cc00", }, { title: "Total Ditolak", value: data.totalDitolak, subtitle: `${( (data.totalDitolak / (data.totalPendaftar || 1)) * 100 ).toFixed(1)}% rejection rate`, icon: , iconColor: "#ff3333", }, { title: "Sedang Diproses", value: data.totalDiproses, subtitle: `${( (data.totalDiproses / (data.totalPendaftar || 1)) * 100 ).toFixed(1)}% pending review`, icon: , iconColor: "#ffaa00", }, ]; const penerimaanFromApi: ChartDataItem[] = [ { name: "Total Pendaftar", value: data.totalPendaftar }, { name: "Total Diterima", value: data.totalDiterima }, { name: "Total Ditolak", value: data.totalDitolak }, ]; setStatCards(statCardsFromApi); setUniversitasData(data.universitas || []); setPenerimaanData(penerimaanFromApi); setNegaraData(data.negara || []); setLoading(false); } catch (error) { console.error("Terjadi kesalahan saat mengambil data dashboard:", error); setErrorMessage("Terjadi kesalahan saat mengambil data dashboard."); setLoading(false); } }; fetchDashboardData(); }, []); return (
{/* Header Section */}

Dashboard

{/* Batch Filter */} {/* Search Box */}
{/* Loading / Error State */} {loading && (

Memuat data dashboard...

)} {!loading && errorMessage && (

{errorMessage}

)} {!loading && !errorMessage && ( <> {/* Stat Cards */}
{statCards.map((card, index) => (
{card.icon}

{card.title}

{card.value}

{card.subtitle}

))}
{/* Charts Section */}
{/* Universitas Chart */}

Universitas

{universitasData.map((_, index) => ( ))}
{/* Legend */}
{universitasData.map((item, index) => (
{item.name}
{item.value}%
))}
{/* Right Column - Penerimaan & Negara */}
{/* Penerimaan Chart */}

Penerimaan

{penerimaanData.map((_, index) => ( ))}
{/* Legend */}
{penerimaanData.map((item, index) => (
{item.name}
))}
{/* Negara Chart */}

Negara

{negaraData.map((_, index) => ( ))}
{/* Legend */}
{negaraData.map((item, index) => (
{item.name}
))}
)}
); }; export default Dashboard;