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, EmptyFarm, PageHeader, Spinner } from './ui/Feedback.tsx'; import { formatDateRange, formatRatio } from '../utils/format.ts'; import { loadKandangRanking, type KandangRankingRow, } from '../utils/kandangRanking.ts'; type ScopeMode = 'selected' | 'all'; type Props = { setView: (view: View) => void; }; const MONTH_OPTIONS = Array.from({ length: 12 }, (_, i) => i + 1); const formatMetric = (value: number | null): string => value == null ? 'N/A' : formatRatio(value, 3); const KandangRankingPage: React.FC = ({ setView }) => { const { sites, selectedSite, selectedSiteId, setSelectedSiteId, setSelectedKandangId, setSelectedCycleId, } = useFarm(); const [scope, setScope] = useState('selected'); const [months, setMonths] = useState(3); const [rows, setRows] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const needsSite = scope === 'selected' && selectedSiteId == null; useEffect(() => { if (needsSite) { setRows([]); setError(null); setLoading(false); return; } const targetSites = scope === 'all' ? sites : selectedSite ? [selectedSite] : []; if (targetSites.length === 0) { setRows([]); return; } let cancelled = false; (async () => { setLoading(true); setError(null); try { const next = await loadKandangRanking({ sites: targetSites, months }); if (!cancelled) setRows(next); } catch (err) { if (!cancelled) { setError(errorMessage(err)); setRows([]); } } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [scope, months, sites, selectedSite, selectedSiteId, needsSite]); const openEef = (row: KandangRankingRow) => { setSelectedSiteId(row.siteId); setSelectedKandangId(row.kandangId); setSelectedCycleId(row.cycleId); setView('eefDashboard'); }; if (needsSite) { return (
setView('kandangSettings')} />
); } const showSiteColumn = scope === 'all'; return (
{error && (
{error}
)} {loading ? ( ) : rows.length === 0 ? ( Tidak ada siklus tertutup dalam rentang ini. ) : (
{showSiteColumn && } {rows.map((row) => ( openEef(row)} > {showSiteColumn && ( )} ))}
RankSiteKandang Periode Hari EEF FCR
{row.rank > 0 ? row.rank : '—'} {row.siteName}{row.kandangName} {formatDateRange(row.startDate, row.endDate)} {row.totalDays || '—'} {formatMetric(row.eef)} {formatMetric(row.fcr)}
)}
); }; export default KandangRankingPage;