'use client' import { useState, useMemo } from 'react' import { Activity, ChevronDown } from 'lucide-react' import { ExportPDFButton } from './ExportPDFButton' interface HasilStunting { id: number tinggi_badan: number | null berat_badan: number | null z_score: number | null status_stunting: boolean | null pesan_ai: string | null tanggal_upload: string | null nama_posyandu: string | null } interface Pengguna { nama_orang_tua: string alamat: string | null nama_anak: string jenis_kelamin: string | null tanggal_lahir: string | null } interface Props { data: HasilStunting[] pengguna: Pengguna } const START_YEAR = 2026 export function StuntingTable({ data, pengguna }: 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 filtered = useMemo(() => { return data.filter(d => { if (!d.tanggal_upload) return false return new Date(d.tanggal_upload).getFullYear() === selectedYear }) }, [data, selectedYear]) const formatDate = (d: string | null) => { if (!d) return '-' return new Date(d).toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric' }) } return (

Riwayat Pengukuran

Periode:
{/* Header */}
Tinggi Berat Z-Score Status Pesan / Rekomendasi Posyandu Tanggal Laporan
{filtered.length === 0 ? (

Data belum tersedia tahun {selectedYear}

) : (
{filtered.map((row) => { const isStunting = row.status_stunting === true return (
{/* Tinggi Badan */}
{row.tinggi_badan ?? '-'} {row.tinggi_badan && cm}
{/* Berat Badan */}
{row.berat_badan ?? '-'} {row.berat_badan && kg}
{/* Z-Score */}
{row.z_score ?? '-'} {row.z_score !== null && SD}
{/* Status Stunting */}
{row.status_stunting === null ? ( ) : ( {isStunting ? '⚠ Stunting' : '✓ Normal'} )}
{/* Pesan AI — truncated */}
{row.pesan_ai ? (

{row.pesan_ai}

) : ( Data sedang diproses... )}
{/* Nama Posyandu */}
{row.nama_posyandu ?? '-'}
{/* Tanggal Upload */}
{formatDate(row.tanggal_upload)}
{/* Aksi: Cetak PDF */}
) })}
)}
) }