From eb56e67232b50af1083bfe2ed6d7fd305bf8911a Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Mon, 3 Feb 2025 00:30:12 -0500 Subject: [PATCH] add message deletion to all forums --- assets/css/forum-styles.css | 15 +++++++++ assets/js/Q-Mintership.js | 61 ++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/assets/css/forum-styles.css b/assets/css/forum-styles.css index 6e282b8..e1bbf30 100644 --- a/assets/css/forum-styles.css +++ b/assets/css/forum-styles.css @@ -163,6 +163,21 @@ background-color: #19403d; } +.delete-button { + align-self: flex-end; + margin-top: 1vh; + background-color: #891616; + color: #ffffff; + border: none; + border-radius: 1vh; + padding: 0.3vh 0.6vh; + cursor: pointer; +} + +.delete-button:hover { + background-color: #3d1919; +} + /* forum-styles.css additions */ .message-input-section { diff --git a/assets/js/Q-Mintership.js b/assets/js/Q-Mintership.js index 78ee8ab..b7eec3b 100644 --- a/assets/js/Q-Mintership.js +++ b/assets/js/Q-Mintership.js @@ -644,6 +644,33 @@ const handleSendMessage = async (room, messageHtml, selectedFiles, selectedImage } } +const handleDeleteMessage = async (room, existingMessageIdentifier) => { + try { + const blankMessageObject = { + messageHtml: "This post has been deleted.", + hasAttachment: false, + attachments: [], + replyTo: null + } + const base64Message = btoa(JSON.stringify(blankMessageObject)) + const service = (room === "admins") ? "MAIL_PRIVATE" : "BLOG_POST" + const request = { + action: 'PUBLISH_QDN_RESOURCE', + name: userState.accountName, + service: service, + identifier: existingMessageIdentifier, + data64: base64Message + } + if (room === "admins") { + request.encrypt = true + request.publicKeys = adminPublicKeys + } + console.log("Deleting forum message...") + await qortalRequest(request) + } catch (err) { + console.error("Error deleting message:", err) + } +} function clearInputs() { // Clear the file input elements and preview container @@ -760,6 +787,7 @@ const loadMessagesFromQDN = async (room, page, isPolling = false) => { } handleReplyLogic(fetchMessages) + handleDeleteLogic(fetchMessages, room) await updatePaginationControls(room, limit) } catch (error) { @@ -979,6 +1007,16 @@ const buildMessageHTML = async (message, fetchMessages, room, isNewMessage) => { const replyHtml = await buildReplyHtml(message, room) const attachmentHtml = await buildAttachmentHtml(message, room) const avatarUrl = `/arbitrary/THUMBNAIL/${message.name}/qortal_avatar` + let deleteButtonHtml = '' + if (message.name === userState.accountName) { + deleteButtonHtml = ` + + ` + } return `
@@ -995,7 +1033,10 @@ const buildMessageHTML = async (message, fetchMessages, room, isNewMessage) => { - +
+ ${deleteButtonHtml} + +
` } @@ -1147,6 +1188,24 @@ const handleReplyLogic = (fetchMessages) => { }) } +const handleDeleteLogic = (fetchMessages, room) => { + // Only select buttons that do NOT already have a listener + const deleteButtons = document.querySelectorAll('.delete-button:not(.bound-delete)') + deleteButtons.forEach(button => { + button.classList.add('bound-delete') + button.addEventListener('click', async () => { + const messageId = button.dataset.messageIdentifier + const postRoom = button.dataset.room + const msg = fetchMessages.find(m => m && m.identifier === messageId) + if (msg) { + const confirmed = confirm("Are you sure you want to delete this post?") + if (!confirmed) return + await handleDeleteMessage(postRoom, messageId) + } + }) + }) +} + const showReplyPreview = (repliedMessage) => { replyToMessageIdentifier = repliedMessage.identifier