forked from coracle/flotilla
55 lines
1.8 KiB
Svelte
55 lines
1.8 KiB
Svelte
<script lang="ts">
|
|
import {page} from "$app/stores"
|
|
import {derived} from "svelte/store"
|
|
import {max} from "@welshman/lib"
|
|
import {matchFilter} from "@welshman/util"
|
|
import {pubkey} from "@welshman/app"
|
|
import Icon from "@lib/components/Icon.svelte"
|
|
import Button from "@lib/components/Button.svelte"
|
|
import MenuSpace from "@app/components/MenuSpace.svelte"
|
|
import {checked, getNotification, deriveNotification, THREAD_FILTERS} from "@app/notifications"
|
|
import {
|
|
userMembership,
|
|
getMembershipRoomsByUrl,
|
|
deriveEventsForUrl,
|
|
MESSAGE,
|
|
GENERAL,
|
|
} from "@app/state"
|
|
import {makeRoomPath, makeSpacePath} from "@app/routes"
|
|
import {pushDrawer} from "@app/modal"
|
|
|
|
export let url
|
|
|
|
const openMenu = () => pushDrawer(MenuSpace, {url})
|
|
|
|
const events = deriveEventsForUrl(url, [{kinds: [MESSAGE]}])
|
|
|
|
const threadsPath = makeSpacePath(url, "threads")
|
|
|
|
const threadsNotification = deriveNotification(threadsPath, THREAD_FILTERS, url)
|
|
|
|
const notification = derived(
|
|
[page, events, checked, userMembership],
|
|
([$page, $events, $checked, $userMembership]) =>
|
|
getMembershipRoomsByUrl(url, $userMembership)
|
|
.concat(GENERAL)
|
|
.some(room => {
|
|
const path = makeRoomPath(url, room)
|
|
|
|
if ($page.url.pathname === path) return false
|
|
|
|
const lastChecked = max([$checked["*"], $checked[path]])
|
|
const roomEvents = $events.filter(e => matchFilter({"#h": [room]}, e))
|
|
|
|
return getNotification($pubkey, lastChecked, roomEvents)
|
|
}),
|
|
)
|
|
</script>
|
|
|
|
<Button on:click={openMenu} class="btn btn-neutral btn-sm relative md:hidden">
|
|
<Icon icon="menu-dots" />
|
|
{#if $threadsNotification || $notification}
|
|
<div class="absolute right-0 top-0 -mr-1 -mt-1 h-2 w-2 rounded-full bg-primary" />
|
|
{/if}
|
|
</Button>
|