<script>
    import { afterUpdate, beforeUpdate, onMount } from "svelte";
    import { messagesStoreProvider } from "../stores.js";
    import Message from "./Message.svelte";

    export let channelId;
    let scrollTarget;
    let scrollAnchor;
    let shouldAutoscroll = true;
    let lastScrollHeight = null;

    $: messages = messagesStoreProvider.getStore(channelId);

    afterUpdate(() => {
        // hacky way to preserve scroll position when messages are pushed back
        if (lastScrollHeight) {
            scrollTarget.scrollTop = scrollTarget.scrollHeight - lastScrollHeight;
            lastScrollHeight = null;
            return;
        }
        if (shouldAutoscroll && scrollAnchor) {
            scrollAnchor.scrollIntoView(false);
        }
    });

    const onScroll = (e) => {
        const { scrollTop, offsetHeight, scrollHeight } = e.target;
        if ((scrollTop + offsetHeight) >= scrollHeight) { // user scrolled to bottom
            messages.setIsCollectingOldMessages(true);
            shouldAutoscroll = true;
        } else {
            shouldAutoscroll = false;
            if (scrollTop === 0) {
                // load older messages if the user scrolls to the top.
                // save the current scroll height if the server returned any messages,
                // before commiting them to the store. this is to provide the jank scroll height
                // preservation
                messages.loadOlderMessages(() => {
                    if (scrollTarget)
                        lastScrollHeight = scrollTarget.scrollHeight;
                });
            }
            messages.setIsCollectingOldMessages(false);
        }
    };

</script>

<style>
    .messages-container {
        height: 100%;
        width: 100%;
        flex-grow: 0;
        overflow-y: auto;
        overflow-x: hidden;
        background-color: var(--background-color-1);
    }
</style>

<div class="messages-container" on:scroll={ onScroll } bind:this={ scrollTarget }>
    {#each $messages as message (message.id)}
        <Message message={message} />
    {/each}
    <div bind:this={ scrollAnchor } />
</div>
