/* ============================================================
public/js/shop.js
Shop-Popup – Gems kaufen
============================================================ */
const shopOverlay = document.getElementById("shop-overlay");
const shopPopup = document.getElementById("shop-popup");
const shopClose = document.getElementById("shop-close");
const shopGrid = document.getElementById("shop-grid");
/* ════════════════════════════════════════════
Shop öffnen
════════════════════════════════════════════ */
export async function openShop() {
shopOverlay.classList.add("active");
shopPopup.classList.add("active");
await loadPackages();
}
/* ════════════════════════════════════════════
Shop schließen
════════════════════════════════════════════ */
function closeShop() {
shopOverlay.classList.remove("active");
shopPopup.classList.remove("active");
}
shopClose?.addEventListener("click", closeShop);
shopOverlay?.addEventListener("click", closeShop);
document.addEventListener("keydown", (e) => {
if (e.key === "Escape") closeShop();
});
/* ════════════════════════════════════════════
Pakete laden
════════════════════════════════════════════ */
async function loadPackages() {
shopGrid.innerHTML = `
Lade Angebote...
`;
try {
const res = await fetch("/api/shop/packages");
const pkgs = await res.json();
renderPackages(pkgs);
} catch {
shopGrid.innerHTML = `Fehler beim Laden.
`;
}
}
/* ════════════════════════════════════════════
Pakete rendern
════════════════════════════════════════════ */
function renderPackages(pkgs) {
shopGrid.innerHTML = pkgs.map(pkg => {
const total = pkg.gems + pkg.bonus;
const priceEur = (pkg.price / 100).toFixed(2).replace(".", ",");
const hasBonus = pkg.bonus > 0;
const perGem = (pkg.price / total).toFixed(1);
return `
${hasBonus ? `
+${pkg.bonus} Bonus!
` : ""}
💠
${pkg.name}
${total.toLocaleString("de-DE")}
Gems
${hasBonus ? `
${pkg.gems} + ${pkg.bonus} Bonus
` : ""}
~ ${perGem}¢ pro Gem
`;
}).join("");
shopGrid.querySelectorAll(".shop-buy-btn").forEach(btn => {
btn.addEventListener("click", () => checkout(btn.dataset.id, btn));
});
}
/* ════════════════════════════════════════════
Checkout starten
════════════════════════════════════════════ */
async function checkout(packageId, btn) {
btn.disabled = true;
btn.textContent = "Weiterleiten...";
try {
const res = await fetch("/api/shop/checkout", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ packageId }),
});
const data = await res.json();
if (!res.ok || !data.url) {
alert(data.error || "Fehler beim Starten der Zahlung.");
btn.disabled = false;
btn.textContent = getPrice(packageId);
return;
}
window.location.href = data.url;
} catch {
alert("Verbindungsfehler.");
btn.disabled = false;
btn.textContent = "Fehler";
}
}
function getPrice(id) {
const prices = {
starter: "1,99 €", abenteurer: "7,99 €",
ritter: "14,99 €", fuerst: "34,99 €", koenig: "59,99 €"
};
return prices[id] || "Kaufen";
}