/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; import colors from '@/con/colors'; import { PieChart, BarChart } from '@mantine/charts'; import { Box, Center, Flex, Paper, SimpleGrid, Skeleton, Stack, Text, Title, } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import indeksKepuasanState from '../../../_state/landing-page/indeks-kepuasan'; interface ChartDataItem { name: string; value: number; color: string; } function Page() { const state = useProxy(indeksKepuasanState.responden); const { data, loading } = state.findMany; const [donutDataJenisKelamin, setDonutDataJenisKelamin] = useState([]); const [donutDataRating, setDonutDataRating] = useState([]); const [donutDataKelompokUmur, setDonutDataKelompokUmur] = useState([]); const [barChartData, setBarChartData] = useState>([]); useShallowEffect(() => { if (!data && !loading) { state.findMany.load(); return; } if (data) { const totalLaki = data.filter((item: any) => item.jenisKelamin?.name?.toLowerCase() === 'laki-laki').length; const totalPerempuan = data.filter((item: any) => item.jenisKelamin?.name?.toLowerCase() === 'perempuan').length; const totalSangatBaik = data.filter((item: any) => item.rating?.name?.toLowerCase() === 'sangat baik').length; const totalBaik = data.filter((item: any) => item.rating?.name?.toLowerCase() === 'baik').length; const totalKurangBaik = data.filter((item: any) => item.rating?.name?.toLowerCase() === 'kurang baik').length; const totalSangatKurangBaik = data.filter((item: any) => item.rating?.name?.toLowerCase() === 'sangat kurang baik').length; const totalMuda = data.filter((item: any) => item.kelompokUmur?.name?.toLowerCase() === 'muda').length; const totalDewasa = data.filter((item: any) => item.kelompokUmur?.name?.toLowerCase() === 'dewasa').length; const totalLansia = data.filter((item: any) => item.kelompokUmur?.name?.toLowerCase() === 'lansia').length; setDonutDataJenisKelamin([ { name: 'Laki-laki', value: totalLaki, color: colors['blue-button'] }, { name: 'Perempuan', value: totalPerempuan, color: '#10A85AFF' }, ]); setDonutDataRating([ { name: 'Sangat Baik', value: totalSangatBaik, color: colors['blue-button'] }, { name: 'Baik', value: totalBaik, color: '#10A85AFF' }, { name: 'Kurang Baik', value: totalKurangBaik, color: '#FFA500' }, { name: 'Sangat Kurang Baik', value: totalSangatKurangBaik, color: '#FF4500' }, ]); setDonutDataKelompokUmur([ { name: 'Muda', value: totalMuda, color: colors['blue-button'] }, { name: 'Dewasa', value: totalDewasa, color: '#10A85AFF' }, { name: 'Lansia', value: totalLansia, color: '#FFA500' }, ]); const monthYearMap = new Map(); data.forEach((item: any) => { const dateValue = item.tanggal || item.createdAt; if (!dateValue) return; const parsedDate = new Date(dateValue); if (isNaN(parsedDate.getTime())) return; const month = parsedDate.getMonth() + 1; const year = parsedDate.getFullYear(); const monthYearKey = `${year}-${String(month).padStart(2, '0')}`; monthYearMap.set(monthYearKey, (monthYearMap.get(monthYearKey) || 0) + 1); }); const barData = Array.from(monthYearMap.entries()) .map(([key, count]) => { const [year, month] = key.split('-'); const monthName = new Date(Number(year), Number(month) - 1, 1) .toLocaleString('id-ID', { month: 'long' }); return { month: `${monthName} ${year}`, count, sortKey: parseInt(`${year}${String(month).padStart(2, '0')}`, 10), }; }) .sort((a, b) => a.sortKey - b.sortKey) .map(({ month, count }) => ({ month, count })); setBarChartData(barData); } }, [data]); if (loading || !data) { return ( ); } if (data.length === 0) { return ( Belum ada data yang tersedia ); } return ( Tren Jumlah Responden Distribusi Jenis Kelamin {donutDataJenisKelamin.every(item => item.value === 0) ? ( Tidak ada data ) : (
{donutDataJenisKelamin.map((entry) => ( {entry.name}: {entry.value} ))}
)}
Distribusi Penilaian {donutDataRating.every(item => item.value === 0) ? ( Tidak ada data ) : (
{donutDataRating.map((entry) => ( {entry.name}: {entry.value} ))}
)}
Distribusi Kelompok Umur {donutDataKelompokUmur.every(item => item.value === 0) ? ( Tidak ada data ) : (
{donutDataKelompokUmur.map((entry) => ( {entry.name}: {entry.value} ))}
)}
); } export default Page;