'use client' import { useState, useMemo } from 'react' import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from 'recharts' import { Ruler, Weight, ChevronDown, Activity } from 'lucide-react' interface HasilItem { tinggi_badan: number | null berat_badan: number | null z_score: number | null tanggal_upload: string | null } interface Props { data: HasilItem[] } const START_YEAR = 2026 function MiniTooltip({ active, payload, label, unit, color }: any) { if (!active || !payload?.length) return null return (

{label}

{payload[0]?.value ?? '-'} {unit}

) } export function GrowthChart({ data }: Props) { const availableYears = useMemo(() => { const currentYear = new Date().getFullYear() const dataYears = Array.from( new Set( data .map(d => d.tanggal_upload ? new Date(d.tanggal_upload).getFullYear() : null) .filter(Boolean) ) ) as number[] const maxYear = Math.max(currentYear, ...dataYears, START_YEAR) return Array.from( new Set([ ...Array.from({ length: maxYear - START_YEAR + 1 }, (_, i) => START_YEAR + i), ...dataYears, ]) ).filter(y => y >= START_YEAR).sort((a, b) => a - b) }, [data]) const [selectedYear, setSelectedYear] = useState(availableYears[availableYears.length - 1] ?? START_YEAR) const chartData = useMemo(() => { return data .filter(d => { if (!d.tanggal_upload) return false return new Date(d.tanggal_upload).getFullYear() === selectedYear }) .map(d => ({ label: new Date(d.tanggal_upload!).toLocaleDateString('id-ID', { day: 'numeric', month: 'short' }), _date: new Date(d.tanggal_upload!).getTime(), tinggi: d.tinggi_badan, berat: d.berat_badan, zscore: d.z_score, })) .sort((a, b) => a._date - b._date) }, [data, selectedYear]) const hasData = chartData.length > 0 return (

Grafik Pertumbuhan Anak

Statistik Panjang, Berat & Z-Score {selectedYear}

Pilih Tahun:

Panjang Badan

Satuan Centimeter (cm)

{!hasData ? (

Data belum tersedia

) : ( } /> )}
{/* Weight Chart */}

Berat Badan

Satuan Kilogram (kg)

{!hasData ? (

Data belum tersedia

) : ( } /> )}
{/* Z-Score Chart */}

Z-Score (SD)

Standar Deviasi Pertumbuhan

{!hasData ? (

Data belum tersedia

) : ( } /> )}
) }