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 (
e.stopPropagation()} role="dialog" aria-modal="true" aria-label={`Kanały w pakiecie ${pkg.name}`} >

Kanały w pakiecie {pkg.name}

{/* INPUT jak w wyszukiwarce (z własnym X) */}
setQuery(e.currentTarget.value)} placeholder="Szukaj kanału po nazwie…" aria-label="Szukaj kanału po nazwie" /> {query && ( )}
{meta}
{loading &&

Ładowanie kanałów...

} {error && !loading &&

{error}

} {!loading && !error && ( <> {filtered.length === 0 ? (

Brak kanałów spełniających kryteria.

) : (
{filtered.map((ch) => (
{ // żeby klik w link w opisie nie flipował if (e.target.closest("a, button")) return; e.currentTarget.classList.toggle("is-flipped"); }} >
{/* FRONT */}
{ch.logo_url && ( )}
{ch.name}
kanał {ch.number}
{/* BACK */}
{ch.name}
Brak opisu kanału.", }} />
))}
)} )}
); }