|
|
|
|
|
|
|
|
|
|
|
let messageQueue = []; |
|
|
let processing = false; |
|
|
let id_user; |
|
|
let inactivityTimeout; |
|
|
const INACTIVITY_LIMIT = 30 * 60 * 1000; |
|
|
|
|
|
document.addEventListener("DOMContentLoaded", () => { |
|
|
initializeSession(); |
|
|
setupEventListeners(); |
|
|
resetInactivityTimer(); |
|
|
}); |
|
|
|
|
|
|
|
|
function initializeSession() { |
|
|
|
|
|
if (!sessionStorage.getItem("sessionID")) { |
|
|
const sessionID = generateSessionID(); |
|
|
sessionStorage.setItem("sessionID", sessionID); |
|
|
id_user = sessionID; |
|
|
console.log("Session ID dibuat:", sessionID); |
|
|
} else { |
|
|
const sesi_id = sessionStorage.getItem("sessionID"); |
|
|
id_user = sesi_id; |
|
|
console.log("Session ID yang ada:", sesi_id); |
|
|
} |
|
|
|
|
|
window.addEventListener("beforeunload", () => { |
|
|
sessionStorage.removeItem("sessionID"); |
|
|
}); |
|
|
} |
|
|
|
|
|
function generateSessionID() { |
|
|
|
|
|
return "user-" + Math.random().toString(36).substr(2, 9) + "-" + Date.now(); |
|
|
} |
|
|
|
|
|
|
|
|
function resetInactivityTimer() { |
|
|
clearTimeout(inactivityTimeout); |
|
|
inactivityTimeout = setTimeout(() => { |
|
|
|
|
|
sessionStorage.removeItem("sessionID"); |
|
|
console.log("Session ID dihapus karena inaktivitas."); |
|
|
}, INACTIVITY_LIMIT); |
|
|
} |
|
|
|
|
|
|
|
|
function setupEventListeners() { |
|
|
const chatForm = document.getElementById("chat-form"); |
|
|
const chatInput = document.getElementById("chat-input"); |
|
|
|
|
|
|
|
|
chatForm.addEventListener("submit", e => { |
|
|
e.preventDefault(); |
|
|
const message = chatInput.value.trim(); |
|
|
if (message === "") return; |
|
|
addUserMessage(message); |
|
|
chatInput.value = ""; |
|
|
|
|
|
resetInactivityTimer(); |
|
|
}); |
|
|
|
|
|
|
|
|
chatInput.addEventListener("keydown", e => { |
|
|
if (e.key === "Enter" && !e.shiftKey) { |
|
|
e.preventDefault(); |
|
|
chatForm.dispatchEvent(new Event("submit")); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function addUserMessage(text) { |
|
|
addMessageToChat(text, "user"); |
|
|
|
|
|
enqueueBotResponse(text); |
|
|
} |
|
|
|
|
|
|
|
|
function addMessageToChat(text, sender) { |
|
|
const chatContainer = document.getElementById("chat-container"); |
|
|
const messageElement = document.createElement("div"); |
|
|
messageElement.classList.add("message", sender); |
|
|
|
|
|
messageElement.textContent = text; |
|
|
chatContainer.appendChild(messageElement); |
|
|
|
|
|
messageElement.scrollIntoView({ behavior: "smooth" }); |
|
|
} |
|
|
|
|
|
|
|
|
function enqueueBotResponse(userMessage) { |
|
|
messageQueue.push(userMessage); |
|
|
processQueue(); |
|
|
} |
|
|
|
|
|
|
|
|
function processQueue() { |
|
|
if (processing || messageQueue.length === 0) return; |
|
|
|
|
|
processing = true; |
|
|
blockUserInput(true); |
|
|
showTypingIndicator(true); |
|
|
|
|
|
|
|
|
|
|
|
const userMessage = messageQueue.shift(); |
|
|
generateBotResponse(userMessage, id_user).then(botResponse => { |
|
|
addMessageToChat(botResponse, "bot"); |
|
|
showTypingIndicator(false); |
|
|
blockUserInput(false); |
|
|
processing = false; |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
async function generateBotResponse(userMessage, user_ID) { |
|
|
const url = "/chat"; |
|
|
|
|
|
const data = { |
|
|
message: userMessage, |
|
|
user_id: user_ID |
|
|
}; |
|
|
|
|
|
const options = { |
|
|
method: "POST", |
|
|
headers: { |
|
|
"Content-Type": "application/json" |
|
|
}, |
|
|
body: JSON.stringify(data) |
|
|
}; |
|
|
|
|
|
const res = await (await fetch(url, options)).json(); |
|
|
|
|
|
return res.reply; |
|
|
} |
|
|
|
|
|
|
|
|
function blockUserInput(block) { |
|
|
const chatInput = document.getElementById("chat-input"); |
|
|
const sendButton = document.getElementById("send-button"); |
|
|
chatInput.disabled = block; |
|
|
sendButton.disabled = block; |
|
|
} |
|
|
|
|
|
|
|
|
function showTypingIndicator(show) { |
|
|
const indicator = document.getElementById("typing-indicator"); |
|
|
if (show) { |
|
|
indicator.classList.remove("hidden"); |
|
|
} else { |
|
|
indicator.classList.add("hidden"); |
|
|
} |
|
|
} |