import { packagesDetails } from "../../shared/packagesdetails.js"; import { mountBookingPage } from "../booking/booking-page.js"; import { formatMoney } from "../../shared/order-summary.js"; import { paymentNotice } from "../../shared/booking-copy.js"; document.addEventListener("DOMContentLoaded", () => { const container = document.getElementById("package-detail-container"); if (!container) return; const params = new URLSearchParams(window.location.search); const pkg = packagesDetails.find((item) => item.id === params.get("id")); const requestedVariant = params.get("variant"); const invalidVariant = requestedVariant && !pkg?.variants?.some( (variant) => variant.variantId === requestedVariant, ); if (!pkg || invalidVariant) { container.innerHTML = `

Paket nicht gefunden

Bitte wähle ein gültiges Paket und eine passende Variante aus.

Zur Übersicht
`; return; } document.title = `${pkg.type} – Tri-Hub Ernährungsberatung`; const variantsHtml = pkg.variants?.length ? `
` : ""; container.innerHTML = `
${pkg.type} · ${pkg.badge ? `${pkg.badge}` : ""}

${pkg.title}

${pkg.subtitle}

Für wen ist dieses Paket ideal?

    ${pkg.targetGroup.map((item) => `
  • ${item}
  • `).join("")}

Das ist im Paket enthalten

    ${pkg.includedFeatures.map((feature) => `
  • ${feature}
  • `).join("")}

So läuft deine Begleitung ab

${pkg.processSteps .map( (step) => `
${step.step}

${step.text}

`, ) .join("")}

Dein ${pkg.type.toLowerCase().replace(/^./, (letter) => letter.toUpperCase())}-Paket

inkl. ${pkg.taxRate} % MwSt. · ${pkg.billingInterval}

${variantsHtml}

`; container.querySelector("#booking-notice").textContent = paymentNotice; const variantSelect = container.querySelector("#variant-select"); if (variantSelect && requestedVariant) variantSelect.value = requestedVariant; const bookingBtn = container.querySelector("#proceed-to-booking-btn"); const bookingRoot = container.querySelector("#booking-root"); let cleanupBooking; let activeDialog; function prepareBooking() { cleanupBooking?.(); activeDialog = null; bookingBtn.disabled = true; bookingBtn.textContent = "Buchungsformular wird geladen …"; bookingBtn.setAttribute("aria-expanded", "false"); bookingBtn.removeAttribute("aria-controls"); const variant = pkg.variants?.find( (item) => item.variantId === variantSelect?.value, ); const duration = variant ? `${variant.durationWeeks} Wochen Begleitung` : pkg.durationLabel; container.querySelector("#displayed-price").textContent = formatMoney( variant?.price ?? pkg.price, pkg.currency, ); container.querySelector("#package-duration").textContent = duration; container.querySelector("#selected-duration").textContent = duration; cleanupBooking = mountBookingPage(bookingRoot, { packageId: pkg.id, variantId: variantSelect?.value, }); } // Booking lädt die Paketvorschau asynchron, auch bei einem erneuten Versuch. const observer = new MutationObserver(() => { const dialog = bookingRoot.querySelector(".booking__dialog"); if (!dialog || dialog === activeDialog) return; activeDialog = dialog; bookingBtn.disabled = false; bookingBtn.textContent = "Jetzt buchen"; bookingBtn.setAttribute("aria-controls", dialog.id); dialog.addEventListener("close", () => { bookingBtn.setAttribute("aria-expanded", "false"); bookingBtn.focus(); }); }); observer.observe(bookingRoot, { childList: true, subtree: true }); prepareBooking(); variantSelect?.addEventListener("change", prepareBooking); bookingBtn.addEventListener("click", () => { if (!activeDialog || activeDialog.open) return; activeDialog.showModal(); bookingBtn.setAttribute("aria-expanded", "true"); const result = activeDialog.querySelector( ".booking__result:not([hidden])", ); (result || activeDialog.querySelector('[name="name"]')).focus(); }); });