import { useEffect, useMemo, useState } from "preact/hooks"; import "../../styles/modal.css"; import "../../styles/offers/offers-table.css"; import "../../styles/channels-search.css"; // żeby input miał identyczny styl export default function JamboxChannelsModal({ isOpen, onClose, pkg }) { const [channels, setChannels] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const [query, setQuery] = useState(""); const q = query.trim().toLowerCase(); const filtered = !q ? channels : channels.filter((ch) => (ch.name || "").toLowerCase().includes(q)); const meta = useMemo(() => { if (loading) return "Ładowanie…"; if (error) return error; if (!query.trim()) return `Wyniki: ${filtered.length} / ${channels.length}`; return `Wyniki: ${filtered.length} / ${channels.length}`; }, [loading, error, query, filtered.length, channels.length]); useEffect(() => { if (!isOpen || !pkg?.id) return; let cancelled = false; async function loadChannels() { setLoading(true); setError(""); setChannels([]); setQuery(""); try { const params = new URLSearchParams({ packageId: String(pkg.id) }); const res = await fetch(`/api/jambox/channels?${params.toString()}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const json = await res.json(); if (!cancelled) setChannels(Array.isArray(json.data) ? json.data : []); } catch (err) { console.error("❌ Błąd pobierania listy kanałów:", err); if (!cancelled) setError("Nie udało się załadować listy kanałów."); } finally { if (!cancelled) setLoading(false); } } loadChannels(); return () => { cancelled = true; }; }, [isOpen, pkg?.id]); if (!isOpen || !pkg) return null; return (