175 lines
4.4 KiB
JavaScript
175 lines
4.4 KiB
JavaScript
const img = document.getElementById("personImg");
|
|
const nameEl = document.getElementById("personName");
|
|
const button = document.getElementById("toggleButton");
|
|
const reasonInput = document.getElementById("reasonInput");
|
|
const lastReasonBox = document.getElementById("lastReasonBox");
|
|
const lastReasonText = document.getElementById("lastReasonText");
|
|
const mainContent = document.getElementById("mainContent");
|
|
|
|
// Config wird vom Server geladen
|
|
let CONFIG = null;
|
|
|
|
// Preload images to prevent flickering
|
|
const imageCache = {};
|
|
function preloadImage(src) {
|
|
return new Promise((resolve, reject) => {
|
|
if (imageCache[src]) {
|
|
resolve(imageCache[src]);
|
|
return;
|
|
}
|
|
|
|
const image = new Image();
|
|
image.onload = () => {
|
|
imageCache[src] = image;
|
|
resolve(image);
|
|
};
|
|
image.onerror = reject;
|
|
image.src = src;
|
|
});
|
|
}
|
|
|
|
// Config vom Server laden
|
|
async function loadConfig() {
|
|
try {
|
|
const res = await fetch("/config");
|
|
CONFIG = await res.json();
|
|
console.log("✅ Config geladen:", CONFIG);
|
|
return CONFIG;
|
|
} catch (err) {
|
|
console.error("❌ Fehler beim Laden der Config:", err);
|
|
// Fallback zur alten Konfiguration
|
|
CONFIG = {
|
|
A: {
|
|
name: "Honey",
|
|
colorHex: "#2ecc71",
|
|
icon: "a.png",
|
|
background: "bgA.jpg"
|
|
},
|
|
B: {
|
|
name: "Kirby",
|
|
colorHex: "#e74c3c",
|
|
icon: "b.png",
|
|
background: "bgB.jpg"
|
|
}
|
|
};
|
|
return CONFIG;
|
|
}
|
|
}
|
|
|
|
// Preload all images on page load
|
|
async function preloadAllImages() {
|
|
if (!CONFIG) await loadConfig();
|
|
|
|
try {
|
|
await Promise.all([
|
|
preloadImage(`img/${CONFIG.A.icon}`),
|
|
preloadImage(`img/${CONFIG.B.icon}`),
|
|
preloadImage(`img/${CONFIG.A.background}`),
|
|
preloadImage(`img/${CONFIG.B.background}`)
|
|
]);
|
|
console.log("✅ Alle Bilder vorgeladen");
|
|
} catch (err) {
|
|
console.warn("⚠️ Fehler beim Vorladen:", err);
|
|
}
|
|
}
|
|
|
|
async function loadStatus() {
|
|
// Config und Bilder laden
|
|
await loadConfig();
|
|
await preloadAllImages();
|
|
|
|
const res = await fetch("/status");
|
|
const data = await res.json();
|
|
|
|
// Set background and image without animation on first load
|
|
setBackgroundAndImage(data.current, false);
|
|
|
|
// Show content smoothly
|
|
img.style.display = 'block';
|
|
mainContent.classList.remove('loading');
|
|
mainContent.classList.add('loaded');
|
|
|
|
// Show last reason if available
|
|
if (data.lastReason) {
|
|
lastReasonText.textContent = data.lastReason;
|
|
lastReasonBox.classList.remove("hidden");
|
|
}
|
|
}
|
|
|
|
function setBackgroundAndImage(person, animate = true) {
|
|
if (!CONFIG) {
|
|
console.error("Config nicht geladen!");
|
|
return;
|
|
}
|
|
|
|
const personConfig = CONFIG[person];
|
|
const file = `img/${personConfig.icon}`;
|
|
const label = personConfig.name;
|
|
const bgImage = `url('img/${personConfig.background}')`;
|
|
const nameColor = personConfig.colorHex;
|
|
|
|
// Set background immediately (smooth transition via CSS)
|
|
document.body.style.backgroundImage = bgImage;
|
|
document.body.style.backgroundSize = "cover";
|
|
document.body.style.backgroundPosition = "center";
|
|
|
|
if (animate) {
|
|
img.classList.add("rotate");
|
|
|
|
// Change image, name and color in the middle of rotation
|
|
setTimeout(() => {
|
|
img.src = file;
|
|
nameEl.textContent = label;
|
|
nameEl.style.color = nameColor;
|
|
}, 300); // Half of rotation duration
|
|
|
|
// Remove rotation class after animation
|
|
setTimeout(() => {
|
|
img.classList.remove("rotate");
|
|
}, 600);
|
|
} else {
|
|
// First load - no animation
|
|
img.src = file;
|
|
nameEl.textContent = label;
|
|
nameEl.style.color = nameColor;
|
|
}
|
|
}
|
|
|
|
button.addEventListener("click", async () => {
|
|
const reason = reasonInput.value.trim();
|
|
|
|
try {
|
|
const res = await fetch("/toggle", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json"
|
|
},
|
|
body: JSON.stringify({ reason: reason || undefined })
|
|
});
|
|
|
|
const data = await res.json();
|
|
setBackgroundAndImage(data.current, true);
|
|
|
|
// Update last reason display
|
|
if (reason) {
|
|
lastReasonText.textContent = reason;
|
|
lastReasonBox.classList.remove("hidden");
|
|
}
|
|
|
|
// Clear input
|
|
reasonInput.value = "";
|
|
} catch (err) {
|
|
console.error("Fehler beim Wechseln:", err);
|
|
nameEl.textContent = "Fehler!";
|
|
}
|
|
});
|
|
|
|
// Allow Enter key to trigger switch
|
|
reasonInput.addEventListener("keypress", (e) => {
|
|
if (e.key === "Enter") {
|
|
button.click();
|
|
}
|
|
});
|
|
|
|
// Start loading
|
|
loadStatus(); |