let offset; let timelineElement = document.getElementById("messages"); let moreButton = document.getElementById("more-button"); function escapeHTML(content) { return content.replaceAll("&", "&").replaceAll("<", ">").replaceAll(">", "<"); } function getMessageHTML(messageJSON, canRespond) { let el = document.createElement("div"); el.classList.add("message-container"); el.dataset.messageId = messageJSON.id; el.innerHTML = `
${messageJSON.response ? `${timeSince(messageJSON.response_timestamp)}\n${escapeHTML(messageJSON.response)}` : ""} ${ canRespond ? ` ${messageJSON.response ? "" : ''}
${escapeHTML(json.content)}`; err.innerHTML = ""; msgContainer.querySelector("textarea").replaceWith(response); self.remove(); } else { err.innerHTML = "Something went wrong!"; self.removeAttribute("disabled"); } }) .catch((err) => { err.innerHTML = `Something went wrong: ${err}`; self.removeAttribute("disabled"); }); } function deleteMessage(messageID) { // } function _updateURL_replaceElement(element, to) { let newElement = document.createElement(to); newElement.dataset.url = element.dataset.url; newElement.dataset.id = element.dataset.id; newElement.innerHTML = element.innerHTML; newElement.setAttribute("href", element.getAttribute("href")); if (to == "a") { newElement.classList.add("not-bold"); } element.replaceWith(newElement); } function updateURL(switchID) { let switchElement = document.getElementById("switch").querySelector(`[data-id="${switchID}"]`); for (const el of document.getElementById("switch").querySelectorAll("b")) { _updateURL_replaceElement(el, "a"); } _updateURL_replaceElement(switchElement, "b"); url = switchElement.dataset.url; fetchMessages(true); } function fetchMessages(fetchFromStart=false) { document.getElementById("refresh").setAttribute("disabled", ""); let err, append; if (fetchFromStart) { timelineElement.innerHTML = "Loading..." moreButton.hidden = true; } else { err = document.querySelector(".delete-if-more-messages"); append = !!err; err = err || document.createElement("i"); err.classList.add("delete-if-more-messages") } fetch(url + (fetchFromStart === true ? "" : `${url.includes("?") ? "&" : "?"}offset=${offset}`)) .then((response) => (response.json())) .then((json) => { if (json.success) { let frag = document.createDocumentFragment(); if (fetchFromStart && json.messages.length == 0) { out = "No messages"; } else { for (const message of json.messages) { frag.append(getMessageHTML(message, json.canRespond)); offset = message.id; } } moreButton.hidden = !json.more; timelineElement.append(frag); for (el of document.getElementsByClassName("delete-if-more-messages")) { el.remove(); } } else { err = document.querySelector(".delete-if-more-messages"); append = !!err; err = err || document.createElement("i"); err.classList.add("delete-if-more-messages") err.innerText = "Something went wrong!"; append && timelineElement.append(err); } document.getElementById("refresh").removeAttribute("disabled"); }) .catch((error) => { err = document.querySelector(".delete-if-more-messages"); append = !!err; err = err || document.createElement("i"); err.classList.add("delete-if-more-messages") err.innerText = `Couldn't fetch timeline: ${error}`; append && timelineElement.append(err); document.getElementById("refresh").removeAttribute("disabled"); }); } fetchMessages(true); setInterval(function () { for (const timestamp of document.querySelectorAll("[data-timestamp]")) { timestamp.innerHTML = timeSince(Number(timestamp.dataset.timestamp)); } }, 5000);