import request from "./request.js"; const messages = document.getElementById("messages"); let messages_raw = []; function renderMessage(message) { const messageElement = document.createElement("div"); messageElement.classList.add("message"); messageElement.setAttribute("id", "message-" + message.id); messageElement.innerHTML = ` <h3 style="float:right;">${new Date(message.time).toLocaleString()}</h3> <h2> <img class="circle" src=${message.author.avatar} alt=${message.author.name}> <a href=${"/users/" + message.author.id}> ${message.author.name}</a>: </h2> <p>${message.content.replaceAll("\n", "<br>")}</p><br> <div id="message-delete-${message.id}"> ${!message.deleted ? `<form style="display:inline;"> <button id="delete_message" value="${message.id}" type="submit">DELETE</button> </form>` : "<h3 style=\"display:inline;\">This message has been deleted</h3>"} </div> <div style="float: right;"> <h3 id="count${message.id}" style="display:inline;">${message.reactCount}</h3> <button style="display:inline;" id="like" value="${message.id}">+🔼</button> <button style="display:inline;" id="dislike" value="${message.id}" >-🔽</button> </div> `; messages.appendChild(messageElement); messages.innerHTML += "<br>"; }; /** * Main Renderer */ (async () => { messages_raw = await fetch(`/api/threads/${messages.getAttribute("value")}/messages/`).then(res => res.json()); if (messages_raw?.error) { document.getElementById("messages").innerHTML += '<div class="message"><h1>THIS THREAD HAS NOT GOT ANY MESSAGE</h1></div>'; } else for (const message of messages_raw) renderMessage(message); window.scrollTo(0, document.body.scrollHeight); })(); /** * Message Sender */ document.getElementById("send").addEventListener("submit", async e => { e.preventDefault(); const form = e.target; const data = new FormData(form); request("/api/messages", "POST", { threadID: data.get("threadID"), content: data.get("content") }) .then(res => { if (!res) return; form.reset(); res.reactCount = 0; renderMessage(res); }); }); /** * Button Listener */ document.addEventListener("click", async e => { // e.preventDefault(); if (e.target.id === "delete_thread") { const response = await request("/api/threads/" + e.target.value + "/delete"); if (response.deleted) { alert("Thread deleted"); location.reload(); } } else if (e.target.id === "undelete_thread") { const response = await request("/api/threads/" + e.target.value + "/undelete"); if (!response.deleted) { alert("Thread undeleted"); location.reload(); } } else if (e.target.id === "delete_message") { e.preventDefault(); const response = await request(`/api/messages/${e.target.value}/delete`); if (response.deleted) { alert("Message deleted"); document.getElementById("message-delete-" + e.target.value).innerHTML = "<h3 style=\"display:inline;\">This message has been deleted</h3>"; } } /*else if (e.target.id === "edit_thread") { window.location.href = "/threads/<%= thread.id }/edit"; } */ if (!e.target.id.includes("like")) return; const res = await request("/api/messages/" + e.target.value + "/react/" + e.target.id) document.getElementById("count" + e.target.value).innerHTML = res.reactCount; });