From 89bb9ad2d04123713f0f766d7a354cc5827e3c0c Mon Sep 17 00:00:00 2001 From: codytseng Date: Fri, 2 Jan 2026 02:53:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=92=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/NoteList/index.tsx | 8 ++++++- src/components/NotificationList/index.tsx | 25 +++++++++++++------- src/components/UserAggregationList/index.tsx | 2 +- src/lib/timeline.ts | 10 ++++---- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/components/NoteList/index.tsx b/src/components/NoteList/index.tsx index 94c26ac..850ee99 100644 --- a/src/components/NoteList/index.tsx +++ b/src/components/NoteList/index.tsx @@ -137,7 +137,13 @@ const NoteList = forwardRef< const filteredEvents: Event[] = [] const keys: string[] = [] - const mergedEvents = mergeTimelines([events, storedEvents], LIMIT) + let mergedEvents: Event[] = events + if ( + storedEvents.length && + (!events.length || storedEvents[0].created_at >= events[events.length - 1].created_at) + ) { + mergedEvents = mergeTimelines([storedEvents, events]) + } mergedEvents.forEach((evt) => { const key = getEventKey(evt) if (keySet.has(key)) return diff --git a/src/components/NotificationList/index.tsx b/src/components/NotificationList/index.tsx index b303602..7613cfa 100644 --- a/src/components/NotificationList/index.tsx +++ b/src/components/NotificationList/index.tsx @@ -211,14 +211,23 @@ const NotificationList = forwardRef((_, ref) => { }, [timelineKey, until, pubkey, setEvents, setUntil]) const notifications = useMemo(() => { - return mergeTimelines( - [ - events.filter((evt) => evt.pubkey !== pubkey), - storedEvents.filter((evt) => evt.pubkey !== pubkey) - ], - LIMIT - ) - }, [events, storedEvents, pubkey]) + const filteredEvents = events.filter((evt) => evt.pubkey !== pubkey) + if (storedEvents.length === 0) return filteredEvents + + const filteredStoredEvents = storedEvents.filter((evt) => evt.pubkey !== pubkey) + if (!initialLoading) { + return mergeTimelines([filteredEvents, filteredStoredEvents]) + } + + if ( + !filteredEvents.length || + storedEvents[0].created_at >= filteredEvents[filteredEvents.length - 1].created_at + ) { + return mergeTimelines([filteredEvents, filteredStoredEvents]) + } + // Stored events are too old + return filteredEvents + }, [events, storedEvents, pubkey, initialLoading]) const { visibleItems, shouldShowLoadingIndicator, bottomRef, setShowCount } = useInfiniteScroll({ items: notifications, diff --git a/src/components/UserAggregationList/index.tsx b/src/components/UserAggregationList/index.tsx index 90b9573..bf8dfe1 100644 --- a/src/components/UserAggregationList/index.tsx +++ b/src/components/UserAggregationList/index.tsx @@ -293,7 +293,7 @@ const UserAggregationList = forwardRef< }, [since]) useEffect(() => { - const mergedEvents = mergeTimelines([events, storedEvents], LIMIT) + const mergedEvents = mergeTimelines([events, storedEvents]) filterEvents(mergedEvents).then((filtered) => { setFilteredEvents(filtered) }) diff --git a/src/lib/timeline.ts b/src/lib/timeline.ts index 7489416..feb6743 100644 --- a/src/lib/timeline.ts +++ b/src/lib/timeline.ts @@ -1,13 +1,13 @@ import { NostrEvent } from 'nostr-tools' import { compareEvents } from './event' -export function mergeTimelines(timelines: NostrEvent[][], limit: number) { +export function mergeTimelines(timelines: NostrEvent[][], limit?: number) { if (timelines.length === 0) return [] if (timelines.length === 1) return [...timelines[0]] return timelines.reduce((merged, current) => _mergeTimelines(merged, current, limit), []) } -function _mergeTimelines(a: NostrEvent[], b: NostrEvent[], limit: number): NostrEvent[] { +function _mergeTimelines(a: NostrEvent[], b: NostrEvent[], limit?: number): NostrEvent[] { if (a.length === 0) return [...b] if (b.length === 0) return [...a] @@ -29,16 +29,16 @@ function _mergeTimelines(a: NostrEvent[], b: NostrEvent[], limit: number): Nostr } } - if (result.length >= limit) { + if (limit && result.length >= limit) { return result } - while (i < a.length && result.length < limit) { + while (i < a.length && (!limit || result.length < limit)) { result.push(a[i]) i++ } - while (j < b.length && result.length < limit) { + while (j < b.length && (!limit || result.length < limit)) { result.push(b[j]) j++ }