function toggleSettings() {
const panel = document.getElementById("settings-panel");
panel.style.display = panel.style.display === "block"
? "none"
: "block";
if (panel.style.display === "block") {
const username = document.getElementById("username");
username.focus();
username.selectionStart = username.selectionEnd = username.value
.length;
}
}
function toggleUsers() {
const panel = document.getElementById("users-panel");
panel.style.display = panel.style.display === "block"
? "none"
: "block";
}
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute(
"data-theme",
);
const newTheme = currentTheme === "dark" ? "light" : "dark";
document.documentElement.setAttribute("data-theme", newTheme);
localStorage.setItem("theme", newTheme);
}
async function deleteMessage(messageId) {
if (confirm("Delete this message?")) {
try {
const response = await fetch("/messages", {
method: "DELETE",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ messageId: messageId }),
});
if (response.ok) {
updateMessagesInPlace();
} else {
console.error("Failed to delete message");
}
} catch (error) {
console.error("Error deleting message:", error);
}
}
}
async function updateMessagesInPlace() {
lastMessageCount = await getMessageCount();
const currentScrollLocation = getScrollLocation();
loadMessages(true, currentScrollLocation);
}
function getScrollLocation() {
const messagesDiv = document.getElementById("messages");
return messagesDiv.scrollTop;
}
function setScrollLocation(height) {
const messagesDiv = document.getElementById("messages");
messagesDiv.scrollTop = height;
}
document.addEventListener("click", function (event) {
const settingsPanel = document.getElementById("settings-panel");
const settingsButton = document.querySelector(".settings-button");
const usersPanel = document.getElementById("users-panel");
const usersButton = document.querySelector(".users-button");
if (
!settingsPanel.contains(event.target) &&
!settingsButton.contains(event.target)
) {
settingsPanel.style.display = "none";
}
if (
!usersPanel.contains(event.target) &&
!usersButton.contains(event.target)
) {
usersPanel.style.display = "none";
}
});
document.addEventListener("keypress", function (event) {
if (event.key === "Enter" && !event.shiftKey) {
const settingsPanel = document.getElementById("settings-panel");
const inputPanel = document.getElementById("message");
if (settingsPanel.contains(event.target)) {
setUsername();
}
if (inputPanel.contains(event.target)) {
event.preventDefault();
sendMessage();
}
}
});
document.addEventListener("input", function (_) {
const msg = document.getElementById("message");
msg.style.height = "auto";
msg.style.height = (msg.scrollHeight) + "px";
});
document.addEventListener("blur", function (_) {
const msg = document.getElementById("message");
msg.style.height = "auto";
}, true);
async function loadUsers() {
try {
const response = await fetch("/users");
const data = await response.json();
const usersList = document.getElementById("users-list");
usersList.innerHTML = "";
data.users.sort().forEach((user) => {
const userDiv = document.createElement("div");
userDiv.className = "user-item";
userDiv.textContent = user;
usersList.appendChild(userDiv);
});
} catch (error) {
console.error("Error loading users:", error);
}
}
async function getMessageCount() {
try {
const response = await fetch("/messages/length");
const text = await response.json();
return text.length;
} catch (error) {
console.error("Error getting message count:", error);
}
}
let lastMessageCount = 0;
async function loadMessages(forceUpdate = false, scrollLocation) {
try {
const newMessageCount = await getMessageCount();
const update = newMessageCount != lastMessageCount ||
lastMessageCount === 0 || forceUpdate;
let messagesDiv = document.getElementById("messages");
while (messagesDiv === null) {
await new Promise((resolve) =>
setTimeout(resolve, 100)
);
messagesDiv = document.getElementById(
"messages",
);
}
if (messagesDiv.scrollTop != bottom) {
// show a button to scroll to the bottom
const scrollToBottomButton = document
.getElementById(
"scroll",
);
scrollToBottomButton.style.display = "block";
scrollToBottomButton.onclick = scrollToBottom;
} else {
// hide the button
const scrollToBottomButton = document
.getElementById(
"scroll",
);
scrollToBottomButton.style.display = "none";
}
if (update) {
const response = await fetch("/messages");
const text = await response.text();
const tempDiv = document.createElement("div");
tempDiv.innerHTML = text;
const messages = tempDiv.getElementsByTagName("p");
messagesDiv.innerHTML = "";
Array.from(messages).forEach((msg) => {
const messageDiv = document.createElement(
"div",
);
messageDiv.className = "message";
const [
messageId,
username,
timestamp,
content,
] = msg
.innerHTML.split(
"
",
);
const usernameDiv = document.createElement(
"div",
);
usernameDiv.innerHTML = username;
compareUsername = usernameDiv.textContent;
let deleteHtml = "";
const embeddedContent = contentEmbedding(
content,
);
if (
compareUsername ===
document.getElementById(
"current-user",
).textContent
) {
deleteHtml =
``;
}
messageDiv.innerHTML = `