From 3024e08ca5fe94bcfec306fdd9b6f86ef8f5b501 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Thu, 12 Feb 2026 16:22:25 -0800 Subject: [PATCH] Fix makeFeed (maybe) --- src/app/core/requests.ts | 78 ++++++++-------------------------------- src/app/core/state.ts | 8 +++++ 2 files changed, 23 insertions(+), 63 deletions(-) diff --git a/src/app/core/requests.ts b/src/app/core/requests.ts index 448a8fe6..dfddcc3b 100644 --- a/src/app/core/requests.ts +++ b/src/app/core/requests.ts @@ -1,4 +1,4 @@ -import {get, writable} from "svelte/store" +import {get, writable, derived} from "svelte/store" import { uniq, int, @@ -24,10 +24,10 @@ import { import type {TrustedEvent, Filter, List} from "@welshman/util" import {feedFromFilters, makeRelayFeed, makeIntersectionFeed} from "@welshman/feeds" import {load, request} from "@welshman/net" -import {repository, makeFeedController, loadRelay, tracker} from "@welshman/app" +import {repository, makeFeedController, loadRelay} from "@welshman/app" import {createScroller} from "@lib/html" import {daysBetween} from "@lib/util" -import {getEventsForUrl} from "@app/core/state" +import {getEventsForUrl, deriveEventsForUrlDesc} from "@app/core/state" // Utils @@ -42,56 +42,12 @@ export const makeFeed = ({ element: HTMLElement onExhausted?: () => void }) => { - const seen = new Set() const controller = new AbortController() - const buffer = writable([]) - const events = writable([]) + const allEvents = deriveEventsForUrlDesc(url, filters) + const total = derived(allEvents, $allEvents => $allEvents.length) + const limit = writable(0) - const insertEvent = (event: TrustedEvent) => { - let handled = false - - if (seen.has(event.id)) { - return - } - - events.update($events => { - for (let i = 0; i < $events.length; i++) { - if ($events[i].id === event.id) return $events - if ($events[i].created_at < event.created_at) { - handled = true - return insertAt(i, event, $events) - } - } - - return $events - }) - - if (!handled) { - buffer.update($buffer => { - for (let i = 0; i < $buffer.length; i++) { - if ($buffer[i].id === event.id) return $buffer - if ($buffer[i].created_at < event.created_at) return insertAt(i, event, $buffer) - } - - return [...$buffer, event] - }) - } - - seen.add(event.id) - } - - const unsubscribe = on(repository, "update", ({added, removed}) => { - if (removed.size > 0) { - buffer.update($buffer => $buffer.filter(e => !removed.has(e.id))) - events.update($events => $events.filter(e => !removed.has(e.id))) - } - - for (const event of added) { - if (matchFilters(filters, event) && tracker.getRelays(event.id).has(url)) { - insertEvent(event) - } - } - }) + const events = derived([allEvents, limit], ([$allEvents, $limit]) => $allEvents.slice(0, $limit)) const ctrl = makeFeedController({ useWindowing: true, @@ -103,26 +59,22 @@ export const makeFeed = ({ const scroller = createScroller({ element, delay: 300, - threshold: 10_000, + threshold: 8_000, onScroll: async () => { - const $buffer = get(buffer) + console.log(get(events).length, get(allEvents).length) + limit.update($limit => { + if (get(total) - $limit < 100) { + ctrl.load(100) + } - events.update($events => [...$events, ...$buffer.splice(0, 30)]) - - if ($buffer.length < 100) { - ctrl.load(100) - } + return $limit + 10 + }) }, }) - for (const event of getEventsForUrl(url, filters)) { - insertEvent(event) - } - return { events, cleanup: () => { - unsubscribe() scroller.stop() controller.abort() }, diff --git a/src/app/core/state.ts b/src/app/core/state.ts index 1005790f..2922bb0f 100644 --- a/src/app/core/state.ts +++ b/src/app/core/state.ts @@ -53,6 +53,8 @@ import { deriveEventsByIdByUrl, deriveEventsByIdForUrl, getEventsByIdForUrl, + deriveEventsAsc, + deriveEventsDesc, } from "@welshman/store" import { APP_DATA, @@ -235,6 +237,12 @@ export const getEventsForUrl = (url: string, filters: Filter[] = [{}]) => export const deriveEventsForUrl = (url: string, filters: Filter[] = [{}]) => deriveArray(deriveEventsByIdForUrl({url, tracker, repository, filters})) +export const deriveEventsForUrlAsc = (url: string, filters: Filter[] = [{}]) => + deriveEventsAsc(deriveEventsByIdForUrl({url, tracker, repository, filters})) + +export const deriveEventsForUrlDesc = (url: string, filters: Filter[] = [{}]) => + deriveEventsDesc(deriveEventsByIdForUrl({url, tracker, repository, filters})) + export const deriveLatestEventForUrl = (url: string, filters: Filter[] = [{}]) => deriveDeduplicated(deriveEventsByIdForUrl({url, tracker, repository, filters}), $eventsById => first(sortEventsDesc($eventsById.values())),