2022-04-19 21:21:55 +03:00
|
|
|
<script>
|
2022-04-20 17:49:31 +03:00
|
|
|
import { afterUpdate, beforeUpdate } from "svelte";
|
2022-04-19 21:21:55 +03:00
|
|
|
import { messagesStoreProvider } from "../../../stores.js";
|
|
|
|
|
|
|
|
export let channelId;
|
2022-04-20 17:49:31 +03:00
|
|
|
let scrollTarget;
|
|
|
|
let shouldAutoscroll = false;
|
2022-04-19 21:21:55 +03:00
|
|
|
|
2022-04-20 03:14:28 +03:00
|
|
|
$: messages = messagesStoreProvider.getStore(channelId);
|
2022-04-19 21:21:55 +03:00
|
|
|
|
2022-04-20 17:49:31 +03:00
|
|
|
beforeUpdate(() => {
|
|
|
|
shouldAutoscroll = scrollTarget && (scrollTarget.offsetHeight + scrollTarget.scrollTop) > (scrollTarget.scrollHeight - 20);
|
|
|
|
});
|
|
|
|
|
|
|
|
afterUpdate(() => {
|
|
|
|
if (shouldAutoscroll && scrollTarget) {
|
2022-04-20 17:53:20 +03:00
|
|
|
scrollTarget.scrollTo(0, scrollTarget.scrollHeight);
|
2022-04-20 17:49:31 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2022-04-19 21:21:55 +03:00
|
|
|
const onScroll = (e) => {
|
|
|
|
const { scrollTop, offsetHeight, scrollHeight } = e.target;
|
2022-04-20 03:14:28 +03:00
|
|
|
if (scrollTop === 0) {
|
|
|
|
messages.loadOlderMessages();
|
|
|
|
}
|
2022-04-19 21:21:55 +03:00
|
|
|
if ((scrollTop + offsetHeight) >= scrollHeight) {
|
2022-04-20 03:14:28 +03:00
|
|
|
messages.setIsCollectingOldMessages(true);
|
2022-04-19 21:21:55 +03:00
|
|
|
} else {
|
2022-04-20 03:14:28 +03:00
|
|
|
messages.setIsCollectingOldMessages(false);
|
2022-04-19 21:21:55 +03:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.messages-container {
|
|
|
|
padding: var(--space-sm);
|
|
|
|
height: 100%;
|
|
|
|
width: 100%;
|
|
|
|
flex-grow: 0;
|
|
|
|
overflow-y: auto;
|
|
|
|
background-color: var(--background-color-1);
|
|
|
|
}
|
2022-04-21 01:55:37 +03:00
|
|
|
|
|
|
|
.pending {
|
|
|
|
color: var(--foreground-color-2);
|
|
|
|
}
|
2022-04-19 21:21:55 +03:00
|
|
|
</style>
|
|
|
|
|
2022-04-20 17:53:20 +03:00
|
|
|
<div class="messages-container" on:scroll={ onScroll } bind:this={ scrollTarget }>
|
2022-04-19 21:21:55 +03:00
|
|
|
{#each $messages as message (message.id)}
|
|
|
|
<div>
|
|
|
|
<b>{ message.author_username }</b>
|
2022-04-21 01:55:37 +03:00
|
|
|
<span class:pending={ message._isPending }>{ message.content }</span>
|
2022-04-19 21:21:55 +03:00
|
|
|
</div>
|
|
|
|
{/each}
|
|
|
|
</div>
|