dyfhnbyd
This commit is contained in:
parent
e2fb43139f
commit
dcff0e7f59
@ -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
63
routes/daily.js
Normal 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;
|
||||
Loading…
Reference in New Issue
Block a user