blob: 1b23bc11d57e9f469caf9a399b3eeb6c768890f1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<script>
import { messages } from '$lib/store';
import Message from './Message.svelte';
import MessageRun from './MessageRun.svelte';
export let channel = null;
$: messageList = channel !== null ? $messages.inChannel(channel) : [];
function *chunkBy(xs, fn) {
let chunk;
let key;
for (let x of xs) {
let newKey = fn(x);
if (key !== newKey) {
if (chunk !== undefined) {
yield [key, chunk];
}
chunk = [x];
key = newKey;
} else {
chunk.push(x);
}
}
if (chunk !== undefined) {
yield [key, chunk];
}
}
let container;
// TODO: eventually, store scroll height/last unread in channel? scroll there?
let scroll = (message) => {
message.scrollIntoView();
}
</script>
<div class="container" bind:this={container}>
{#each chunkBy(messageList, msg => msg.sender) as [sender, messages]}
<div use:scroll>
<MessageRun {sender} {messages} />
</div>
{/each}
</div>
<style>
.container {
overflow: scroll;
}
</style>
|