diff --git a/templates/chat.html b/templates/chat.html index 269c58a..d641f4f 100644 --- a/templates/chat.html +++ b/templates/chat.html @@ -279,6 +279,8 @@ socket.on("message", (data) => { // Check if the message has an id which means we can delete it. if (data.id) { + newMessage.dataset.rawMarkdown = data.content; + // Create the delete button const deleteButton = document.createElement("button"); deleteButton.innerHTML = "x"; @@ -327,6 +329,8 @@ socket.on("previous_messages", (data) => { newMessage.innerHTML = DOMPurify.sanitize(marked.marked(`**${data.username}:**\n\n${data.message}`), dompurify_config); } + newMessage.dataset.rawMarkdown = data.message; + // Create the delete button const deleteButton = document.createElement("button"); deleteButton.innerHTML = "x"; @@ -338,7 +342,7 @@ socket.on("previous_messages", (data) => { const editButton = document.createElement("button"); editButton.textContent = "Edit"; editButton.className = "edit-button"; - editButton.onclick = () => editMessage(data.id, newMessage, data.message); + editButton.onclick = () => editMessage(data.id, newMessage); messageWrapper.appendChild(editButton); messageWrapper.appendChild(newMessage); @@ -381,7 +385,7 @@ socket.on("message_chunk", (data) => { document.getElementById("chat").appendChild(messageWrapper); // Create the div element to hold the message content - const targetMessageElement = document.createElement("div"); + targetMessageElement = document.createElement("div"); targetMessageElement.className = "message-content"; // Create the "x" button for deletion @@ -394,14 +398,13 @@ socket.on("message_chunk", (data) => { const editButton = document.createElement("button"); editButton.textContent = "Edit"; editButton.className = "edit-button"; - editButton.onclick = () => editMessage(data.id, targetMessageElement, messageBuffers[data.id]); + editButton.onclick = () => editMessage(data.id, targetMessageElement); messageWrapper.appendChild(editButton); messageWrapper.appendChild(targetMessageElement); - } else { - // If the wrapper already exists, get the p element inside it - targetMessageElement = messageWrapper.querySelector("div.message-content"); + // If the wrapper already exists, get the message-content div inside it + targetMessageElement = messageWrapper.querySelector(".message-content"); } // If the message buffer for this ID doesn't exist, create it @@ -413,7 +416,11 @@ socket.on("message_chunk", (data) => { messageBuffers[data.id] += data.content; // Process the entire buffer with marked and set it as the content of the target element - targetMessageElement.innerHTML = DOMPurify.sanitize(marked.marked(messageBuffers[data.id]), dompurify_config); + const sanitizedContent = DOMPurify.sanitize(marked.marked(messageBuffers[data.id]), dompurify_config); + targetMessageElement.innerHTML = sanitizedContent; + + // Store the raw markdown in a data attribute for later use in editing + targetMessageElement.dataset.rawMarkdown = messageBuffers[data.id]; // Apply syntax highlighting to code blocks within the content targetMessageElement.querySelectorAll("pre code").forEach((block) => { @@ -426,6 +433,7 @@ socket.on("message_chunk", (data) => { document.getElementById("chat").scrollTop = document.getElementById("chat").scrollHeight; }); + // Socket event for when a message is deleted socket.on("message_deleted", (data) => { const messageElement = document.getElementById("message-" + data.message_id); @@ -465,10 +473,10 @@ socket.on("message_updated", (data) => { // Function to enter edit mode -function editMessage(messageId, messageContentContainer, rawMarkdown) { +function editMessage(messageId, messageContentContainer) { // Store the current HTML in a data attribute messageContentContainer.dataset.originalHtml = messageContentContainer.innerHTML; - messageContentContainer.dataset.rawMarkdown = rawMarkdown; + const rawMarkdown = messageContentContainer.dataset.rawMarkdown; // Create a textarea for editing const textarea = document.createElement("textarea");