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))