${escapeHtml(primaryMovie?.title || "Bestellung")}
-Datum${escapeHtml(order.date || "-")}
-Saal${escapeHtml(hall)}
-Uhrzeit${escapeHtml(time)}
-Tickets${ticketCount}x
-Sitze${escapeHtml(seats)}
-Gesamt${formatEuro(order.total || 0)}
-diff --git a/.gitignore b/.gitignore index a5c0072..d26c746 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -img/* \ No newline at end of file +node_modules +dist/ \ No newline at end of file diff --git a/account.js b/account.js deleted file mode 100644 index 06f44a1..0000000 --- a/account.js +++ /dev/null @@ -1,460 +0,0 @@ -function readStorageJson(key, fallbackValue) { - const raw = localStorage.getItem(key); - - if (!raw || raw === "undefined" || raw === "null") { - return fallbackValue; - } - - try { - return JSON.parse(raw); - } catch (error) { - console.warn(`Konnte LocalStorage-Wert fuer ${key} nicht lesen.`, error); - return fallbackValue; - } -} - -function normalizeUser(user) { - if (!user || typeof user !== "object") { - return null; - } - - return { - firstName: user.firstName || "", - lastName: user.lastName || "", - email: user.email || "", - hashedPassword: user.hashedPassword || "", - orders: Array.isArray(user.orders) ? user.orders : [], - paymentMethods: Array.isArray(user.paymentMethods) ? user.paymentMethods : [] - }; -} - -function escapeHtml(value) { - return String(value || "") - .replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll('"', """) - .replaceAll("'", "'"); -} - -function formatEuro(value) { - return `${Number(value || 0).toFixed(2).replace(".", ",")} EUR`; -} - -function persistUsers() { - localStorage.setItem("eagleUsers", JSON.stringify(users)); -} - -function persistCurrentUser() { - if (currentUser) { - localStorage.setItem("currentUser", JSON.stringify(currentUser)); - } else { - localStorage.removeItem("currentUser"); - } -} - -let users = readStorageJson("eagleUsers", []); -if (!Array.isArray(users)) { - users = []; -} -users = users.map(normalizeUser).filter(Boolean); - -let currentUser = normalizeUser(readStorageJson("currentUser", null)); -if (currentUser && currentUser.email) { - const storedMatch = users.find((user) => user.email === currentUser.email); - if (storedMatch) { - currentUser = storedMatch; - } else { - users.push(currentUser); - persistUsers(); - } -} - -async function hashMessage(message) { - const msgBuffer = new TextEncoder().encode(message); // Encode as UTF-8 - const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); // Hash - const hashArray = Array.from(new Uint8Array(hashBuffer)); // Convert to bytes - return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // Hex string -} - -async function registerUser() { - const firstName = document.getElementById("reg-firstname")?.value.trim() || ""; - const lastName = document.getElementById("reg-lastname")?.value.trim() || ""; - const email = (document.getElementById("reg-email")?.value.trim() || "").toLowerCase(); - const password = document.getElementById("reg-password")?.value || ""; - - if (!firstName || !lastName || !email || !password) { - alert("Bitte fuelle alle Felder aus."); - return; - } - - if (!email.includes("@")) { - alert("Bitte gib eine gueltige E-Mail-Adresse ein."); - return; - } - - const existingUser = users.find((user) => user.email.toLowerCase() === email); - if (existingUser) { - alert("E-Mail bereits registriert"); - return; - } - - const hashedPassword = await hashMessage(password); - - const newUser = { - firstName, - lastName, - email, - hashedPassword, - orders: [], - paymentMethods: [] - }; - - users.push(newUser); - currentUser = newUser; - - persistUsers(); - persistCurrentUser(); - - alert("Registrierung erfolgreich"); - document.getElementById("register-modal")?.classList.add("hidden"); - - openAccountDashboard(); -} - -async function loginUser() { - const email = (document.getElementById("login-email")?.value.trim() || "").toLowerCase(); - const password = document.getElementById("login-password")?.value || ""; - const hashedPassword = await hashMessage(password); - - const user = users.find( - (entry) => entry.email.toLowerCase() === email && entry.hashedPassword === hashedPassword - ); - - if (!user) { - document.getElementById("login-error")?.classList.remove("hidden"); - return; - } - - currentUser = user; - persistCurrentUser(); - openAccountDashboard(); -} - -function openAccountDashboard() { - const accountView = document.getElementById("account-view"); - if (!accountView) { - return; - } - - if (!currentUser) { - accountView.innerHTML = "
Bitte melde dich an oder registriere dich.
Vorname: ${currentUser.firstName || "-"}
-Nachname: ${currentUser.lastName || "-"}
-E-Mail: ${currentUser.email || "-"}
-Noch keine Bestellungen vorhanden.
-Klicke auf eine Bestellung, um dein Ticket-Detail zu sehen.
-Datum${escapeHtml(order.date || "-")}
-Saal${escapeHtml(hall)}
-Uhrzeit${escapeHtml(time)}
-Tickets${ticketCount}x
-Sitze${escapeHtml(seats)}
-Gesamt${formatEuro(order.total || 0)}
-Platzhalter zum Hinterlegen deiner Logos oder Anbieter-Informationen.
-Dein Warenkorb ist leer.
'; - totalEl.innerText = formatEuro(0); - vatEl.innerText = `inkl. 19% MwSt: ${formatEuro(0)}`; - return; - } - - const groupedItems = groupCartItems(); - - const header = /*html*/` -Danke fuer deinen Einkauf!
"; - return; - } - - const mainMovie = moviesInCart[0]; - const matchingMovieSeats = moviesInCart - .filter((item) => item.title === mainMovie.title && item.time === mainMovie.time) - .map((item) => item.seatId) - .join(", "); - - const qrData = encodeURIComponent(`EAGLE-IMAX|${mainMovie.title}|${mainMovie.hall}|${matchingMovieSeats}`); - const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${qrData}&bgcolor=ffffff`; - - ticketContainer.innerHTML = /*html*/` -SAAL ${mainMovie.hall}
-ZEIT ${mainMovie.time} Uhr
-SITZE ${matchingMovieSeats || "-"}
-${escapeHtml(movie.description)}
- -