Channel list.
This commit is contained in:
parent
24260f9c37
commit
1b72063a5b
@ -102,7 +102,7 @@ a {
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages {
|
.chat-messages, .threads {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
scrollbar-width: none;
|
scrollbar-width: none;
|
||||||
@ -130,7 +130,7 @@ a {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages .message {
|
.chat-messages .message, .threads .thread {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
@ -138,7 +138,7 @@ a {
|
|||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages .message .avatar {
|
.chat-messages .message .avatar, .threads .thread .avatar {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
@ -152,11 +152,11 @@ a {
|
|||||||
margin-right: 15px;
|
margin-right: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages .message .message-content {
|
.chat-messages .message .message-content, .threads .thread .message-content {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages .message .message-content .author {
|
.chat-messages .message .message-content .author, .threads .thread .message-content .author {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #f05a28;
|
color: #f05a28;
|
||||||
margin-bottom: 3px;
|
margin-bottom: 3px;
|
||||||
@ -172,7 +172,7 @@ word-break: break-word;
|
|||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
hyphens: auto;
|
hyphens: auto;
|
||||||
}
|
}
|
||||||
.chat-messages .message .message-content .text {
|
.chat-messages .message .message-content .text, .threads .thread .message-content .text {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
color: #e6e6e6;
|
color: #e6e6e6;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
@ -191,7 +191,7 @@ hyphens: auto;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages .message .message-content .time {
|
.chat-messages .message .message-content .time, .threads .thread .message-content .time {
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
color: #aaa;
|
color: #aaa;
|
||||||
}
|
}
|
||||||
@ -294,7 +294,7 @@ input[type="text"], .chat-input textarea {
|
|||||||
background-color: #555;
|
background-color: #555;
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-messages {
|
.chat-messages, .threads {
|
||||||
scrollbar-width: none;
|
scrollbar-width: none;
|
||||||
scrollbar-color: #888 #f1f1f1;
|
scrollbar-color: #888 #f1f1f1;
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<section class="chat-area" id="chat">
|
<section class="chat-area" id="chat">
|
||||||
<div class="chat-messages">
|
<div class="threads">
|
||||||
{% for thread in threads %}
|
{% for thread in threads %}
|
||||||
{% autoescape false %}
|
{% autoescape false %}
|
||||||
<div style="max-width:100%;" data-uid="{{thread.uid}}" data-color="{{thread.last_message_user_color}}" data-channel_uid="{{thread.uid}}"
|
<div style="max-width:100%;" data-uid="{{thread.uid}}" data-color="{{thread.last_message_user_color}}" data-channel_uid="{{thread.uid}}"
|
||||||
data-user_nick="{{last_message_user_nick}}" data-created_at="{{thread.created_at}}" data-user_uid="{{user_uid}}"
|
data-user_nick="{{last_message_user_nick}}" data-created_at="{{thread.created_at}}" data-user_uid="{{user_uid}}"
|
||||||
class="message">
|
class="thread">
|
||||||
<div class="avatar" style="opacity: 1; background-color: {{thread.last_message_user_color}}; color: black;"><img
|
<div class="avatar" style="opacity: 1; background-color: {{thread.last_message_user_color}}; color: black;"><img
|
||||||
src="/avatar/{{thread.last_message_user_uid}}.svg" /></div>
|
src="/avatar/{{thread.last_message_user_uid}}.svg" /></div>
|
||||||
<div class="message-content">
|
<div class="message-content">
|
||||||
@ -32,71 +32,11 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const messagesContainer = document.querySelector(".chat-messages");
|
const threadsContainer = document.querySelector(".chat-threads");
|
||||||
|
|
||||||
function isScrolledPastHalf() {
|
|
||||||
let scrollTop = messagesContainer.scrollTop;
|
|
||||||
let scrollableHeight = messagesContainer.scrollHeight - messagesContainer.clientHeight;
|
|
||||||
|
|
||||||
if (scrollTop < scrollableHeight / 2) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let isLoadingExtra = false;
|
|
||||||
|
|
||||||
async function loadExtra() {
|
|
||||||
const firstMessage = messagesContainer.querySelector(".message:first-child");
|
|
||||||
if (isLoadingExtra) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isScrolledPastHalf()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
isLoadingExtra = true;
|
|
||||||
|
|
||||||
const messages = await app.rpc.getMessages(channelUid, 0, firstMessage.dataset.created_at);
|
|
||||||
|
|
||||||
messages.forEach((message) => {
|
|
||||||
firstMessage.insertAdjacentHTML("beforebegin", message.html);
|
|
||||||
})
|
|
||||||
updateLayout(false);
|
|
||||||
|
|
||||||
isLoadingExtra = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
messagesContainer.addEventListener("scroll", () => {
|
|
||||||
loadExtra();
|
|
||||||
});
|
|
||||||
|
|
||||||
function updateLayout(doScrollDown) {
|
function updateLayout(doScrollDown) {
|
||||||
const messagesContainer = document.querySelector(".chat-messages");
|
|
||||||
updateTimes();
|
updateTimes();
|
||||||
let previousUser = null;
|
|
||||||
document.querySelectorAll(".message").forEach((message) => {
|
|
||||||
if (previousUser !== message.dataset.user_uid) {
|
|
||||||
message.classList.add("switch-user");
|
|
||||||
previousUser = message.dataset.user_uid;
|
|
||||||
} else {
|
|
||||||
message.classList.remove("switch-user");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
lastMessage = messagesContainer.querySelector(".message:last-child");
|
|
||||||
if (doScrollDown) {
|
|
||||||
lastMessage.scrollIntoView({ inline: "nearest" });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(updateTimes, 1000);
|
setInterval(updateTimes, 1000);
|
||||||
@ -131,20 +71,17 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const messagesContainer = document.querySelector(".chat-messages");
|
const threadsContainer = document.querySelector(".chat-threads");
|
||||||
const lastMessage = messagesContainer.querySelector(".message:last-child");
|
|
||||||
const doScrollDownBecauseLastMessageIsVisible = !lastMessage || isElementVisible(lastMessage);
|
|
||||||
|
|
||||||
const message = document.createElement("div");
|
const message = document.createElement("div");
|
||||||
message.innerHTML = data.html;
|
message.innerHTML = data.html;
|
||||||
document.querySelector(".chat-messages").appendChild(message.firstChild);
|
document.querySelector(".chat-threads").appendChild(message.firstChild);
|
||||||
updateLayout(doScrollDownBecauseLastMessageIsVisible);
|
updateLayout();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
updateLayout(doScrollDownBecauseLastMessageIsVisible)
|
updateLayout()
|
||||||
}, 1000);
|
}, 1000);
|
||||||
});
|
});
|
||||||
|
|
||||||
initInputField(document.querySelector("textarea"));
|
|
||||||
updateLayout(true);
|
updateLayout(true);
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
Reference in New Issue
Block a user