diff --git a/src/snek/templates/web.html b/src/snek/templates/web.html index 1430a04..ee67a7c 100644 --- a/src/snek/templates/web.html +++ b/src/snek/templates/web.html @@ -45,11 +45,18 @@ time.innerText = app.timeDescription(time.dataset.created_at); }); } - - function updateLayout() { + function isElementVisible(element) { + const rect = element.getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && + rect.right <= (window.innerWidth || document.documentElement.clientWidth) + ); + } + function updateLayout(doScrollDown) { const messagesContainer = document.querySelector(".chat-messages"); //messagesContainer.scrollTop = messagesContainer.scrollHeight + 1000; - updateTimes(); let previousUser = null; document.querySelectorAll(".message").forEach((message) => { @@ -60,8 +67,10 @@ message.classList.remove("switch-user"); } }); - const lastMessage = messagesContainer.querySelector(".message:last-child"); - lastMessage.scrollIntoView({ inline: "nearest" }); + lastMessage = messagesContainer.querySelector(".message:last-child"); + if(doScrollDown){ + lastMessage.scrollIntoView({ inline: "nearest" }); + } } @@ -73,6 +82,11 @@ if (data.username !== "{{ user.username.value }}") { app.playSound(0); } + + const messagesContainer = document.querySelector(".chat-messages"); + const lastMessage = messagesContainer.querySelector(".message:last-child"); + const doScrollDownBecauseLastMessageIsVisible = !lastMessage || isElementVisible(lastMessage); + const message = document.createElement("div"); message.dataset.color = data.color; @@ -81,14 +95,14 @@ message.dataset.uid = data.uid; message.innerHTML = data.html; document.querySelector(".chat-messages").appendChild(message.firstChild); - updateLayout(); + updateLayout(doScrollDownBecauseLastMessageIsVisible); setTimeout(()=>{ - updateLayout() + updateLayout(doScrollDownBecauseLastMessageIsVisible) },1000) }); initInputField(document.querySelector("textarea")); - updateLayout(); + updateLayout(true); {% endblock %}