'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 IpkStatusData { tahun_angkatan: number; status_kuliah: string; total_mahasiswa: number; rata_rata_ipk: number; } interface Props { selectedYear: string; selectedStatus: string; } export default function IpkStatusChart({ selectedYear, selectedStatus }: Props) { const { theme, systemTheme } = useTheme(); const [mounted, setMounted] = useState(false); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { setMounted(true); }, []); useEffect(() => { const fetchData = async () => { try { setLoading(true); setError(null); const url = `/api/mahasiswa/ipk-status?tahun_angkatan=${selectedYear}&status_kuliah=${selectedStatus}`; const response = await fetch(url); if (!response.ok) { const errorText = await response.text(); console.error('Error response:', errorText); throw new Error(`Failed to fetch data: ${response.status} ${response.statusText}`); } const result = await response.json(); console.log('Received data:', result); if (!Array.isArray(result)) { console.error('Invalid data format:', result); throw new Error('Invalid data format received from server'); } // Sort data by tahun_angkatan const sortedData = result.sort((a: IpkStatusData, b: IpkStatusData) => a.tahun_angkatan - b.tahun_angkatan ); console.log('Sorted data:', sortedData); setData(sortedData); } 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, selectedStatus]); // Log data changes useEffect(() => { console.log('Current data state:', data); }, [data]); const chartOptions: ApexOptions = { chart: { type: selectedYear === 'all' ? 'line' : 'bar', toolbar: { show: true, tools: { download: true, selection: true, zoom: true, zoomin: true, zoomout: true, pan: true, reset: true } }, background: theme === 'dark' ? '#0F172B' : '#fff', zoom: { enabled: true, type: 'x', autoScaleYaxis: true } }, plotOptions: { bar: { horizontal: false, columnWidth: '55%', borderRadius: 4, }, }, stroke: { curve: 'smooth', width: 3, lineCap: 'round' }, markers: { size: 5, strokeWidth: 2, strokeColors: theme === 'dark' ? ['#fff'] : ['#3B82F6'], colors: ['#3B82F6'], hover: { size: 7 } }, dataLabels: { enabled: true, formatter: function (val: number) { return val.toFixed(2); }, style: { fontSize: '14px', fontWeight: 'bold', colors: [theme === 'dark' ? '#fff' : '#000'] }, background: { enabled: false }, offsetY: -10 }, xaxis: { categories: data.map(item => item.tahun_angkatan.toString()), 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: 'Rata-rata IPK', style: { fontSize: '14px', fontWeight: 'bold', color: theme === 'dark' ? '#fff' : '#000' } }, min: 0, max: 4, labels: { style: { fontSize: '12px', colors: theme === 'dark' ? '#fff' : '#000' }, formatter: function (val: number) { return val.toFixed(2); } }, axisBorder: { show: true, color: theme === 'dark' ? '#374151' : '#E5E7EB' } }, grid: { borderColor: theme === 'dark' ? '#374151' : '#E5E7EB', strokeDashArray: 4, padding: { top: 20, right: 0, bottom: 0, left: 0 } }, colors: ['#3B82F6'], tooltip: { theme: theme === 'dark' ? 'dark' : 'light', y: { formatter: function (val: number) { return val.toFixed(2); } }, marker: { show: true } }, legend: { show: true, position: 'top', horizontalAlign: 'right', labels: { colors: theme === 'dark' ? '#fff' : '#000' } } }; // Process data for series const processSeriesData = () => { return [{ name: 'Rata-rata IPK', data: data.map(item => item.rata_rata_ipk) }]; }; const series = processSeriesData(); if (!mounted) { return null; } if (loading) { return ( Loading... ); } if (error) { return ( Error: {error} ); } if (data.length === 0) { return ( Tidak ada data yang tersedia ); } return ( Rata-rata IPK Mahasiswa {selectedStatus} {selectedYear !== 'all' ? ` Angkatan ${selectedYear}` : ''}
{typeof window !== 'undefined' && ( )}
); }