From 2696bdb57ade99ee12732ce6563a56a525f320b3 Mon Sep 17 00:00:00 2001 From: Gigi Date: Thu, 2 Oct 2025 22:28:47 +0200 Subject: [PATCH] fix(bookmarks): dedupe individual bookmarks by id to avoid duplicates in UI --- src/services/bookmarkHelpers.ts | 12 ++++++++++++ src/services/bookmarkService.ts | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/services/bookmarkHelpers.ts b/src/services/bookmarkHelpers.ts index ada30053..a433c1dc 100644 --- a/src/services/bookmarkHelpers.ts +++ b/src/services/bookmarkHelpers.ts @@ -119,4 +119,16 @@ export function hasNip04Decrypt(obj: unknown): obj is { nip04: { decrypt: Decryp return typeof nip04?.decrypt === 'function' } +export function dedupeBookmarksById(bookmarks: IndividualBookmark[]): IndividualBookmark[] { + const seen = new Set() + const result: IndividualBookmark[] = [] + for (const b of bookmarks) { + if (!seen.has(b.id)) { + seen.add(b.id) + result.push(b) + } + } + return result +} + diff --git a/src/services/bookmarkService.ts b/src/services/bookmarkService.ts index 5a838877..7492a53a 100644 --- a/src/services/bookmarkService.ts +++ b/src/services/bookmarkService.ts @@ -8,7 +8,8 @@ import { isAccountWithExtension, isHexId, hasNip04Decrypt, - hasNip44Decrypt + hasNip44Decrypt, + dedupeBookmarksById } from './bookmarkHelpers' import { Bookmark } from '../types/bookmarks' import { collectBookmarksFromEvents } from './bookmarkProcessing.ts' @@ -106,10 +107,10 @@ export const fetchBookmarks = async ( console.warn('Failed to fetch events for hydration:', error) } } - const allBookmarks = [ + const allBookmarks = dedupeBookmarksById([ ...hydrateItems(publicItemsAll, idToEvent), ...hydrateItems(privateItemsAll, idToEvent) - ] + ]) // Sort individual bookmarks by timestamp (newest first) const sortedBookmarks = allBookmarks.sort((a, b) => (b.created_at || 0) - (a.created_at || 0))