import React, { useEffect, useState } from 'react'; import { errorMessage } from '../../services/apiClient.ts'; import type { View } from '../../types/common.ts'; import { useFarm } from '../../context/FarmContext.tsx'; import { Banner, Spinner } from '../ui/Feedback.tsx'; import { formatRatio } from '../../utils/format.ts'; import { loadKandangRanking, type KandangRankingRow, } from '../../utils/kandangRanking.ts'; type Props = { setView: (view: View) => void; }; const KandangRankingTop5: React.FC = ({ setView }) => { const { selectedSite, setSelectedSiteId, setSelectedKandangId, setSelectedCycleId, } = useFarm(); const [rows, setRows] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const openEef = (row: KandangRankingRow) => { setSelectedSiteId(row.siteId); setSelectedKandangId(row.kandangId); setSelectedCycleId(row.cycleId); setView('eefDashboard'); }; useEffect(() => { if (!selectedSite) { setRows([]); setError(null); return; } let cancelled = false; (async () => { setLoading(true); setError(null); try { const next = await loadKandangRanking({ sites: [selectedSite], months: 3 }); if (!cancelled) setRows(next.slice(0, 5)); } catch (err) { if (!cancelled) { setError(errorMessage(err)); setRows([]); } } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [selectedSite]); if (!selectedSite) return null; return (

Peringkat EEF

Top 5 · {selectedSite.site_name} · 3 bulan terakhir (siklus tertutup)

{error && {error}} {loading ? ( ) : rows.length === 0 ? (

Tidak ada siklus tertutup dalam 3 bulan terakhir.

) : (
    {rows.map((row) => (
  • openEef(row)} >
    {row.rank > 0 ? row.rank : '—'}

    {row.kandangName}

    FCR {row.fcr == null ? 'N/A' : formatRatio(row.fcr, 3)}

    {row.eef == null ? 'N/A' : formatRatio(row.eef, 3)}

  • ))}
)}
); }; export default KandangRankingTop5;