import React, { useEffect, useMemo, useState } from 'react'; import { api, errorMessage } from '../../services/apiClient.ts'; import type { Kandang, Site } from '../../types/api.ts'; import { Banner } from '../ui/Feedback.tsx'; import FeedInButtonGrid from './FeedInButtonGrid.tsx'; type FeedInButtonPanelProps = { variant?: 'default' | 'kiosk'; }; const hasConfiguredUrls = (kandang: Kandang): boolean => (kandang.feed_in_button_urls ?? []).some((entry) => entry.url.trim()); const FeedInButtonPanel: React.FC = ({ variant = 'default' }) => { const [sites, setSites] = useState([]); const [kandangs, setKandangs] = useState([]); const [selectedSiteId, setSelectedSiteId] = useState(null); const [selectedKandangId, setSelectedKandangId] = useState('all'); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const isKiosk = variant === 'kiosk'; useEffect(() => { let cancelled = false; (async () => { setLoading(true); setError(null); try { const nextSites = await api.sites.list(); if (cancelled) return; setSites(nextSites); setSelectedSiteId((prev) => { if (prev && nextSites.some((site) => site.id === prev)) return prev; return nextSites[0]?.id ?? null; }); } catch (err) { if (!cancelled) setError(errorMessage(err)); } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, []); useEffect(() => { if (selectedSiteId == null) { setKandangs([]); return; } let cancelled = false; (async () => { setLoading(true); setError(null); try { const nextKandangs = await api.kandangs.list({ site_id: selectedSiteId }); if (cancelled) return; setKandangs(nextKandangs); setSelectedKandangId('all'); } catch (err) { if (!cancelled) setError(errorMessage(err)); } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [selectedSiteId]); const filterableKandangs = useMemo(() => kandangs.filter(hasConfiguredUrls), [kandangs]); const displayedKandangs = useMemo(() => { if (selectedKandangId === 'all') return filterableKandangs; return filterableKandangs.filter((kandang) => kandang.id === selectedKandangId); }, [filterableKandangs, selectedKandangId]); const chipClass = (active: boolean) => `px-4 py-2 rounded-full text-sm font-semibold border transition-colors ${ active ? 'bg-red-600 text-white border-red-600 shadow-sm' : 'bg-white text-gray-700 border-gray-300 hover:border-red-300 hover:text-red-600' }`; return (
{error && {error}} {(sites.length > 1 || filterableKandangs.length > 0) && (
{sites.length > 1 && (
)} {filterableKandangs.length > 0 && (

Kandang

{filterableKandangs.map((kandang) => ( ))}
)}
)} {loading ? (
Memuat kandang...
) : ( )}
); }; export default FeedInButtonPanel;