import { useEffect, useState } from "preact/hooks"; import "../../styles/modal.css"; import "../../styles/offers/offers-table.css"; export default function InternetAddonsModal({ isOpen, onClose, plan }) { const [phonePlans, setPhonePlans] = useState([]); const [addons, setAddons] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const [selectedPhoneId, setSelectedPhoneId] = useState(null); const [selectedAddons, setSelectedAddons] = useState([]); // który pakiet telefoniczny jest rozwinięty const [openPhoneId, setOpenPhoneId] = useState(null); // czy akordeon internetu (fiber) jest rozwinięty const [baseOpen, setBaseOpen] = useState(true); const formatFeatureValue = (val) => { if (val === true || val === "true") return "✓"; if (val === false || val === "false" || val == null) return "✕"; return val; }; const handlePhoneSelect = (id) => { if (id === null) { setSelectedPhoneId(null); setOpenPhoneId(null); return; } setSelectedPhoneId(id); setOpenPhoneId((prev) => (prev === id ? null : id)); }; // reset wyborów po otwarciu nowego planu useEffect(() => { if (!isOpen) return; setSelectedPhoneId(null); setSelectedAddons([]); setOpenPhoneId(null); setBaseOpen(true); }, [isOpen, plan]); // ładowanie danych useEffect(() => { if (!isOpen) return; let cancelled = false; async function loadData() { setLoading(true); setError(""); try { // telefon const phoneRes = await fetch("/api/phone/plans"); if (!phoneRes.ok) throw new Error(`HTTP ${phoneRes.status} (phone)`); const phoneJson = await phoneRes.json(); const phoneData = Array.isArray(phoneJson.data) ? phoneJson.data : []; // dodatki const addonsRes = await fetch("/api/internet/addons"); if (!addonsRes.ok) throw new Error(`HTTP ${addonsRes.status} (addons)`); const addonsJson = await addonsRes.json(); const addonsData = Array.isArray(addonsJson.data) ? addonsJson.data : []; if (!cancelled) { setPhonePlans(phoneData); setAddons(addonsData); } } catch (err) { console.error("❌ Błąd ładowania danych do InternetAddonsModal:", err); if (!cancelled) { setError("Nie udało się załadować danych dodatkowych usług."); } } finally { if (!cancelled) setLoading(false); } } loadData(); return () => { cancelled = true; }; }, [isOpen]); if (!isOpen || !plan) return null; const basePrice = plan.price_monthly || 0; const phonePrice = (() => { if (!selectedPhoneId) return 0; const p = phonePlans.find((p) => p.id === selectedPhoneId); return p?.price_monthly || 0; })(); const addonsPrice = selectedAddons.reduce((sum, sel) => { const addon = addons.find((a) => a.id === sel.addonId); if (!addon) return sum; const opt = addon.options.find((o) => o.id === sel.optionId); if (!opt) return sum; return sum + (opt.price || 0); }, 0); const totalMonthly = basePrice + phonePrice + addonsPrice; const handleAddonToggle = (addonId, optionId) => { setSelectedAddons((prev) => { const exists = prev.some( (x) => x.addonId === addonId && x.optionId === optionId ); if (exists) { return prev.filter( (x) => !(x.addonId === addonId && x.optionId === optionId) ); } else { return [...prev, { addonId, optionId }]; } }); }; const togglePhoneOpen = (id) => { setOpenPhoneId((prev) => (prev === id ? null : id)); }; return (
e.stopPropagation()} >

Konfiguracja usług dodatkowych

{/* INTERNET (fiber) jako akordeon */}
{baseOpen && plan.features && plan.features.length > 0 && (
    {plan.features.map((f, idx) => (
  • {f.label} {formatFeatureValue(f.value)}
  • ))}
)}
{loading &&

Ładowanie danych...

} {error &&

{error}

} {!loading && !error && ( <> {/* Sekcja: wybór telefonu (akordeon + opcja bez telefonu) */}

Usługa telefoniczna

{phonePlans.length === 0 ? (

Brak dostępnych pakietów telefonicznych.

) : (
{/* OPCJA: brak telefonu */}
{/* LISTA PAKIETÓW TELEFONICZNYCH */} {phonePlans.map((p) => { const isSelected = selectedPhoneId === p.id; const isOpen = openPhoneId === p.id; return (
{isOpen && (
{p.features && p.features.length > 0 && (
    {p.features .filter( (f) => !String( f.label || "" ) .toLowerCase() .includes("aktyw") ) .map((f, idx) => (
  • {f.label} {f.value}
  • ))}
)}
)}
); })}
)}
{/* Sekcja: dodatki internetowe */}

Dodatkowe usługi

{addons.length === 0 ? (

Brak dodatkowych usług.

) : (
{addons.map((addon) => addon.options.map((opt) => { const checked = selectedAddons.some( (x) => x.addonId === addon.id && x.optionId === opt.id ); return ( ); }) )}
)}
{/* Podsumowanie */}

Podsumowanie miesięczne

Internet {basePrice.toFixed(2)} zł/mies.
Telefon {phonePrice ? `${phonePrice.toFixed(2)} zł/mies.` : "—"}
Dodatki {addonsPrice ? `${addonsPrice.toFixed(2)} zł/mies.` : "—"}
Łącznie {totalMonthly.toFixed(2)} zł/mies.
)}
); }