lorem_ipsum/js/login.js
2026-04-01 16:30:23 +02:00

289 lines
8.5 KiB
JavaScript

(function () {
const AUTH_STORAGE_KEY = "loremIpsumAuth";
function readAuth() {
const raw = localStorage.getItem(AUTH_STORAGE_KEY);
if (!raw) {
return null;
}
try {
const parsed = JSON.parse(raw);
if (!parsed.username || !parsed.password) {
return null;
}
return parsed;
} catch {
return null;
}
}
function saveAuth(username, password) {
localStorage.setItem(
AUTH_STORAGE_KEY,
JSON.stringify({ username: username, password: password }),
);
}
function clearAuth() {
localStorage.removeItem(AUTH_STORAGE_KEY);
}
function updateHeaderUsername() {
const usernameDisplay = document.getElementById("username-display");
const navbarLogin = document.getElementById("navbar-login");
const auth = readAuth();
if (usernameDisplay) {
usernameDisplay.textContent = auth ? "User: " + auth.username : "User: Guest";
}
if (navbarLogin) {
navbarLogin.textContent = auth ? auth.username : "Login / Registrieren";
}
}
function setFeedback(message, type) {
const feedback = document.getElementById("auth-feedback");
if (!feedback) {
return;
}
feedback.className = "alert alert-" + type;
feedback.textContent = message;
feedback.classList.remove("d-none");
}
function updateSessionBox() {
const sessionText = document.getElementById("current-session-text");
const logoutButton = document.getElementById("logout-button");
const deleteAccountButton = document.getElementById("delete-account-button");
const currentSessionBox = document.getElementById("current-session-box");
const authFormsRow = document.getElementById("auth-forms-row");
if (!sessionText || !logoutButton || !deleteAccountButton || !currentSessionBox || !authFormsRow) {
return;
}
const auth = readAuth();
if (auth) {
sessionText.textContent = "Eingeloggt als " + auth.username + ".";
logoutButton.disabled = false;
deleteAccountButton.disabled = false;
currentSessionBox.classList.remove("d-none");
authFormsRow.classList.add("d-none");
} else {
sessionText.textContent = "Nicht eingeloggt.";
logoutButton.disabled = true;
deleteAccountButton.disabled = true;
currentSessionBox.classList.add("d-none");
authFormsRow.classList.remove("d-none");
}
}
function getUserService() {
if (!window.config || !window.UserService) {
return null;
}
return new window.UserService(window.config);
}
async function handleLoginSubmit(event) {
event.preventDefault();
const userService = getUserService();
if (!userService) {
setFeedback("User-Service konnte nicht geladen werden.", "danger");
return;
}
const usernameInput = document.getElementById("login-username");
const passwordInput = document.getElementById("login-password");
const username = usernameInput.value.trim();
const password = passwordInput.value.trim();
if (!username || !password) {
setFeedback("Bitte Username und Passwort eingeben.", "warning");
return;
}
const result = await userService.getUser(username, password);
if (result.ok) {
saveAuth(username, password);
setFeedback("Login erfolgreich.", "success");
updateSessionBox();
updateHeaderUsername();
setTimeout(function() {
if (typeof window.loadPage === "function") {
window.loadPage("home", "nav-home");
}
}, 500);
return;
}
if (result.status === 401) {
setFeedback("Login fehlgeschlagen: Username oder Passwort ist falsch.", "danger");
return;
}
setFeedback("Login fehlgeschlagen (Status " + result.status + ").", "danger");
}
async function handleRegisterSubmit(event) {
event.preventDefault();
const userService = getUserService();
if (!userService) {
setFeedback("User-Service konnte nicht geladen werden.", "danger");
return;
}
const usernameInput = document.getElementById("register-username");
const username = usernameInput.value.trim();
if (!username) {
setFeedback("Bitte einen Username eingeben.", "warning");
return;
}
const result = await userService.postUser(username);
if (result.ok && result.body) {
const createdName = result.body.name || username;
const createdPassword = result.body.password || "";
saveAuth(createdName, createdPassword);
updateSessionBox();
updateHeaderUsername();
// Modal mit Daten füllen und anzeigen
const modalUsername = document.getElementById("modal-username");
const modalPassword = document.getElementById("modal-password");
if (modalUsername) modalUsername.textContent = createdName;
if (modalPassword) modalPassword.textContent = createdPassword;
const passwordModalElement = document.getElementById("password-modal");
if (passwordModalElement) {
const passwordModal = new window.bootstrap.Modal(passwordModalElement);
// Listener für Modals-Schließen: zur Startseite navigieren
passwordModalElement.addEventListener("hidden.bs.modal", function handleClose() {
if (typeof window.loadPage === "function") {
window.loadPage("home", "nav-home");
}
passwordModalElement.removeEventListener("hidden.bs.modal", handleClose);
});
passwordModal.show();
} else {
// Fallback wenn Modal nicht gefunden
setFeedback(
"Account erstellt. Username: " + createdName + ", Passwort: " + createdPassword,
"success",
);
setTimeout(function() {
if (typeof window.loadPage === "function") {
window.loadPage("home", "nav-home");
}
}, 1500);
}
const loginUsernameInput = document.getElementById("login-username");
const loginPasswordInput = document.getElementById("login-password");
if (loginUsernameInput && loginPasswordInput) {
loginUsernameInput.value = createdName;
loginPasswordInput.value = createdPassword;
}
return;
}
if (result.status === 400) {
const errorMessage = result.body && result.body.message
? result.body.message
: "Dieser Username existiert bereits.";
setFeedback(errorMessage, "danger");
return;
}
setFeedback(
"Account konnte nicht erstellt werden (Status " + result.status + ").",
"danger",
);
}
function handleLogout() {
clearAuth();
setFeedback("Du wurdest ausgeloggt.", "info");
updateSessionBox();
updateHeaderUsername();
}
async function handleDeleteAccount() {
const auth = readAuth();
if (!auth) {
setFeedback("Du bist nicht eingeloggt.", "warning");
return;
}
const wantsDelete = window.confirm(
"Möchtest du den Account \"" + auth.username + "\" wirklich löschen?",
);
if (!wantsDelete) {
return;
}
const userService = getUserService();
if (!userService) {
setFeedback("User-Service konnte nicht geladen werden.", "danger");
return;
}
const result = await userService.deleteUser(auth.username, auth.password);
if (result.ok) {
clearAuth();
updateSessionBox();
updateHeaderUsername();
setFeedback("Account wurde gelöscht.", "success");
return;
}
if (result.status === 401) {
setFeedback("Account konnte nicht gelöscht werden: nicht autorisiert.", "danger");
return;
}
setFeedback(
"Account konnte nicht gelöscht werden (Status " + result.status + ").",
"danger",
);
}
function initLoginPage() {
const loginForm = document.getElementById("login-form");
const registerForm = document.getElementById("register-form");
const logoutButton = document.getElementById("logout-button");
const deleteAccountButton = document.getElementById("delete-account-button");
if (!loginForm || !registerForm || !logoutButton || !deleteAccountButton) {
return;
}
loginForm.addEventListener("submit", handleLoginSubmit);
registerForm.addEventListener("submit", handleRegisterSubmit);
logoutButton.addEventListener("click", handleLogout);
deleteAccountButton.addEventListener("click", handleDeleteAccount);
updateSessionBox();
updateHeaderUsername();
}
window.initLoginPage = initLoginPage;
window.AppAuth = {
getAuth: readAuth,
clearAuth: clearAuth,
};
document.addEventListener("DOMContentLoaded", updateHeaderUsername);
})();