const messageIdentifierPrefix = `mintership-forum-message` document.addEventListener("DOMContentLoaded", async () => { // Identify the link for 'Mintership Forum' const mintershipForumLink = document.querySelector('a[href="MINTERSHIP-FORUM"]'); if (mintershipForumLink) { mintershipForumLink.addEventListener('click', async (event) => { event.preventDefault(); await login(); // Assuming login is an async function await loadForumPage(); }); } }); async function loadForumPage() { // Remove all sections except the menu const allSections = document.querySelectorAll('body > section'); allSections.forEach(section => { if (!section.classList.contains('menu')) { section.remove(); } }); // Check if user is an admin const minterGroupAdmins = await fetchMinterGroupAdmins(); const isUserAdmin = minterGroupAdmins.members.some(admin => admin.member === userState.accountAddress && admin.isAdmin) || await verifyUserIsAdmin(); // Create the forum layout, including a header, sub-menu, and keeping the original background image const mainContent = document.createElement('div'); const backgroundImage = document.querySelector('.header1')?.style.backgroundImage; mainContent.innerHTML = `
MINTERSHIP FORUM (Alpha)
${isUserAdmin ? '' : ''}
`; document.body.appendChild(mainContent); // Add event listeners to room buttons document.getElementById("minters-room").addEventListener("click", () => { loadRoomContent("minters"); }); if (isUserAdmin) { document.getElementById("admins-room").addEventListener("click", () => { loadRoomContent("admins"); }); } document.getElementById("general-room").addEventListener("click", () => { loadRoomContent("general"); }); } function loadRoomContent(room) { const forumContent = document.getElementById("forum-content"); if (forumContent) { forumContent.innerHTML = `

${room.charAt(0).toUpperCase() + room.slice(1)} Room

`; // Initialize Quill editor for rich text input const quill = new Quill('#editor', { theme: 'snow' }); // Load messages from QDN for the selected room loadMessagesFromQDN(room); // Add event listener for the send button document.getElementById("send-button").addEventListener("click", async () => { const messageHtml = quill.root.innerHTML.trim(); if (messageHtml !== "") { const randomID = await uid(); const messageIdentifier = `${messageIdentifierPrefix}-${room}-${randomID}`; // Create message object with unique identifier and HTML content const messageObject = { messageHtml: messageHtml, hasAttachment: false }; try { // Convert message object to base64 const base64Message = await objectToBase64(messageObject); if (!messageObject) { console.log(`initial object creation with object failed, using btoa...`) base64Message = btoa(JSON.stringify(messageObject)); } console.log("Message Object:", messageObject); console.log("Base64 Encoded Message:", base64Message); // Publish message to QDN await qortalRequest({ action: "PUBLISH_QDN_RESOURCE", name: userState.accountName, // Publisher must own the registered name service: "BLOG_POST", identifier: messageIdentifier, data64: base64Message }); console.log("Message published successfully"); // Clear the editor after sending the message quill.root.innerHTML = ""; // Reload messages loadMessagesFromQDN(room); } catch (error) { console.error("Error publishing message:", error); } } }); } } // Helper function to load messages from QDN for a specific room async function loadMessagesFromQDN(room) { try { const response = await searchAllResources(`${messageIdentifierPrefix}-${room}`, 0, false); const qdnMessages = response; console.log("Messages fetched successfully:", qdnMessages); const messagesContainer = document.querySelector("#messages-container"); if (messagesContainer) { if (!qdnMessages || !qdnMessages.length) { messagesContainer.innerHTML = `

No messages found. Be the first to post!

`; return; } let messagesHTML = ""; const fetchMessages = await Promise.all(qdnMessages.map(async (resource) => { try { console.log(`Fetching message with identifier: ${resource.identifier}`); const messageResponse = await qortalRequest({ action: "FETCH_QDN_RESOURCE", name: resource.name, service: "BLOG_POST", identifier: resource.identifier, }); console.log("Fetched message response:", messageResponse); // No need to decode, as qortalRequest returns the decoded data const messageObject = messageResponse; const timestamp = resource.updated || resource.created; const formattedTimestamp = await timestampToHumanReadableDate(timestamp); return { name: resource.name, content: messageObject.messageHtml, date: formattedTimestamp }; } catch (error) { console.error(`Failed to fetch message with identifier ${resource.identifier}. Error: ${error.message}`); return null; } })); fetchMessages.forEach(async (message) => { if (message) { messagesHTML += `
${message.name} ${message.date}
${message.content}
`; } }); messagesContainer.innerHTML = messagesHTML; setTimeout(() => { messagesContainer.scrollTop = messagesContainer.scrollHeight; }, 5000); } } catch (error) { console.error("Error loading messages from QDN:", error); } }