'use client'; import { useEffect, useState } from 'react'; import dynamic from 'next/dynamic'; import { ApexOptions } from 'apexcharts'; import { useTheme } from 'next-themes'; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; // Dynamically import ApexCharts to avoid SSR issues const Chart = dynamic(() => import('react-apexcharts'), { ssr: false }); interface TingkatPrestasiData { tahun_angkatan: string | number; tingkat_prestasi: string; tingkat_mahasiswa_prestasi: number; } interface Props { selectedYear: string; } export default function TingkatPrestasiDashChart({ selectedYear }: Props) { const { theme } = useTheme(); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { setLoading(true); setError(null); const url = `/api/mahasiswa/tingkat-prestasi-dashboard?tahunAngkatan=${selectedYear}`; const response = await fetch(url); if (!response.ok) { throw new Error(`Failed to fetch data: ${response.status} ${response.statusText}`); } const result = await response.json(); if (!Array.isArray(result)) { throw new Error('Invalid data format received from server'); } // API already returns sorted data, no need to sort again setData(result); } catch (err) { console.error('Error in fetchData:', err); setError(err instanceof Error ? err.message : 'An error occurred while fetching data'); } finally { setLoading(false); } }; fetchData(); }, [selectedYear]); // Process data for series const processSeriesData = () => { if (!data.length) { return []; } const years = [...new Set(data.map(item => item.tahun_angkatan))].sort((a, b) => Number(a) - Number(b)); const tingkatTypes = [...new Set(data.map(item => item.tingkat_prestasi))].sort(); return tingkatTypes.map(tingkat => ({ name: tingkat, data: years.map(year => { const item = data.find(d => String(d.tahun_angkatan) === String(year) && d.tingkat_prestasi === tingkat); return item?.tingkat_mahasiswa_prestasi || 0; }) })); }; const chartOptions: ApexOptions = { chart: { type: 'bar', stacked: false, toolbar: { show: true, tools: { download: true, selection: true, zoom: true, zoomin: true, zoomout: true, pan: true, reset: true } }, background: theme === 'dark' ? '#0F172B' : '#fff', }, plotOptions: { bar: { horizontal: false, columnWidth: '55%', borderRadius: 1, }, }, dataLabels: { enabled: true, formatter: function (val: number) { return val?.toString() || '0'; }, style: { fontSize: '12px', colors: [theme === 'dark' ? '#fff' : '#000'] } }, stroke: { show: true, width: 2, colors: ['transparent'] }, xaxis: { categories: [...new Set(data.map(item => item.tahun_angkatan))].sort((a, b) => Number(a) - Number(b)), title: { text: 'Tahun Angkatan', style: { fontSize: '14px', fontWeight: 'bold', color: theme === 'dark' ? '#fff' : '#000' } }, labels: { style: { fontSize: '12px', colors: theme === 'dark' ? '#fff' : '#000' } }, axisBorder: { show: true, color: theme === 'dark' ? '#374151' : '#E5E7EB' }, axisTicks: { show: true, color: theme === 'dark' ? '#374151' : '#E5E7EB' }, }, yaxis: { title: { text: 'Jumlah Mahasiswa', style: { fontSize: '14px', fontWeight: 'bold', color: theme === 'dark' ? '#fff' : '#000' } }, labels: { style: { fontSize: '12px', colors: theme === 'dark' ? '#fff' : '#000' } }, axisBorder: { show: true, color: theme === 'dark' ? '#374151' : '#E5E7EB' }, tickAmount: 5, }, fill: { opacity: 1 }, colors: ['#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#EC4899', '#06B6D4'], tooltip: { theme: theme === 'dark' ? 'dark' : 'light', y: { formatter: function (val: number) { return val + " mahasiswa"; } } }, legend: { position: 'top', fontSize: '14px', markers: { size: 12, }, itemMargin: { horizontal: 10, }, labels: { colors: theme === 'dark' ? '#fff' : '#000' } }, grid: { borderColor: theme === 'dark' ? '#374151' : '#E5E7EB', strokeDashArray: 4, padding: { top: 20, right: 0, bottom: 0, left: 0 } } }; const series = processSeriesData(); if (loading) { return ( Loading... ); } if (error) { return ( Error: {error} ); } if (data.length === 0) { return ( Tidak ada data yang tersedia ); } return ( Tingkat Prestasi Dashboard {selectedYear !== 'all' ? ` Angkatan ${selectedYear}` : ''}
{typeof window !== 'undefined' && series.length > 0 ? ( ) : (

{series.length === 0 ? 'Tidak ada data untuk ditampilkan' : 'Loading chart...'}

)}
); }