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 (
); }