const authDiv = document.getElementById("auth"); const chatDiv = document.getElementById("chat"); const authMsg = document.getElementById("authMsg"); const messagesDiv = document.getElementById("messages"); const usernameInput = document.getElementById("username"); const passwordInput = document.getElementById("password"); const loginBtn = document.getElementById("login"); const registerBtn = document.getElementById("register"); const msgInput = document.getElementById("msgInput"); const sendBtn = document.getElementById("send"); let isProcessing = false; let chatHistory = JSON.parse(localStorage.getItem('chatHistory')) || []; async function post(url, data) { try { const res = await fetch(url, { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify(data) }); return await res.json(); } catch (err) { return {error: "Network error — please try again."}; } } async function get(url) { try { const res = await fetch(url); return await res.json(); } catch (err) { return {error: "Network error — please try again."}; } } function setAuthMessage(msg, isError = false) { authMsg.textContent = msg; authMsg.className = isError ? 'error' : 'success'; } function addMessage(content, isUser = false, isLoading = false, saveToHistory = true) { const msgDiv = document.createElement('div'); msgDiv.className = `msg ${isUser ? 'user' : 'bot'}${isLoading ? ' loading' : ''}`; if (isLoading) { msgDiv.innerHTML = `
`; } else { msgDiv.textContent = content; // Save to history (but not loading messages) if (saveToHistory) { chatHistory.push({ content: content, isUser: isUser, timestamp: Date.now() }); localStorage.setItem('chatHistory', JSON.stringify(chatHistory)); } } messagesDiv.appendChild(msgDiv); // Smooth scroll to bottom setTimeout(() => { messagesDiv.scrollTop = messagesDiv.scrollHeight; }, 100); return msgDiv; } function loadChatHistory() { messagesDiv.innerHTML = ''; chatHistory.forEach(msg => { addMessage(msg.content, msg.isUser, false, false); }); } function clearChatHistory() { chatHistory = []; localStorage.removeItem('chatHistory'); messagesDiv.innerHTML = ''; } function setLoadingState(loading) { isProcessing = loading; sendBtn.disabled = loading; msgInput.disabled = loading; if (loading) { sendBtn.classList.add('loading'); msgInput.placeholder = "Verarbeite Antwort..."; } else { sendBtn.classList.remove('loading'); msgInput.placeholder = "Type your message..."; } } async function checkSession() { const res = await get('/session'); if (res.user) { authDiv.style.display = "none"; chatDiv.style.display = "grid"; loadChatHistory(); msgInput.focus(); return true; } return false; } async function loadServerChat() { const res = await get("/chat/history"); if (res.history && res.history.length) { messagesDiv.innerHTML = ''; res.history.forEach(msg => { addMessage( msg.content, msg.role === "user", false, false ); }); messagesDiv.scrollTop = messagesDiv.scrollHeight; } } async function handleAuth(endpoint) { const username = usernameInput.value.trim(); const password = passwordInput.value.trim(); if (!username || !password) { setAuthMessage("Please enter both username and password.", true); return; } loginBtn.disabled = true; registerBtn.disabled = true; setAuthMessage("Processing...", false); const res = await post(`/${endpoint}`, {username, password}); loginBtn.disabled = false; registerBtn.disabled = false; if (res.error) { setAuthMessage(res.error, true); } else { if (endpoint === "login") { setAuthMessage("Login successful!", false); authDiv.style.display = "none"; chatDiv.style.display = "grid"; await loadServerChat(); msgInput.focus(); } else { setAuthMessage("Registration successful — you can now log in!", false); } } } async function sendMessage() { if (isProcessing) return; const msg = msgInput.value.trim(); if (!msg) return; addMessage(`You: ${msg}`, true); msgInput.value = ""; msgInput.style.height = 'auto'; setLoadingState(true); const loadingMsg = addMessage('', false, true, false); try { const model = document.getElementById("model").value; const res = await post("/chat", { message: msg, model }); if (messagesDiv.contains(loadingMsg)) { messagesDiv.removeChild(loadingMsg); } if (res.reply) { addMessage(`DeepFake: ${res.reply}`, false); } else { addMessage(`[Error: ${res.error}]`, false); } } catch (error) { if (messagesDiv.contains(loadingMsg)) { messagesDiv.removeChild(loadingMsg); } addMessage(`[Error: Network error]`, false); } finally { setLoadingState(false); msgInput.focus(); } } loginBtn.onclick = () => handleAuth("login"); registerBtn.onclick = () => handleAuth("register"); passwordInput.addEventListener("keydown", (e) => { if (e.key === "Enter") handleAuth("login"); }); document.getElementById("logout").onclick = async () => { await post("/logout", {}); chatDiv.style.display = "none"; authDiv.style.display = "grid"; clearChatHistory(); setAuthMessage("Logged out.", false); usernameInput.value = ""; passwordInput.value = ""; }; sendBtn.onclick = sendMessage; msgInput.addEventListener("keydown", (e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); sendMessage(); } }); document.getElementById("clearChat").onclick = async () => { await post("/chat/clear", {}); clearChatHistory(); }; msgInput.addEventListener('input', function () { this.style.height = 'auto'; this.style.height = Math.min(this.scrollHeight, 120) + 'px'; }); window.addEventListener('load', () => { checkSession(); });