document.addEventListener('DOMContentLoaded', function () {
const input = document.getElementById('epas-chat-input');
const button = document.getElementById('epas-chat-send');
const resetButton = document.getElementById('epas-chat-reset');
const messages = document.getElementById('epas-chat-messages');
if (!input || !button || !resetButton || !messages) {
console.log('EPAS Brain: elements not found');
return;
}
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
function autoResizeTextarea() {
input.style.height = 'auto';
input.style.height = Math.min(input.scrollHeight, 180) + 'px';
input.style.overflowY = input.scrollHeight > 180 ? 'auto' : 'hidden';
}
function formatAssistantMessage(text) {
if (!text) return '';
return text.replace(/\n/g, '
');
}
function sendPresetMessage(text) {
if (!text) return;
input.value = text;
autoResizeTextarea();
sendMessage();
}
function attachQuickReplyEvents(scope) {
const quickButtons = scope.querySelectorAll('.epas-quick-reply');
quickButtons.forEach(btn => {
btn.addEventListener('click', function () {
const message = this.getAttribute('data-message');
sendPresetMessage(message);
});
});
}
function appendBubble(role, text) {
const row = document.createElement('div');
row.className = `epas-chat-row ${role}`;
const bubble = document.createElement('div');
bubble.className = 'epas-chat-bubble';
if (role === 'assistant') {
bubble.innerHTML = formatAssistantMessage(text);
const links = bubble.querySelectorAll('a');
links.forEach(link => {
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
});
attachQuickReplyEvents(bubble);
} else {
bubble.innerHTML = escapeHtml(text).replace(/\n/g, '
');
}
row.appendChild(bubble);
messages.appendChild(row);
messages.scrollTop = messages.scrollHeight;
return row;
}
function createTypingBubble() {
const row = document.createElement('div');
row.className = 'epas-chat-row assistant';
const bubble = document.createElement('div');
bubble.className = 'epas-chat-bubble';
bubble.innerHTML = `
`;
row.appendChild(bubble);
messages.appendChild(row);
messages.scrollTop = messages.scrollHeight;
return row;
}
function sendMessage() {
const question = input.value.trim();
if (!question) return;
appendBubble('user', question);
input.value = '';
autoResizeTextarea();
const typingBubble = createTypingBubble();
fetch(EPASBrainChat.endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': EPASBrainChat.nonce
},
body: JSON.stringify({ question: question })
})
.then(async response => {
const text = await response.text();
try {
return JSON.parse(text);
} catch (e) {
console.error('Invalid JSON response:', text);
throw new Error('Invalid JSON response');
}
})
.then(data => {
typingBubble.remove();
appendBubble('assistant', data.answer || 'No response received.');
})
.catch(error => {
console.error(error);
typingBubble.remove();
appendBubble('assistant', 'Error getting response.');
});
}
input.addEventListener('input', autoResizeTextarea);
button.addEventListener('click', function () {
sendMessage();
});
input.addEventListener('keydown', function (e) {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
sendMessage();
}
});
resetButton.addEventListener('click', function () {
fetch(EPASBrainChat.resetEndpoint, {
method: 'POST',
headers: {
'X-WP-Nonce': EPASBrainChat.nonce
}
})
.then(() => {
messages.innerHTML = '';
appendBubble('assistant', 'Chat reset. How can I help?');
})
.catch(error => {
console.error(error);
appendBubble('assistant', 'Could not reset chat.');
});
});
autoResizeTextarea();
});