diff --git a/public/js/quickmenu/events.js b/public/js/quickmenu/events.js index 4711992..b71c7ca 100644 --- a/public/js/quickmenu/events.js +++ b/public/js/quickmenu/events.js @@ -58,15 +58,32 @@ export async function loadEvents() { { id: 5, img: "/images/items/runenhaufen.png", label: "Textzeile 5" }, ]; + // Täglichen Status vom Server laden + let completedToday = []; + try { + const statusRes = await fetch("/api/daily/status"); + if (statusRes.ok) { + const statusData = await statusRes.json(); + completedToday = statusData.completed || []; + } + } catch (e) { + console.error("Daily-Status laden fehlgeschlagen", e); + } + body.innerHTML = `
- ${events.map(ev => ` -
+ ${events.map(ev => { + const done = completedToday.includes(ev.id); + return ` +
${ev.label} + ${done ? `
` : ''}
${ev.label} -
`).join("")} + ${done ? `Bereits erledigt` : ''} +
`; + }).join("")}
@@ -109,6 +126,9 @@ export async function loadEvents() { /* ── Event-Karten ── */ body.querySelectorAll(".event-card").forEach(card => { card.addEventListener("click", () => { + // Bereits erledigt → nicht anklickbar + if (card.dataset.done === "true") return; + if (card.dataset.type === "booster") { eventsGrid.style.display = "none"; boosterUi.style.display = "flex"; @@ -126,6 +146,32 @@ export async function loadEvents() { }); }); + /* ── Daily als erledigt markieren (für nicht-Booster Events) ── */ + async function markDailyComplete(eventId) { + try { + await fetch("/api/daily/complete", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ eventId }), + }); + // Karte visuell als erledigt markieren + const card = body.querySelector(`.event-card[data-event-id="${eventId}"]`); + if (card) { + card.dataset.done = "true"; + card.classList.add("event-done"); + const wrap = card.querySelector(".event-card-img-wrap"); + if (wrap && !wrap.querySelector(".event-done-overlay")) { + wrap.insertAdjacentHTML("beforeend", `
`); + } + if (!card.querySelector(".event-done-label")) { + card.insertAdjacentHTML("beforeend", `Bereits erledigt`); + } + } + } catch (e) { + console.error("Daily markieren fehlgeschlagen", e); + } + } + body.querySelector("#edp-close-btn").addEventListener("click", () => overlay.classList.remove("active")); overlay.addEventListener("click", e => { if (e.target === overlay) overlay.classList.remove("active"); }); @@ -294,6 +340,9 @@ export async function loadEvents() { console.error("Karten speichern fehlgeschlagen", e); } + // Booster-Daily als erledigt markieren (event_id = 1) + await markDailyComplete(1); + allRevealed = true; window.__boosterLocked = false; // äußere Modals wieder freigeben body.querySelector("#booster-hint").textContent = "Alle Karten erhalten! ✓"; diff --git a/routes/daily.js b/routes/daily.js new file mode 100644 index 0000000..b06b43a --- /dev/null +++ b/routes/daily.js @@ -0,0 +1,63 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../database/database"); + +/* ================================ + GET /api/daily/status + Gibt zurück welche Events der User heute schon erledigt hat + Response: { completed: [1, 3] } ← Array der erledigten event_ids +================================ */ +router.get("/daily/status", async (req, res) => { + if (!req.session?.user) return res.status(401).json({ error: "Nicht eingeloggt" }); + + const userId = req.session.user.id; + try { + const [rows] = await db.query( + "SELECT event_id FROM daily_completions WHERE user_id = ?", + [userId] + ); + res.json({ completed: rows.map(r => r.event_id) }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "DB Fehler" }); + } +}); + +/* ================================ + POST /api/daily/complete + Markiert ein Daily als erledigt + Body: { eventId: 1 } + Response: { success: true } oder { error: "bereits erledigt" } +================================ */ +router.post("/daily/complete", async (req, res) => { + if (!req.session?.user) return res.status(401).json({ error: "Nicht eingeloggt" }); + + const userId = req.session.user.id; + const eventId = req.body?.eventId; + + if (!eventId) return res.status(400).json({ error: "eventId fehlt" }); + + try { + // Prüfen ob heute schon erledigt + const [[existing]] = await db.query( + "SELECT id FROM daily_completions WHERE user_id = ? AND event_id = ?", + [userId, eventId] + ); + + if (existing) { + return res.status(409).json({ error: "bereits erledigt" }); + } + + await db.query( + "INSERT INTO daily_completions (user_id, event_id) VALUES (?, ?)", + [userId, eventId] + ); + + res.json({ success: true }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "DB Fehler" }); + } +}); + +module.exports = router;