96 lines
3.2 KiB
JavaScript
Raw Normal View History

2023-04-27 14:07:46 +08:00
// chatUI.js
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) {
// 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-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-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-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-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
}