diff --git a/.changeset/three-cats-refuse.md b/.changeset/three-cats-refuse.md
new file mode 100644
index 000000000..4ab5e07aa
--- /dev/null
+++ b/.changeset/three-cats-refuse.md
@@ -0,0 +1,5 @@
+---
+"nostrudel": minor
+---
+
+Rebuild thread loading
diff --git a/src/app.tsx b/src/app.tsx
index 596674bc0..be35067e0 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -14,7 +14,7 @@ import SettingsView from "./views/settings";
import NostrLinkView from "./views/link";
import ProfileView from "./views/profile";
import HashTagView from "./views/hashtag";
-import NoteView from "./views/note";
+import ThreadView from "./views/note";
import NotificationsView from "./views/notifications";
import DirectMessagesView from "./views/messages";
import DirectMessageChatView from "./views/messages/chat";
@@ -216,7 +216,7 @@ const router = createHashRouter([
},
{
path: "/n/:id",
- element: ,
+ element: ,
},
{ path: "settings", element: },
{
diff --git a/src/classes/thread-loader.ts b/src/classes/thread-loader.ts
deleted file mode 100644
index 2cea5c8f9..000000000
--- a/src/classes/thread-loader.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import { getReferences } from "../helpers/nostr/events";
-import { NostrEvent } from "../types/nostr-event";
-import NostrRequest from "./nostr-request";
-import NostrMultiSubscription from "./nostr-multi-subscription";
-import { PersistentSubject } from "./subject";
-import { createSimpleQueryMap } from "../helpers/nostr/filter";
-
-/** @deprecated */
-export default class ThreadLoader {
- loading = new PersistentSubject(false);
- focusId = new PersistentSubject("");
- rootId = new PersistentSubject("");
- events = new PersistentSubject>({});
-
- private relays: string[];
- private subscription: NostrMultiSubscription;
-
- constructor(relays: string[], eventId: string) {
- this.relays = relays;
-
- this.subscription = new NostrMultiSubscription();
-
- this.subscription.onEvent.subscribe((event) => {
- this.events.next({ ...this.events.value, [event.id]: event });
- });
-
- this.updateEventId(eventId);
- }
-
- loadEvent() {
- this.loading.next(true);
- const request = new NostrRequest(this.relays);
- request.onEvent.subscribe((event) => {
- this.events.next({ ...this.events.value, [event.id]: event });
-
- this.checkAndUpdateRoot();
-
- request.complete();
- this.loading.next(false);
- });
- request.start({ ids: [this.focusId.value] });
- }
-
- private checkAndUpdateRoot() {
- const event = this.events.value[this.focusId.value];
-
- if (event) {
- const refs = getReferences(event);
- const rootId = refs.rootId || event.id;
- // only update the root if its different
- if (rootId !== this.rootId.value) {
- this.rootId.next(rootId);
- this.loadRoot();
- this.updateSubscription();
- }
- }
- }
-
- loadRoot() {
- if (this.rootId.value) {
- const request = new NostrRequest(this.relays);
- request.onEvent.subscribe((event) => {
- this.events.next({ ...this.events.value, [event.id]: event });
-
- request.complete();
- });
- request.start({ ids: [this.rootId.value] });
- }
- }
-
- setRelays(relays: string[]) {
- this.relays = relays;
- this.subscription.setQueryMap(createSimpleQueryMap(this.relays, { "#e": [this.rootId.value], kinds: [1] }));
- this.loadEvent();
- }
-
- private updateSubscription() {
- if (this.rootId.value) {
- this.subscription.setQueryMap(createSimpleQueryMap(this.relays, { "#e": [this.rootId.value], kinds: [1] }));
- if (this.subscription.state !== NostrMultiSubscription.OPEN) {
- this.subscription.open();
- }
- }
- }
-
- updateEventId(eventId: string) {
- if (this.loading.value) {
- console.warn("trying to set eventId while loading");
- return;
- }
-
- this.focusId.next(eventId);
-
- const event = this.events.value[eventId];
- if (!event) {
- this.loadEvent();
- } else {
- this.checkAndUpdateRoot();
- }
- }
-
- open() {
- if (!this.loading.value && this.focusId.value && this.events.value[this.focusId.value]) {
- this.loadEvent();
- }
- this.updateSubscription();
- }
- close() {
- this.subscription.close();
- }
-}
diff --git a/src/classes/timeline-loader.ts b/src/classes/timeline-loader.ts
index a9d6d3f46..f1ecab8ab 100644
--- a/src/classes/timeline-loader.ts
+++ b/src/classes/timeline-loader.ts
@@ -197,9 +197,6 @@ export default class TimelineLoader {
mapQueryMap(this.queryMap, (filter) => addQueryToFilter(filter, { limit: BLOCK_SIZE / 2 })),
);
- // TODO: maybe smartly prune the events based on the new filter
- this.forgetEvents();
-
this.triggerBlockLoads();
}
diff --git a/src/components/embed-event/event-types/embedded-note.tsx b/src/components/embed-event/event-types/embedded-note.tsx
index f0a8dc472..6167c5baa 100644
--- a/src/components/embed-event/event-types/embedded-note.tsx
+++ b/src/components/embed-event/event-types/embedded-note.tsx
@@ -16,6 +16,7 @@ import { getSharableEventAddress } from "../../../helpers/nip19";
import { CompactNoteContent } from "../../compact-note-content";
import { useNavigateInDrawer } from "../../../providers/drawer-sub-view-provider";
import HoverLinkOverlay from "../../hover-link-overlay";
+import singleEventService from "../../../services/single-event";
export default function EmbeddedNote({ event, ...props }: Omit & { event: NostrEvent }) {
const { showSignatureVerification } = useSubject(appSettings);
@@ -25,6 +26,7 @@ export default function EmbeddedNote({ event, ...props }: Omit(
(e) => {
e.preventDefault();
+ singleEventService.handleEvent(event);
navigate(to);
},
[navigate, to],
diff --git a/src/components/note/components/bookmark-button.tsx b/src/components/note/components/bookmark-button.tsx
index 302564096..a315396b9 100644
--- a/src/components/note/components/bookmark-button.tsx
+++ b/src/components/note/components/bookmark-button.tsx
@@ -76,7 +76,7 @@ export default function BookmarkButton({ event, ...props }: { event: NostrEvent
return (
<>
-