From 0db751bd45851616ac8f30c4937d1792c3253096 Mon Sep 17 00:00:00 2001 From: Bhavishy Date: Tue, 14 Apr 2026 19:26:43 +0530 Subject: [PATCH] fix: stabilize list loading and show correct list count --- src/app/components/BookmarkCard.svelte | 142 +++++ .../components/BookmarkEventMenuItem.svelte | 23 + src/app/components/BookmarkGrid.svelte | 38 ++ src/app/components/BookmarkListPicker.svelte | 48 +- src/app/components/BookmarkSidebar.svelte | 247 +++++++++ .../components/CalendarEventActions.svelte | 2 + src/app/components/ClassifiedActions.svelte | 2 + src/app/components/CommentActions.svelte | 7 +- src/app/components/PrimaryNav.svelte | 112 +++- src/app/components/ThreadActions.svelte | 7 +- src/app/core/commands.ts | 124 ++--- src/app/core/state.ts | 48 ++ src/routes/bookmarks/+page.svelte | 483 +++--------------- 13 files changed, 792 insertions(+), 491 deletions(-) create mode 100644 src/app/components/BookmarkCard.svelte create mode 100644 src/app/components/BookmarkEventMenuItem.svelte create mode 100644 src/app/components/BookmarkGrid.svelte create mode 100644 src/app/components/BookmarkSidebar.svelte diff --git a/src/app/components/BookmarkCard.svelte b/src/app/components/BookmarkCard.svelte new file mode 100644 index 00000000..7f942843 --- /dev/null +++ b/src/app/components/BookmarkCard.svelte @@ -0,0 +1,142 @@ + + + + + +
+
+ +
+

+ {displayProfileByPubkey(item.event.pubkey)} +

+

+ {displayPubkey(item.event.pubkey)} · {formatTimestamp(item.event.created_at)} +

