const chatContainer = document.getElementById('chat-container');
const userInput = document.getElementById('user-input');
const sendButton = document.getElementById('send-button');
const clearChatButton = document.getElementById('clear-chat');
// Define the avatar URLs
const userAvatar = 'https://aws.hawaii-guide.com/files/images/user-50px.png';
const botAvatar = 'https://aws.hawaii-guide.com/images/made/john-victoria-derrick-hawaii_815_800_s.png';
// Load messages from local storage on page load
document.addEventListener('DOMContentLoaded', loadMessages);
// Add event listener for the clear chat button
clearChatButton.addEventListener('click', clearChatHistory);
// Add event listener for the send button
sendButton.addEventListener('click', () => sendMessage({ key: 'Enter' }));
function sendMessage(event) {
if (event.key === 'Enter') {
const userMessage = userInput.value.trim();
if (userMessage) {
addMessage(escapeHTML(userMessage), 'user');
userInput.value = '';
showLoadingDots(); // Show loading dots
// Get the chat history
const chatHistory = JSON.parse(localStorage.getItem('chatHistory')) || [];
const messages = chatHistory.map(entry => {
return { role: entry.sender === 'user' ? 'user' : 'assistant', content: entry.message };
});
// Prepend the role definition
messages.unshift({
role: 'system',
content: '{exp:stash:block name="108-chatbox-v2"}You are a helpful California travel assistant.{/exp:stash:block} You are designed to help plan the perfect trip. You will fact-check all information prior to responding.'
});
// Add the current message
messages.push({ role: 'user', content: userMessage });
fetch('/files/php/gpt-2024-v19.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ messages: messages })
})
.then(response => response.json())
.then(data => {
removeLoadingDots(); // Remove loading dots
if (data.reply) {
addMessage(data.reply, 'bot', true); // Allow HTML for bot messages
} else if (data.error) {
addMessage(`Error: ${data.error}`, 'bot');
}
})
.catch(error => {
removeLoadingDots(); // Remove loading dots
addMessage(`Error: ${error.message}`, 'bot');
});
}
}
}
function addMessage(message, sender, allowHTML = false) {
const messageElement = document.createElement('div');
messageElement.classList.add('message', sender);
const avatarElement = document.createElement('img');
avatarElement.classList.add('avatar');
avatarElement.src = sender === 'user' ? userAvatar : botAvatar;
const textElement = document.createElement('div');
textElement.classList.add('text');
if (allowHTML) {
textElement.innerHTML = marked.parse(message); // Convert Markdown to HTML
} else {
textElement.innerText = message;
}
messageElement.appendChild(sender === 'user' ? textElement : avatarElement);
messageElement.appendChild(sender === 'user' ? avatarElement : textElement);
chatContainer.appendChild(messageElement);
chatContainer.scrollTop = chatContainer.scrollHeight;
saveMessageToLocalStorage(message, sender); // Save message to local storage
}
function showLoadingDots() {
const loadingElement = document.createElement('div');
loadingElement.classList.add('message', 'bot', 'loading-dots');
const avatarElement = document.createElement('img');
avatarElement.classList.add('avatar');
avatarElement.src = botAvatar;
const dotsElement = document.createElement('div');
dotsElement.classList.add('text');
dotsElement.innerHTML = '';
dotsElement.id = 'loading-dots';
loadingElement.appendChild(avatarElement);
loadingElement.appendChild(dotsElement);
chatContainer.appendChild(loadingElement);
chatContainer.scrollTop = chatContainer.scrollHeight;
}
function removeLoadingDots() {
const loadingElement = document.getElementById('loading-dots')?.parentElement;
if (loadingElement) {
chatContainer.removeChild(loadingElement);
}
}
function saveMessageToLocalStorage(message, sender) {
try {
const chatHistory = JSON.parse(localStorage.getItem('chatHistory')) || [];
chatHistory.push({ message, sender });
localStorage.setItem('chatHistory', JSON.stringify(chatHistory));
} catch (e) {
console.error('Error saving to local storage', e);
}
}
function loadMessages() {
try {
const chatHistory = JSON.parse(localStorage.getItem('chatHistory')) || [];
chatHistory.forEach(entry => {
addMessage(entry.message, entry.sender, entry.sender === 'bot'); // Allow HTML for bot messages
});
} catch (e) {
console.error('Error loading from local storage', e);
}
}
function clearChatHistory() {
localStorage.removeItem('chatHistory');
chatContainer.innerHTML = '';
}
function escapeHTML(str) {
const div = document.createElement('div');
div.innerText = str;
return div.innerHTML;
}