diff options
| author | Kit La Touche <kit@transneptune.net> | 2024-11-29 14:36:04 -0500 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2024-11-29 14:41:17 -0500 |
| commit | e0d93f326722609a0ba50da106ace9b7a43bbc7b (patch) | |
| tree | b2f924fc8878a29787fffb23358bcd0186e7bdd2 /ui/routes/(app)/+layout.svelte | |
| parent | f8ecf97e66b999882bfa8750af111e9cf73ea89c (diff) | |
Enrich channels with hasUnread attribute
This requires both the channels and messages stores to be available, so
we do it in the page file where we've got those stores handy. It's a bit
inefficient (it recreates the entire enrichedChannels array every time
one of them changes), but it'll do for now.
There's also a TODO hinting that we might want an idea of unread-count.
I think that would require a distinct idea of mentions, because we just
want "fact of unread" for general-availability channels, not "this many
messages since you were last here".
Diffstat (limited to 'ui/routes/(app)/+layout.svelte')
| -rw-r--r-- | ui/routes/(app)/+layout.svelte | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/ui/routes/(app)/+layout.svelte b/ui/routes/(app)/+layout.svelte index ad8227e..81324fd 100644 --- a/ui/routes/(app)/+layout.svelte +++ b/ui/routes/(app)/+layout.svelte @@ -19,6 +19,35 @@ let loading = $state(true); let channel = $derived($page.params.channel); + let rawChannels; + channelsList.subscribe((val) => { + rawChannels = val.channels; + }); + let rawMessages; + messages.subscribe((val) => { + rawMessages = val; + }); + + let enrichedChannels = $derived.by(() => { + const channels = rawChannels; + const messages = rawMessages; + const enrichedChannels = []; + if (channels && messages) { + for (let ch of channels) { + let runs = messages.inChannel(ch.id); + let lastRun = runs?.slice(-1)[0]; + let lastMessage = lastRun?.messages.slice(-1)[0]; + let lastMessageAt = lastMessage?.at; + let hasUnreads = lastMessageAt > ch.lastReadAt; + enrichedChannels.push({ + ...ch, + hasUnreads, + }); + } + } + return enrichedChannels; + }); + function onBooted(boot) { currentUser.set({ id: boot.login.id, @@ -78,6 +107,7 @@ </script> <svelte:head> + <!-- TODO: unread count? --> <title>pilcrow</title> </svelte:head> @@ -87,7 +117,7 @@ <div id="interface" class="p-2"> <nav id="sidebar" data-expanded={pageContext.showMenu}> <div class="channel-list"> - <ChannelList active={channel} channels={$channelsList.channels} /> + <ChannelList active={channel} channels={enrichedChannels} /> </div> <div class="create-channel"> <CreateChannelForm /> |