+
+
+ + +
+ + {#if item.image} + + {:else if item.video} + + {/if} + + + diff --git a/src/app/components/BookmarkEventMenuItem.svelte b/src/app/components/BookmarkEventMenuItem.svelte new file mode 100644 index 00000000..ae0cb4b3 --- /dev/null +++ b/src/app/components/BookmarkEventMenuItem.svelte @@ -0,0 +1,23 @@ + + +
  • + +
  • diff --git a/src/app/components/BookmarkGrid.svelte b/src/app/components/BookmarkGrid.svelte new file mode 100644 index 00000000..c9fc5ad9 --- /dev/null +++ b/src/app/components/BookmarkGrid.svelte @@ -0,0 +1,38 @@ + + +
    + {#each items as item (item.key)} + + {:else} +
    + No items match your current filters. +
    + {/each} +
    diff --git a/src/app/components/BookmarkListPicker.svelte b/src/app/components/BookmarkListPicker.svelte index 039a0c24..f649564b 100644 --- a/src/app/components/BookmarkListPicker.svelte +++ b/src/app/components/BookmarkListPicker.svelte @@ -2,7 +2,14 @@ import {onMount} from "svelte" import {first, uniqBy} from "@welshman/lib" import type {TrustedEvent} from "@welshman/util" - import {DELETE, getTagValue, getTagValues, sortEventsDesc} from "@welshman/util" + import { + Address, + DELETE, + getAddress, + getTagValue, + getTagValues, + sortEventsDesc, + } from "@welshman/util" import {load} from "@welshman/net" import {pubkey, waitForThunkError} from "@welshman/app" import Bookmark from "@assets/icons/bookmark.svg?dataurl" @@ -18,7 +25,13 @@ import ModalTitle from "@lib/components/ModalTitle.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" import {createBookmarkList, addEventBookmark, deleteBookmarkList} from "@app/core/commands" - import {deriveEvents, INDEXER_RELAYS, shouldIgnoreError} from "@app/core/state" + import { + BOOKMARKS, + BOOKMARK_LISTS, + deriveEvents, + INDEXER_RELAYS, + shouldIgnoreError, + } from "@app/core/state" import {pushToast} from "@app/util/toast" type Props = { @@ -36,10 +49,14 @@ const listEvents = deriveEvents([{kinds: [10003, 30003, DELETE]}]) const getListKey = (listEvent: TrustedEvent) => - `${listEvent.kind}:${getTagValue("d", listEvent.tags) || ""}` + listEvent.kind === BOOKMARKS + ? new Address(BOOKMARKS, listEvent.pubkey, "").toString() + : getAddress(listEvent) const getListLabel = (listEvent: TrustedEvent) => - getTagValue("d", listEvent.tags) || (listEvent.kind === 10003 ? "Saved Items" : "Untitled List") + getTagValue("title", listEvent.tags) || + getTagValue("d", listEvent.tags) || + (listEvent.kind === BOOKMARKS ? "Saved Items" : "Untitled List") const userLists = $derived( sortEventsDesc($listEvents).filter( @@ -54,8 +71,7 @@ ) const isDeletedList = (listEvent: TrustedEvent) => { - const d = getTagValue("d", listEvent.tags) || "" - const address = `${listEvent.kind}:${listEvent.pubkey}:${d}` + const address = getListKey(listEvent) return userDeletes.some(deleteEvent => { if (deleteEvent.created_at < listEvent.created_at) { @@ -82,13 +98,13 @@ }), ) - const savedItems = first(mapped.filter(list => list.key === "10003:")) || { - key: "10003:", + const savedItems = first(mapped.filter(list => Address.from(list.key).kind === BOOKMARKS)) || { + key: $pubkey ? new Address(BOOKMARKS, $pubkey, "").toString() : "10003:", label: "Saved Items", count: 0, } - return [savedItems, ...mapped.filter(list => list.key !== "10003:")] + return [savedItems, ...mapped.filter(list => Address.from(list.key).kind !== BOOKMARKS)] }) let listName = $state("") @@ -159,7 +175,7 @@ } const deleteList = async (key: string, label: string) => { - if (deleting || key === "10003:") { + if (deleting || Address.from(key).kind === BOOKMARKS) { return } @@ -198,7 +214,7 @@ await load({ relays: INDEXER_RELAYS, - filters: [{kinds: [10003, 30003, DELETE], authors: [$pubkey]}], + filters: [{kinds: [BOOKMARKS, BOOKMARK_LISTS, DELETE], authors: [$pubkey]}], }) } @@ -249,7 +265,9 @@ onclick={() => addToList(list.key, list.label)} disabled={selecting}> - + {list.label} {list.count} @@ -257,12 +275,14 @@ {:else}
    - + {list.label}
    {list.count} - {#if list.key !== "10003:"} + {#if Address.from(list.key).kind !== BOOKMARKS} +
    + + +
    + {#each lists as list (list.key)} +
    openListMenu(event, list.key, list.label)}> + +
    +
    +

    + + + {list.label} + +

    + {list.count} +
    +
    + +
    + {:else} +
    No lists found yet.
    + {/each} +
    + + {#if menuOpen} + + {/if} + + {#if listDialogMode} +
    + +
    + +
    +
    + {/if} + diff --git a/src/app/components/CalendarEventActions.svelte b/src/app/components/CalendarEventActions.svelte index 864fe35f..676e189c 100644 --- a/src/app/components/CalendarEventActions.svelte +++ b/src/app/components/CalendarEventActions.svelte @@ -12,6 +12,7 @@ import EventActivity from "@app/components/EventActivity.svelte" import EventActions from "@app/components/EventActions.svelte" import CalendarEventEdit from "@app/components/CalendarEventEdit.svelte" + import BookmarkEventMenuItem from "@app/components/BookmarkEventMenuItem.svelte" import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands" import {makeCalendarPath, makeSpacePath} from "@app/util/routes" import {pushModal} from "@app/util/modal" @@ -51,6 +52,7 @@ {/if} {#snippet customActions()} + {#if event.pubkey === $pubkey}
  • diff --git a/src/app/components/PrimaryNav.svelte b/src/app/components/PrimaryNav.svelte index 0dab1210..f8d25136 100644 --- a/src/app/components/PrimaryNav.svelte +++ b/src/app/components/PrimaryNav.svelte @@ -1,6 +1,18 @@