mahesh1209's picture
Update frontend/app.js
8dfee1b verified
// Same-origin API calls
const API_BASE = "";
// Session utilities
function getSessionId() {
let sid = localStorage.getItem("session_id");
if (!sid) {
sid = crypto.randomUUID();
localStorage.setItem("session_id", sid);
}
return sid;
}
function setNewSessionId() {
const sid = crypto.randomUUID();
localStorage.setItem("session_id", sid);
return sid;
}
// UI helpers
function addMessage(text, who = "bot") {
const win = document.getElementById("chat-window");
const div = document.createElement("div");
div.className = `message ${who}`;
div.textContent = text;
win.appendChild(div);
win.scrollTop = win.scrollHeight;
}
function disableInput(reason = "Input disabled.") {
document.getElementById("chat-input").disabled = true;
document.getElementById("send-btn").disabled = true;
document.getElementById("status").textContent = reason;
}
function enableInput() {
document.getElementById("chat-input").disabled = false;
document.getElementById("send-btn").disabled = false;
document.getElementById("status").textContent = "";
}
function clearChat() {
const win = document.getElementById("chat-window");
win.innerHTML = "";
document.getElementById("status").textContent = "";
}
// Backend calls
async function moderateText(text) {
const sid = getSessionId();
const res = await fetch(`${API_BASE}/moderate`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Session-Id": sid
},
body: JSON.stringify({ text })
});
if (!res.ok) throw new Error(`Moderate failed: ${res.status}`);
return res.json(); // {allowed, banned, lock, reason?}
}
async function sendChat(text) {
const sid = getSessionId();
const res = await fetch(`${API_BASE}/chat`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Session-Id": sid
},
body: JSON.stringify({ text })
});
if (!res.ok) throw new Error(`Chat failed: ${res.status}`);
return res.json(); // {reply}
}
// Flow handlers
function submitName() {
const nameInput = document.getElementById("name-input");
const name = (nameInput.value || "").trim();
if (!name) return;
document.getElementById("name-section").classList.add("hidden");
document.getElementById("chat-section").classList.remove("hidden");
clearChat();
enableInput();
addMessage(`Welcome, ${name}!`, "bot");
addMessage(name, "user"); // immediately show name in chat
}
async function submitMessage() {
const input = document.getElementById("chat-input");
const text = (input.value || "").trim();
if (!text) return;
try {
const mod = await moderateText(text);
if (mod.banned) {
addMessage("banned", "bot");
if (mod.lock) disableInput(mod.reason || "Input disabled due to policy violation.");
return;
}
addMessage(text, "user");
const resp = await sendChat(text);
addMessage(resp.reply, "bot");
} catch (err) {
disableInput("Error communicating with server.");
console.error(err);
} finally {
input.value = "";
}
}
// Top-bar actions
function goHome() {
// Reload root to show name section by default
window.location.href = "/";
}
function newUser() {
// Reset session, show name input again, clear chat, re-enable input
setNewSessionId();
clearChat();
enableInput();
document.getElementById("chat-section").classList.add("hidden");
document.getElementById("name-section").classList.remove("hidden");
document.getElementById("name-input").value = "";
document.getElementById("chat-input").value = "";
}
// Wire up buttons and Enter keys
document.getElementById("home-btn").addEventListener("click", goHome);
document.getElementById("new-user-btn").addEventListener("click", newUser);
document.getElementById("name-submit").addEventListener("click", submitName);
document.getElementById("name-input").addEventListener("keydown", (e) => {
if (e.key === "Enter") submitName();
});
document.getElementById("send-btn").addEventListener("click", submitMessage);
document.getElementById("chat-input").addEventListener("keydown", (e) => {
if (e.key === "Enter") submitMessage();
});
document.getElementById("clear-btn").addEventListener("click", clearChat);