189 lines
5.9 KiB
JavaScript
189 lines
5.9 KiB
JavaScript
// public/assets/js/header.js
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
const cfg = window.usbConfig || {};
|
|
const i18nCfg = cfg.i18n || {};
|
|
const availLangs = i18nCfg.available || {};
|
|
const availCodes = Object.keys(availLangs);
|
|
|
|
function normalizeLang(code) {
|
|
if (!code) return "";
|
|
return String(code).slice(0, 2).toLowerCase();
|
|
}
|
|
|
|
function detectBrowserLang() {
|
|
const nav = window.navigator || {};
|
|
const candidates = [];
|
|
|
|
if (Array.isArray(nav.languages)) {
|
|
candidates.push(...nav.languages);
|
|
}
|
|
if (typeof nav.language === "string") {
|
|
candidates.push(nav.language);
|
|
}
|
|
if (typeof nav.userLanguage === "string") {
|
|
candidates.push(nav.userLanguage);
|
|
}
|
|
|
|
for (const raw of candidates) {
|
|
const code = normalizeLang(raw);
|
|
if (availCodes.includes(code)) {
|
|
return code;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function resolveCurrentLang() {
|
|
const url = new URL(window.location.href);
|
|
const urlLang = normalizeLang(url.searchParams.get("lang"));
|
|
|
|
// 1) ?lang
|
|
if (urlLang && availCodes.includes(urlLang)) {
|
|
return urlLang;
|
|
}
|
|
|
|
// 2) Browsersprache
|
|
const browserLang = detectBrowserLang();
|
|
if (browserLang) {
|
|
return browserLang;
|
|
}
|
|
|
|
// 3) EN
|
|
if (availCodes.includes("en")) {
|
|
return "en";
|
|
}
|
|
|
|
if (availCodes.length > 0) {
|
|
return availCodes[0];
|
|
}
|
|
|
|
return "en";
|
|
}
|
|
|
|
// LOGIN-BUTTON
|
|
const loginBtn = document.getElementById("loginButton");
|
|
|
|
if (loginBtn) {
|
|
loginBtn.addEventListener("click", function (event) {
|
|
event.preventDefault();
|
|
|
|
const currentPath = window.location.pathname || "/";
|
|
const currentQuery = window.location.search || "";
|
|
const redirect = currentPath + currentQuery;
|
|
|
|
const lang = resolveCurrentLang();
|
|
|
|
if (currentPath === "/login" || currentPath === "/login/") {
|
|
const authEl = document.getElementById("auth");
|
|
if (authEl) {
|
|
authEl.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
}
|
|
return;
|
|
}
|
|
|
|
const url = "/login/?lang=" + encodeURIComponent(lang) +
|
|
"&redirect=" + encodeURIComponent(redirect) +
|
|
"#auth";
|
|
|
|
window.location.href = url;
|
|
});
|
|
}
|
|
|
|
// AVATAR-MENÜ & LOGOUT wie gehabt (deine bestehende Logik)
|
|
const avatarBtn = document.getElementById("userAvatar");
|
|
const userMenu = document.getElementById("userMenu");
|
|
|
|
if (avatarBtn && userMenu) {
|
|
avatarBtn.addEventListener("click", function (event) {
|
|
event.stopPropagation();
|
|
userMenu.classList.toggle("hidden");
|
|
|
|
const expanded = avatarBtn.getAttribute("aria-expanded") === "true";
|
|
avatarBtn.setAttribute("aria-expanded", expanded ? "false" : "true");
|
|
});
|
|
|
|
document.addEventListener("click", function (event) {
|
|
if (userMenu.classList.contains("hidden")) {
|
|
return;
|
|
}
|
|
|
|
const clickedInsideMenu = userMenu.contains(event.target);
|
|
const clickedAvatarButton = avatarBtn.contains(event.target);
|
|
|
|
if (!clickedInsideMenu && !clickedAvatarButton) {
|
|
userMenu.classList.add("hidden");
|
|
avatarBtn.setAttribute("aria-expanded", "false");
|
|
}
|
|
});
|
|
}
|
|
|
|
const logoutButtons = document.querySelectorAll('[data-logout-link="true"]');
|
|
const backdrop = document.getElementById("logoutModalBackdrop");
|
|
const btnConfirm = document.getElementById("logoutConfirm");
|
|
const btnCancel = document.getElementById("logoutCancel");
|
|
|
|
let logoutTarget = null;
|
|
|
|
function showLogoutModal(targetHref) {
|
|
logoutTarget = targetHref || null;
|
|
if (!backdrop) return;
|
|
|
|
backdrop.classList.remove("hidden");
|
|
document.body.classList.add("overflow-hidden");
|
|
}
|
|
|
|
function hideLogoutModal() {
|
|
if (!backdrop) return;
|
|
backdrop.classList.add("hidden");
|
|
document.body.classList.remove("overflow-hidden");
|
|
logoutTarget = null;
|
|
}
|
|
|
|
if (logoutButtons.length && backdrop && btnConfirm && btnCancel) {
|
|
logoutButtons.forEach(function (btn) {
|
|
btn.addEventListener("click", function (event) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
const href = btn.getAttribute("data-logout-href")
|
|
|| btn.getAttribute("href")
|
|
|| "/auth/logout";
|
|
|
|
showLogoutModal(href);
|
|
|
|
if (userMenu && !userMenu.classList.contains("hidden")) {
|
|
userMenu.classList.add("hidden");
|
|
if (avatarBtn) {
|
|
avatarBtn.setAttribute("aria-expanded", "false");
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
btnConfirm.addEventListener("click", function () {
|
|
if (logoutTarget) {
|
|
window.location.href = logoutTarget;
|
|
} else {
|
|
window.location.href = "/auth/logout";
|
|
}
|
|
});
|
|
|
|
btnCancel.addEventListener("click", function () {
|
|
hideLogoutModal();
|
|
});
|
|
|
|
backdrop.addEventListener("click", function (event) {
|
|
const card = backdrop.querySelector(".max-w-sm");
|
|
if (card && !card.contains(event.target)) {
|
|
hideLogoutModal();
|
|
}
|
|
});
|
|
|
|
document.addEventListener("keydown", function (event) {
|
|
if (event.key === "Escape" && !backdrop.classList.contains("hidden")) {
|
|
hideLogoutModal();
|
|
}
|
|
});
|
|
}
|
|
});
|