This commit is contained in:
cay 2026-04-06 17:45:18 +01:00
parent e2fb43139f
commit dcff0e7f59
2 changed files with 115 additions and 3 deletions

View File

@ -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 = `
<div class="events-grid" id="events-grid">
${events.map(ev => `
<div class="event-card" data-event-id="${ev.id}" data-type="${ev.type || ''}">
${events.map(ev => {
const done = completedToday.includes(ev.id);
return `
<div class="event-card${done ? ' event-done' : ''}" data-event-id="${ev.id}" data-type="${ev.type || ''}" data-done="${done}">
<div class="event-card-img-wrap">
<img src="${ev.img}" alt="${ev.label}" draggable="false">
${done ? `<div class="event-done-overlay">✓</div>` : ''}
</div>
<span class="event-card-label">${ev.label}</span>
</div>`).join("")}
${done ? `<span class="event-done-label">Bereits erledigt</span>` : ''}
</div>`;
}).join("")}
</div>
<!-- Booster UI -->
@ -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", `<div class="event-done-overlay">✓</div>`);
}
if (!card.querySelector(".event-done-label")) {
card.insertAdjacentHTML("beforeend", `<span class="event-done-label">Bereits erledigt</span>`);
}
}
} 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! ✓";

63
routes/daily.js Normal file
View File

@ -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;