diff --git a/src/content/internet-telewizja/section.yaml b/src/content/internet-telewizja/section.yaml index 20256fe..0710afb 100644 --- a/src/content/internet-telewizja/section.yaml +++ b/src/content/internet-telewizja/section.yaml @@ -1,4 +1,17 @@ sections: + - title: Pakiety tematyczne + image: + button: + text: "Poznaj ofertę pakietów tematycznych →" + url: "/internet-telewizja/pakiety-tematyczne" + title: "Poznaj ofertę pakietów tematycznych" + content: | + Dolore no invidunt ipsum justo. Et et dolor gubergren ipsum. + Ipsum luptatum magna dolore nonumy tempor stet volutpat ut nobis nonumy invidunt labore autem consequat nulla dolor amet vel. + Doming ea dolor lorem justo sed velit takimata nobis clita ad ipsum. Sed esse erat est at ipsum dolore ut sadipscing diam voluptua sea ut. + Dolores ad eos invidunt ut blandit tempor lorem sed est ipsum elit eos diam erat sed amet. Voluptua voluptua ea amet duis molestie tempor amet aliquyam et takimata stet ea accusam soluta eum aliquyam diam accumsan. Labore odio et sed ut possim takimata nonumy sadipscing feugiat option facilisi invidunt vulputate sadipscing accusam. Facilisis diam clita dolor sed eirmod dolor dolor. Diam no kasd laoreet blandit gubergren. + Aliquyam ea nulla euismod sanctus sed eirmod exerci invidunt dolores nonumy. + - title: "Dekoder Arris 4302 HD" image: "arris4302.webp" button: diff --git a/src/content/internet-telewizja/tv-addons.yaml b/src/content/internet-telewizja/tv-addons.yaml index ae262cb..00e5fb2 100644 --- a/src/content/internet-telewizja/tv-addons.yaml +++ b/src/content/internet-telewizja/tv-addons.yaml @@ -1,120 +1,204 @@ tytul: Dodatkowe pakiety TV -opis: "Rozszerz ofertę telewizyjną o dodatkowe pakiety." -cena_opis: "zł/mies." +opis: | + Rozszerz ofertę telewizyjną o dodatkowe pakiety. + Lorem ipsum dolor sit amet nulla. Elitr eum sanctus diam rebum accusam est ex. + Hendrerit erat commodo lorem gubergren vulputate dolor labore amet eros justo lorem no sea. + Facer mazim eos nonumy rebum dolor euismod. Sed est in sed odio. Vero illum vero aliquyam nonumy duis. + Labore et rebum elitr amet sanctus in aliquyam dignissim lorem accusam et rebum tempor kasd. + +cena_opis: zł/mies. dodatki: - id: canal_seriale_filmy - nazwa: "Canal+ Seriale i Filmy" + nazwa: CANAL+ Seriale i Filmy + tid: 49 typ: checkbox - opis: "Pakiet filmowo-serialowy Canal+." + opis: Pakiet filmowo-serialowy Canal+. cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty 12m: 24.99 bezterminowo: 28.99 - - id: canal_super_sport - nazwa: "Canal+ Super Sport" + nazwa: CANAL+ Super Sport typ: checkbox - opis: "Pakiet sportowy Canal+." + opis: Pakiet sportowy Canal+. cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty 12m: 64.99 bezterminowo: 68.99 - + tid: 48 - id: cinemax - nazwa: "Cinemax" + nazwa: Cinemax typ: checkbox - opis: "Kanały Cinemax." + opis: Kanały Cinemax. cena: - # SGT (PLUS): 10 / 15 - - pakiety: [Podstawowy, Korzystny, Bogaty] - 12m: 10.00 - bezterminowo: 15.00 - # EVIO: jedna cena 14.90 - - pakiety: [Smart, Optimum, Platinum] - # 12m: 14.90 - bezterminowo: 14.90 - + - pakiety: + - Podstawowy + - Korzystny + - Bogaty + 12m: 10 + bezterminowo: 15 + - pakiety: + - Smart + - Optimum + - Platinum + bezterminowo: 14.9 + tid: 18 - id: eleven - nazwa: "Eleven" + nazwa: Eleven typ: checkbox - opis: "Kanały Eleven Sports." + opis: Kanały Eleven Sports. cena: - - pakiety: [Podstawowy, Korzystny, Bogaty] - 12m: 15.00 - bezterminowo: 25.00 - + - pakiety: + - Podstawowy + - Korzystny + - Bogaty + 12m: 15 + bezterminowo: 25 + tid: 61 - id: filmbox - nazwa: "Filmbox" + nazwa: FilmBox+ typ: checkbox - opis: "Kanały FilmBox." + opis: Kanały FilmBox. cena: - - pakiety: [Podstawowy, Korzystny, Bogaty] - 12m: 10.00 - bezterminowo: 15.00 - + - pakiety: + - Podstawowy + - Korzystny + - Bogaty + 12m: 10 + bezterminowo: 15 + tid: 19 - id: hbo_max_podstawowy - nazwa: "HBO + Max Podstawowy" + nazwa: HBO + Max Podstawowy typ: checkbox opis: | W ramach Pakietu Podstawowego HBO Max możesz oglądać filmy i seriale w jakości FullHD na dwóch urządzeniach jednocześnie. Pakiet Podstawowy HBO Max to również dostęp do bogatej Biblioteki TVN oraz możliwość śledzenia kanału live TVN. Treści dostępne w Pakiecie Podstawowym wyświetlane są wraz z reklamami. cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty 12m: 27.99 bezterminowo: 29.99 - + tid: 20 - id: hbo_max_standardowy - nazwa: "HBO + Max Standardowy" + nazwa: HBO + Max Standardowy typ: checkbox - opis: "HBO + Max (wariant standardowy)." + opis: HBO + Max (wariant standardowy). cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty 12m: 36.99 bezterminowo: 39.99 - + tid: 96 - id: hbo_max_premium - nazwa: "HBO + Max Premium" + nazwa: HBO + Max Premium typ: checkbox - opis: "HBO + Max (wariant premium)." + opis: HBO + Max (wariant premium). cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty 12m: 44.99 bezterminowo: 49.99 - + tid: 97 - id: wiecej_sportu_plus - nazwa: "Więcej Sportu Plus" + nazwa: Więcej Sportu Plus typ: checkbox - opis: "Dodatkowy pakiet sportowy." + opis: Dodatkowy pakiet sportowy. cena: - - pakiety: [Podstawowy, Korzystny, Bogaty] - 12m: 15.00 - bezterminowo: 25.00 - + - pakiety: + - Podstawowy + - Korzystny + - Bogaty + 12m: 15 + bezterminowo: 25 + tid: 79 - id: wiecej_erotyki - nazwa: "Więcej Erotyki" + nazwa: Więcej Erotyki typ: checkbox - opis: "Pakiet kanałów erotycznych." + opis: Pakiet kanałów erotycznych. cena: - - pakiety: [Podstawowy, Korzystny, Bogaty] - 12m: 15.00 - bezterminowo: 25.00 - + - pakiety: + - Podstawowy + - Korzystny + - Bogaty + 12m: 15 + bezterminowo: 25 + tid: 80 - id: disney_standard - nazwa: "Disney+ Standard" + nazwa: Disney+ Standard typ: checkbox opis: | - Odkryj hity filmowe, nowe seriale i produkcje oryginalne ze świata Disneya, Pixara, Gwiezdnych wojen, Marvela, a także produkcje Hulu, National Geographic i FX - cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] - bezterminowo: 34.99 + Historie na całe życie czekają. Odkryj hity filmowe, nowe seriale i produkcje oryginalne ze świata Disneya, Pixara, Gwiezdnych wojen, Marvela, a także produkcje Hulu, National Geographic i FX. + Oglądaj, kiedy chcesz. + Ochrona rodzicielska - Zadbaj o bezpieczeństwo dzięki intuicyjnej kontroli rodzicielskiej. treściami + Jednoczesne oglądanie - Oglądaj na czterech ekranach jednocześnie, na obsługiwanych urządzeniach. + Rozrywka bez granic - Tysiące godzin seriali, filmów i produkcji oryginalnych. + Wygodne oglądanie - Możliwość oglądania jak chcesz, kiedy chcesz. + + - Oglądaj na 2 urządzeniach jednocześnie + - Full HD + - Bez reklam + - Pobieranie offline + cena: + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty + bezterminowo: 34.99 - id: disney_premium - nazwa: "Disney+ Premium" + nazwa: Disney+ Premium typ: checkbox opis: | - Odkryj hity filmowe, nowe seriale i produkcje oryginalne ze świata Disneya, Pixara, Gwiezdnych wojen, Marvela, a także produkcje Hulu, National Geographic i FX + Historie na całe życie czekają. Odkryj hity filmowe, nowe seriale i produkcje oryginalne ze świata Disneya, Pixara, Gwiezdnych wojen, Marvela, a także produkcje Hulu, National Geographic i FX. + Oglądaj, kiedy chcesz. + + Ochrona rodzicielska - Zadbaj o bezpieczeństwo dzięki intuicyjnej kontroli rodzicielskiej. treściami + Jednoczesne oglądanie - Oglądaj na czterech ekranach jednocześnie, na obsługiwanych urządzeniach. + Rozrywka bez granic - Tysiące godzin seriali, filmów i produkcji oryginalnych. + Wygodne oglądanie - Możliwość oglądania jak chcesz, kiedy chcesz. + + - Oglądaj na 4 urządzeniach jednocześnie + - 4K UHD / HDR / Dolby Atmos* + - Bez reklam + - Pobieranie offline cena: - - pakiety: [Smart, Optimum, Platinum, Podstawowy, Korzystny, Bogaty] - bezterminowo: 59.99 \ No newline at end of file + - pakiety: + - Smart + - Optimum + - Platinum + - Podstawowy + - Korzystny + - Bogaty + bezterminowo: 59.99 diff --git a/src/data/ServicesRange.db b/src/data/ServicesRange.db index da07d75..d8a9b8e 100644 Binary files a/src/data/ServicesRange.db and b/src/data/ServicesRange.db differ diff --git a/src/data/ServicesRange.db-shm b/src/data/ServicesRange.db-shm index fe9ac28..0bf83d6 100644 Binary files a/src/data/ServicesRange.db-shm and b/src/data/ServicesRange.db-shm differ diff --git a/src/data/ServicesRange.db-wal b/src/data/ServicesRange.db-wal index e69de29..b851cab 100644 Binary files a/src/data/ServicesRange.db-wal and b/src/data/ServicesRange.db-wal differ diff --git a/src/islands/jambox/AddonChannelsModal.jsx b/src/islands/jambox/AddonChannelsModal.jsx new file mode 100644 index 0000000..33f1254 --- /dev/null +++ b/src/islands/jambox/AddonChannelsModal.jsx @@ -0,0 +1,111 @@ +import { useEffect, useMemo, useState } from "preact/hooks"; + +function cleanPkgName(v) { + const s = String(v || "").trim(); + if (!s) return null; + if (s.length > 64) return null; + return s; +} + +function getNearestSectionEl(el) { + return el?.closest?.("[data-addon-section]") ?? null; +} + +export default function AddonChannelsGrid(props) { + const packageName = cleanPkgName(props?.packageName); + const fallbackImage = String(props?.fallbackImage || "").trim(); + const title = String(props?.title || "").trim(); + const aboveFold = props?.aboveFold === true; + + const [loading, setLoading] = useState(false); + const [err, setErr] = useState(""); + const [items, setItems] = useState([]); + + const rootRef = useMemo(() => ({ current: null }), []); + + const channelsWithLogo = useMemo(() => { + return (items || []).filter((x) => String(x?.logo_url || "").trim()); + }, [items]); + + async function load() { + if (!packageName) return; + setLoading(true); + setErr(""); + try { + const url = `/api/jambox/jambox-channels-package?package=${encodeURIComponent( + packageName, + )}`; + const res = await fetch(url); + const json = await res.json().catch(() => null); + if (!res.ok || !json?.ok) throw new Error(json?.error || "FETCH_ERROR"); + setItems(Array.isArray(json.data) ? json.data : []); + } catch (e) { + setErr(String(e?.message || e)); + setItems([]); + } finally { + setLoading(false); + } + } + + useEffect(() => { + load(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [packageName]); + + useEffect(() => { + const el = rootRef.current; + const section = getNearestSectionEl(el); + if (!section) return; + + const hasIcons = channelsWithLogo.length > 0; + const hasFallback = !!fallbackImage; + const hasMedia = hasIcons || hasFallback; + + section.setAttribute("data-has-media", hasMedia ? "1" : "0"); + }, [channelsWithLogo.length, fallbackImage]); + + const hasIcons = channelsWithLogo.length > 0; + const visible = hasIcons ? channelsWithLogo.slice(0, 60) : []; + + return ( +