Clean up feeds and listeners

This commit is contained in:
Jon Staab
2024-11-12 17:44:29 -08:00
parent 89a9d37379
commit 19ce6d1bad
8 changed files with 121 additions and 74 deletions
+1 -13
View File
@@ -1,15 +1,13 @@
<script lang="ts">
import {onMount} from "svelte"
import {page} from "$app/stores"
import {subscribe} from "@welshman/app"
import {DELETE} from "@welshman/util"
import Page from "@lib/components/Page.svelte"
import Delay from "@lib/components/Delay.svelte"
import SecondaryNav from "@lib/components/SecondaryNav.svelte"
import MenuSpace from "@app/components/MenuSpace.svelte"
import {pushToast} from "@app/toast"
import {checkRelayConnection, checkRelayAuth} from "@app/commands"
import {decodeRelay, MEMBERSHIPS, THREAD, MESSAGE, COMMENT} from "@app/state"
import {decodeRelay} from "@app/state"
$: url = decodeRelay($page.params.relay)
@@ -27,16 +25,6 @@
onMount(() => {
checkConnection()
const sub = subscribe({
filters: [
{kinds: [DELETE], "#k": [THREAD, COMMENT, MESSAGE].map(String)},
{kinds: [MEMBERSHIPS], "#r": [url]},
],
relays: [url],
})
return () => sub.close()
})
</script>
+2 -12
View File
@@ -8,9 +8,8 @@
</script>
<script lang="ts">
import {onMount} from "svelte"
import {page} from "$app/stores"
import {sortBy, ago, append} from "@welshman/lib"
import {sortBy, append} from "@welshman/lib"
import type {TrustedEvent, EventContent} from "@welshman/util"
import {createEvent} from "@welshman/util"
import {formatTimestampAsDate, publishThunk} from "@welshman/app"
@@ -35,7 +34,7 @@
COMMENT,
getMembershipRoomsByUrl,
} from "@app/state"
import {subscribePersistent, addRoomMembership, removeRoomMembership} from "@app/commands"
import {addRoomMembership, removeRoomMembership} from "@app/commands"
import {pushDrawer} from "@app/modal"
import {popKey} from "@app/implicit"
@@ -90,15 +89,6 @@
elements.reverse()
}
onMount(() => {
const unsub = subscribePersistent({
filters: [{"#~": [room], since: ago(30)}],
relays: [url],
})
return () => unsub()
})
setTimeout(() => {
loading = false
}, 5000)
+28 -22
View File
@@ -1,9 +1,9 @@
<script lang="ts">
import {onMount} from "svelte"
import {page} from "$app/stores"
import {ago, assoc} from "@welshman/lib"
import {sortBy, uniqBy} from "@welshman/lib"
import {getListTags, getPubkeyTagValues} from "@welshman/util"
import type {Filter} from "@welshman/util"
import type {Filter, TrustedEvent} from "@welshman/util"
import {feedsFromFilters, makeIntersectionFeed, makeRelayFeed} from "@welshman/feeds"
import {nthEq} from "@welshman/lib"
import {createFeedController, userMutes} from "@welshman/app"
@@ -15,40 +15,43 @@
import MenuSpace from "@app/components/MenuSpace.svelte"
import ThreadItem from "@app/components/ThreadItem.svelte"
import ThreadCreate from "@app/components/ThreadCreate.svelte"
import {THREAD, COMMENT, deriveEventsForUrl, decodeRelay} from "@app/state"
import {THREAD, COMMENT, decodeRelay} from "@app/state"
import {pushModal, pushDrawer} from "@app/modal"
import {subscribePersistent} from "@app/commands"
const url = decodeRelay($page.params.relay)
const events = deriveEventsForUrl(url, [{kinds: [THREAD]}])
const mutedPubkeys = getPubkeyTagValues(getListTags($userMutes))
const filters: Filter[] = [{kinds: [THREAD]}, {kinds: [COMMENT], "#K": [String(THREAD)]}]
const feed = makeIntersectionFeed(makeRelayFeed(url), feedsFromFilters(filters))
const openMenu = () => pushDrawer(MenuSpace, {url})
const createThread = () => pushModal(ThreadCreate, {url})
let limit = 5
let loading = true
let element: Element
let scroller: Scroller
let buffer: TrustedEvent[] = []
let events: TrustedEvent[] = []
onMount(() => {
let unmounted = false
const ctrl = createFeedController({
feed,
useWindowing: true,
feed: makeIntersectionFeed(makeRelayFeed(url), feedsFromFilters(filters)),
onEvent: (event: TrustedEvent) => {
if (
event.kind === THREAD &&
!event.tags.some(nthEq(0, "e")) &&
!mutedPubkeys.includes(event.pubkey)
) {
buffer.push(event)
}
},
onExhausted: () => {
loading = false
},
})
const unsub = subscribePersistent({
filters: filters.map(assoc("since", ago(30))),
relays: [url],
})
// Element is frequently not defined. I don't know why
setTimeout(() => {
if (!unmounted) {
@@ -56,10 +59,16 @@
element,
delay: 300,
threshold: 3000,
onScroll: async () => {
limit += 5
onScroll: () => {
buffer = uniqBy(
e => e.id,
sortBy(e => -e.created_at, buffer),
)
events = [...events, ...buffer.splice(0, 5)]
await ctrl.load(5)
if (buffer.length < 50) {
ctrl.load(50)
}
},
})
}
@@ -67,7 +76,6 @@
return () => {
unmounted = true
unsub()
scroller?.stop()
}
})
@@ -90,16 +98,14 @@
</div>
</PageBar>
<div class="flex flex-grow flex-col gap-2 overflow-auto p-2">
{#each $events.slice(0, limit) as event (event.id)}
{#if !event.tags.some(nthEq(0, "e")) && !mutedPubkeys.includes(event.pubkey)}
<ThreadItem {url} {event} />
{/if}
{#each events as event (event.id)}
<ThreadItem {url} {event} />
{/each}
<p class="flex h-10 items-center justify-center py-20">
<Spinner {loading}>
{#if loading}
Looking for threads...
{:else if $events.length === 0}
{:else if events.length === 0}
No threads found.
{/if}
</Spinner>