diff --git a/src/services/nostrverseHighlightsController.ts b/src/services/nostrverseHighlightsController.ts index 4456d97f..4c007b7d 100644 --- a/src/services/nostrverseHighlightsController.ts +++ b/src/services/nostrverseHighlightsController.ts @@ -81,13 +81,16 @@ class NostrverseHighlightsController { const currentGeneration = this.generation this.setLoading(true) - try { - const seenIds = new Set() - const highlightsMap = new Map() + try { + const seenIds = new Set() + // Start with existing highlights when doing incremental sync + const highlightsMap = new Map( + this.currentHighlights.map(h => [h.id, h]) + ) - const lastSyncedAt = force ? null : this.getLastSyncedAt() - const filter: { kinds: number[]; since?: number } = { kinds: [KINDS.Highlights] } - if (lastSyncedAt) filter.since = lastSyncedAt + const lastSyncedAt = force ? null : this.getLastSyncedAt() + const filter: { kinds: number[]; since?: number } = { kinds: [KINDS.Highlights] } + if (lastSyncedAt) filter.since = lastSyncedAt const events = await queryEvents( relayPool, @@ -111,22 +114,24 @@ class NostrverseHighlightsController { if (currentGeneration !== this.generation) return - events.forEach(evt => eventStore.add(evt)) + events.forEach(evt => eventStore.add(evt)) - const highlights = events.map(eventToHighlight) - const unique = Array.from(new Map(highlights.map(h => [h.id, h])).values()) - const sorted = sortHighlights(unique) + const highlights = events.map(eventToHighlight) + // Merge new highlights with existing ones + highlights.forEach(h => highlightsMap.set(h.id, h)) + const sorted = sortHighlights(Array.from(highlightsMap.values())) - this.currentHighlights = sorted - this.loaded = true - this.emitHighlights(sorted) + this.currentHighlights = sorted + this.loaded = true + this.emitHighlights(sorted) if (sorted.length > 0) { const newest = Math.max(...sorted.map(h => h.created_at)) this.setLastSyncedAt(newest) } } catch (err) { - this.currentHighlights = [] + // On error, keep existing highlights instead of clearing them + console.error('[nostrverse-highlights] Failed to sync:', err) this.emitHighlights(this.currentHighlights) } finally { if (currentGeneration === this.generation) this.setLoading(false)