From c2d2bd81061fd01f71d5904410295bb10b902bd5 Mon Sep 17 00:00:00 2001 From: Gigi Date: Wed, 15 Oct 2025 19:56:07 +0200 Subject: [PATCH] fix: prevent highlights from disappearing on external URLs - Improve error handling in fetchHighlightsForUrl to prevent silent failures - Remove redundant setHighlights call that was overwriting streamed highlights - Add logging to help diagnose highlight fetching issues - Isolate rebroadcast errors so they don't break highlight display --- src/hooks/useExternalUrlLoader.ts | 8 ++++---- src/services/highlights/fetchForUrl.ts | 23 ++++++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/hooks/useExternalUrlLoader.ts b/src/hooks/useExternalUrlLoader.ts index 8dae6e71..598f1220 100644 --- a/src/hooks/useExternalUrlLoader.ts +++ b/src/hooks/useExternalUrlLoader.ts @@ -71,7 +71,7 @@ export function useExternalUrlLoader({ // Check if fetchHighlightsForUrl exists, otherwise skip if (typeof fetchHighlightsForUrl === 'function') { const seen = new Set() - const highlightsList = await fetchHighlightsForUrl( + await fetchHighlightsForUrl( relayPool, url, (highlight) => { @@ -84,9 +84,9 @@ export function useExternalUrlLoader({ }) } ) - // Ensure final list is sorted and contains all items - setHighlights(highlightsList.sort((a, b) => b.created_at - a.created_at)) - console.log(`📌 Found ${highlightsList.length} highlights for URL`) + // Highlights are already set via the streaming callback + // No need to set them again as that could cause a flash/disappearance + console.log(`📌 Finished fetching highlights for URL`) } else { console.log('📌 Highlight fetching for URLs not yet implemented') } diff --git a/src/services/highlights/fetchForUrl.ts b/src/services/highlights/fetchForUrl.ts index b71b6ebf..0f94fce7 100644 --- a/src/services/highlights/fetchForUrl.ts +++ b/src/services/highlights/fetchForUrl.ts @@ -14,10 +14,11 @@ export const fetchHighlightsForUrl = async ( onHighlight?: (highlight: Highlight) => void, settings?: UserSettings ): Promise => { + const seenIds = new Set() + const orderedRelaysUrl = prioritizeLocalRelays(RELAYS) + const { local: localRelaysUrl, remote: remoteRelaysUrl } = partitionRelays(orderedRelaysUrl) + try { - const seenIds = new Set() - const orderedRelaysUrl = prioritizeLocalRelays(RELAYS) - const { local: localRelaysUrl, remote: remoteRelaysUrl } = partitionRelays(orderedRelaysUrl) const local$ = localRelaysUrl.length > 0 ? relayPool .req(localRelaysUrl, { kinds: [9802], '#r': [url] }) @@ -45,11 +46,23 @@ export const fetchHighlightsForUrl = async ( ) : new Observable((sub) => sub.complete()) const rawEvents: NostrEvent[] = await lastValueFrom(merge(local$, remote$).pipe(toArray())) - await rebroadcastEvents(rawEvents, relayPool, settings) + + console.log(`📌 Fetched ${rawEvents.length} highlight events for URL:`, url) + + // Rebroadcast events - but don't let errors here break the highlight display + try { + await rebroadcastEvents(rawEvents, relayPool, settings) + } catch (err) { + console.warn('Failed to rebroadcast highlight events:', err) + } + const uniqueEvents = dedupeHighlights(rawEvents) const highlights: Highlight[] = uniqueEvents.map(eventToHighlight) return sortHighlights(highlights) - } catch { + } catch (err) { + console.error('Error fetching highlights for URL:', err) + // Return highlights that were already streamed via callback + // Don't return empty array as that would clear already-displayed highlights return [] } }