2023-04-27 14:07:46 +08:00
|
|
|
// chatUI.js
|
|
|
|
|
2023-04-25 08:08:40 +08:00
|
|
|
|
2023-04-27 14:07:46 +08:00
|
|
|
function getLastBotMessageItem(messagesContainer) {
|
|
|
|
const lastMessage = messagesContainer.lastElementChild;
|
|
|
|
|
|
|
|
if (lastMessage && lastMessage.classList.contains('message-item')) {
|
|
|
|
const lastMessageIcon = lastMessage.querySelector('i');
|
|
|
|
if (lastMessageIcon && lastMessageIcon.classList.contains('fa-robot')) {
|
|
|
|
return lastMessage;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
function botMessageUpdate(role, content, partial) {
|
2023-04-25 08:08:40 +08:00
|
|
|
// Create a MarkdownIt instance for rendering markdown content
|
|
|
|
const messagesContainer = document.getElementById('messages-container');
|
2023-05-02 19:58:32 +08:00
|
|
|
let lastBotMessage = getLastBotMessageItem(messagesContainer);
|
2023-04-25 08:08:40 +08:00
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
if (lastBotMessage == null) {
|
|
|
|
return false
|
2023-04-27 17:28:48 +08:00
|
|
|
}
|
2023-04-27 14:07:46 +08:00
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
// Render the markdown content inside the message content container
|
|
|
|
const renderedContent = markdownRender(content);
|
|
|
|
const lastMessageContent = lastBotMessage.querySelector('.message-content');
|
|
|
|
lastMessageContent.innerHTML = renderedContent;
|
2023-04-27 14:07:46 +08:00
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
if (!partial) {
|
2023-04-27 14:07:46 +08:00
|
|
|
// Find any code blocks in the rendered content and add a class to style them
|
|
|
|
const codeBlocks = lastMessageContent.querySelectorAll('pre > code');
|
2023-05-02 19:58:32 +08:00
|
|
|
|
2023-04-27 14:07:46 +08:00
|
|
|
// Initialize the Apply Patch functionality
|
|
|
|
initButtonForCodeBlock(codeBlocks);
|
|
|
|
}
|
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
return true;
|
|
|
|
}
|
2023-04-25 08:08:40 +08:00
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
function addSenderIcon(messageItem, role) {
|
|
|
|
// Create a sender icon element and add the appropriate class based on the role (user or bot)
|
|
|
|
const senderIcon = document.createElement('i');
|
|
|
|
const iconClasses = role === 'user' ? ['fas', 'fa-user-circle'] : ['fas', 'fa-robot'];
|
|
|
|
senderIcon.classList.add(...iconClasses);
|
|
|
|
messageItem.appendChild(senderIcon);
|
2023-04-25 08:08:40 +08:00
|
|
|
}
|
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
function addMessageContent(messageItem, renderedContent, role) {
|
|
|
|
// Create a container for the message content
|
|
|
|
const messageContent = document.createElement('div');
|
|
|
|
messageContent.classList.add('message-content');
|
|
|
|
messageContent.innerHTML = renderedContent;
|
|
|
|
|
|
|
|
// Find any code blocks in the rendered content and add a class to style them
|
|
|
|
const codeBlocks = messageContent.querySelectorAll('pre > code');
|
|
|
|
|
|
|
|
// Initialize the Apply Patch functionality
|
|
|
|
if (role != "user") {
|
|
|
|
initButtonForCodeBlock(codeBlocks);
|
|
|
|
}
|
|
|
|
messageItem.appendChild(messageContent);
|
|
|
|
messageItemActions(messageItem, messageContent, role);
|
2023-04-25 08:08:40 +08:00
|
|
|
}
|
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
function addMessageItem(messagesContainer, content, role) {
|
|
|
|
// Render the markdown content inside the message content container
|
|
|
|
let renderedContent = markdownRender(content);
|
|
|
|
if (role == "user") {
|
|
|
|
renderedContent = markdownRender("\`\`\`\n" + content);
|
|
|
|
}
|
|
|
|
|
|
|
|
const messageItem = document.createElement('div');
|
|
|
|
messageItem.classList.add('message-item');
|
|
|
|
|
|
|
|
addSenderIcon(messageItem, role);
|
|
|
|
addMessageContent(messageItem, renderedContent, role);
|
|
|
|
|
|
|
|
messagesContainer.appendChild(messageItem);
|
2023-04-27 14:07:46 +08:00
|
|
|
}
|
|
|
|
|
2023-05-02 19:58:32 +08:00
|
|
|
function addMessageToUI(role, content, partial = false) {
|
|
|
|
// Create a MarkdownIt instance for rendering markdown content
|
|
|
|
const messagesContainer = document.getElementById('messages-container');
|
|
|
|
|
|
|
|
if (role == "bot" && botMessageUpdate(role, content, partial)) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
addMessageItem(messagesContainer, content, role);
|
|
|
|
// Scroll the messages container to the bottom to display the latest message
|
|
|
|
messagesContainer.scrollTop = messagesContainer.scrollHeight;
|
2023-04-27 14:07:46 +08:00
|
|
|
}
|
|
|
|
|