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 = `
`;
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 += `
`;
}
});
messagesContainer.innerHTML = messagesHTML;
setTimeout(() => {
messagesContainer.scrollTop = messagesContainer.scrollHeight;
}, 5000);
}
} catch (error) {
console.error("Error loading messages from QDN:", error);
}
}