'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 ? (
) : (
} />
)}
{/* Weight Chart */}
Berat Badan
Satuan Kilogram (kg)
{!hasData ? (
) : (
} />
)}
{/* Z-Score Chart */}
Z-Score (SD)
Standar Deviasi Pertumbuhan
{!hasData ? (
) : (
} />
)}
)
}