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" },
|
{ 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 = `
|
body.innerHTML = `
|
||||||
<div class="events-grid" id="events-grid">
|
<div class="events-grid" id="events-grid">
|
||||||
${events.map(ev => `
|
${events.map(ev => {
|
||||||
<div class="event-card" data-event-id="${ev.id}" data-type="${ev.type || ''}">
|
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">
|
<div class="event-card-img-wrap">
|
||||||
<img src="${ev.img}" alt="${ev.label}" draggable="false">
|
<img src="${ev.img}" alt="${ev.label}" draggable="false">
|
||||||
|
${done ? `<div class="event-done-overlay">✓</div>` : ''}
|
||||||
</div>
|
</div>
|
||||||
<span class="event-card-label">${ev.label}</span>
|
<span class="event-card-label">${ev.label}</span>
|
||||||
</div>`).join("")}
|
${done ? `<span class="event-done-label">Bereits erledigt</span>` : ''}
|
||||||
|
</div>`;
|
||||||
|
}).join("")}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Booster UI -->
|
<!-- Booster UI -->
|
||||||
@ -109,6 +126,9 @@ export async function loadEvents() {
|
|||||||
/* ── Event-Karten ── */
|
/* ── Event-Karten ── */
|
||||||
body.querySelectorAll(".event-card").forEach(card => {
|
body.querySelectorAll(".event-card").forEach(card => {
|
||||||
card.addEventListener("click", () => {
|
card.addEventListener("click", () => {
|
||||||
|
// Bereits erledigt → nicht anklickbar
|
||||||
|
if (card.dataset.done === "true") return;
|
||||||
|
|
||||||
if (card.dataset.type === "booster") {
|
if (card.dataset.type === "booster") {
|
||||||
eventsGrid.style.display = "none";
|
eventsGrid.style.display = "none";
|
||||||
boosterUi.style.display = "flex";
|
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"));
|
body.querySelector("#edp-close-btn").addEventListener("click", () => overlay.classList.remove("active"));
|
||||||
overlay.addEventListener("click", e => { if (e.target === overlay) 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);
|
console.error("Karten speichern fehlgeschlagen", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Booster-Daily als erledigt markieren (event_id = 1)
|
||||||
|
await markDailyComplete(1);
|
||||||
|
|
||||||
allRevealed = true;
|
allRevealed = true;
|
||||||
window.__boosterLocked = false; // äußere Modals wieder freigeben
|
window.__boosterLocked = false; // äußere Modals wieder freigeben
|
||||||
body.querySelector("#booster-hint").textContent = "Alle Karten erhalten! ✓";
|
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