'use client'; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Users, GraduationCap, Trophy, BookOpen } from "lucide-react"; import { useEffect, useState } from "react"; import { useTheme } from "next-themes"; import StatistikMahasiswaChart from "@/components/charts/StatistikMahasiswaChart"; import JenisPendaftaranChart from "@/components/charts/JenisPendaftaranChart"; import AsalDaerahChart from "@/components/charts/AsalDaerahChart"; interface MahasiswaTotal { total_mahasiswa: number; mahasiswa_aktif: number; total_lulus: number; pria_lulus: number; wanita_lulus: number; total_berprestasi: number; prestasi_akademik: number; prestasi_non_akademik: number; total_mahasiswa_aktif_lulus: number; total_mahasiswa_beasiswa: number; total_mahasiswa_beasiswa_pemerintah: number; total_mahasiswa_beasiswa_non_pemerintah: number; } // Skeleton loading component const CardSkeleton = () => (
); export default function DashboardPage() { const { theme } = useTheme(); const [mahasiswaData, setMahasiswaData] = useState({ total_mahasiswa: 0, mahasiswa_aktif: 0, total_lulus: 0, pria_lulus: 0, wanita_lulus: 0, total_berprestasi: 0, prestasi_akademik: 0, prestasi_non_akademik: 0, total_mahasiswa_aktif_lulus: 0, total_mahasiswa_beasiswa: 0, total_mahasiswa_beasiswa_pemerintah: 0, total_mahasiswa_beasiswa_non_pemerintah: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { // Menggunakan cache API untuk mempercepat loading const cacheKey = 'mahasiswa-total-data'; const cachedData = sessionStorage.getItem(cacheKey); const cachedTimestamp = sessionStorage.getItem(`${cacheKey}-timestamp`); // Cek apakah data cache masih valid (kurang dari 60 detik) const isCacheValid = cachedTimestamp && (Date.now() - parseInt(cachedTimestamp)) < 60000; if (cachedData && isCacheValid) { setMahasiswaData(JSON.parse(cachedData)); } // Fetch data total mahasiswa const totalResponse = await fetch('/api/mahasiswa/total', { cache: 'no-store', }); if (!totalResponse.ok) { throw new Error('Failed to fetch total data'); } const totalData = await totalResponse.json(); setMahasiswaData(totalData); // Menyimpan data dan timestamp ke sessionStorage sessionStorage.setItem(cacheKey, JSON.stringify(totalData)); sessionStorage.setItem(`${cacheKey}-timestamp`, Date.now().toString()); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); console.error('Error fetching data:', err); } finally { setLoading(false); } }; fetchData(); }, []); return (

Visualisasi Data Akademik Mahasiswa Informatika

{loading ? (
) : error ? (

{error}

) : ( <>
{/* Kartu Total Mahasiswa */} Total Mahasiswa
{mahasiswaData.total_mahasiswa}
Aktif: {mahasiswaData.mahasiswa_aktif}
{/* Kartu Total Kelulusan */} Total Kelulusan
{mahasiswaData.total_lulus}
Laki-laki: {mahasiswaData.pria_lulus} Perempuan: {mahasiswaData.wanita_lulus}
{/* Kartu Total Prestasi */} Mahasiswa Berprestasi
{mahasiswaData.total_berprestasi}
Akademik: {mahasiswaData.prestasi_akademik} Non-Akademik: {mahasiswaData.prestasi_non_akademik}
{/* Kartu Mahasiswa Beasiswa */} Mahasiswa Beasiswa
{mahasiswaData.total_mahasiswa_beasiswa}
Pemerintah: {mahasiswaData.total_mahasiswa_beasiswa_pemerintah} Non-Pemerintah: {mahasiswaData.total_mahasiswa_beasiswa_non_pemerintah}
) }
); }