diff --git a/packages/app/src/Element/LiveEvent.tsx b/packages/app/src/Element/LiveEvent.tsx
index d13354a0..75847998 100644
--- a/packages/app/src/Element/LiveEvent.tsx
+++ b/packages/app/src/Element/LiveEvent.tsx
@@ -14,8 +14,8 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) {
}
}, [video, ev]);
return (
-
-
+
+
);
}
diff --git a/packages/app/src/Element/Thread.tsx b/packages/app/src/Element/Thread.tsx
index eb6878f7..21a433f2 100644
--- a/packages/app/src/Element/Thread.tsx
+++ b/packages/app/src/Element/Thread.tsx
@@ -261,8 +261,11 @@ export default function Thread() {
// Root is the parent of the current note or the current note if its a root note or the root of the thread
const root = useMemo(() => {
const currentNote =
- thread.data?.find(ne => ne.id === currentId) ??
- (location.state && "sig" in location.state ? (location.state as TaggedRawEvent) : undefined);
+ thread.data?.find(
+ ne =>
+ ne.id === currentId ||
+ (link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author)
+ ) ?? (location.state && "sig" in location.state ? (location.state as TaggedRawEvent) : undefined);
if (currentNote) {
const currentThread = EventExt.extractThread(currentNote);
const isRoot = (ne?: ThreadInfo) => ne === undefined;
diff --git a/packages/app/src/Feed/ThreadFeed.ts b/packages/app/src/Feed/ThreadFeed.ts
index b8488dcf..15765351 100644
--- a/packages/app/src/Feed/ThreadFeed.ts
+++ b/packages/app/src/Feed/ThreadFeed.ts
@@ -1,5 +1,5 @@
import { useEffect, useMemo, useState } from "react";
-import { u256, EventKind, NostrLink, FlatNoteStore, RequestBuilder } from "@snort/system";
+import { u256, EventKind, NostrLink, FlatNoteStore, RequestBuilder, NostrPrefix } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { appendDedupe } from "SnortUtils";
@@ -11,13 +11,9 @@ interface RelayTaggedEventId {
relay?: string;
}
export default function useThreadFeed(link: NostrLink) {
- const linkTagged = {
- id: link.id,
- relay: link.relays?.[0],
- };
- const [trackingEvents, setTrackingEvent] = useState
>([linkTagged]);
+ const [trackingEvents, setTrackingEvent] = useState>([]);
const [trackingATags, setTrackingATags] = useState([]);
- const [allEvents, setAllEvents] = useState>([linkTagged]);
+ const [allEvents, setAllEvents] = useState>([]);
const pref = useLogin().preferences;
const sub = useMemo(() => {
@@ -25,22 +21,25 @@ export default function useThreadFeed(link: NostrLink) {
sub.withOptions({
leaveOpen: true,
});
- const fTracking = sub.withFilter();
- for (const te of trackingEvents) {
- fTracking.id(te.id, te.relay);
+ if (trackingEvents.length > 0) {
+ const fTracking = sub.withFilter();
+ for (const te of trackingEvents) {
+ fTracking.id(te.id, te.relay);
+ }
+ }
+ if (allEvents.length > 0) {
+ sub
+ .withFilter()
+ .kinds(
+ pref.enableReactions
+ ? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt]
+ : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost]
+ )
+ .tag(
+ "e",
+ allEvents.map(a => a.id)
+ );
}
- sub
- .withFilter()
- .kinds(
- pref.enableReactions
- ? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt]
- : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost]
- )
- .tag(
- "e",
- allEvents.map(a => a.id)
- );
-
if (trackingATags.length > 0) {
const parsed = trackingATags.map(a => a.split(":"));
sub
@@ -51,6 +50,7 @@ export default function useThreadFeed(link: NostrLink) {
"d",
parsed.map(a => a[2])
);
+ sub.withFilter().tag("a", trackingATags);
}
return sub;
}, [trackingEvents, trackingATags, allEvents, pref]);
@@ -58,9 +58,17 @@ export default function useThreadFeed(link: NostrLink) {
const store = useRequestBuilder(System, FlatNoteStore, sub);
useEffect(() => {
- setTrackingATags([]);
- setTrackingEvent([linkTagged]);
- setAllEvents([linkTagged]);
+ if (link.type === NostrPrefix.Address) {
+ setTrackingATags([`${link.kind}:${link.author}:${link.id}`]);
+ } else {
+ setTrackingEvent([
+ {
+ id: link.id,
+ relay: link.relays?.[0],
+ },
+ ]);
+ }
+ setAllEvents([]);
}, [link.id]);
useEffect(() => {
diff --git a/packages/system/src/Nostr.ts b/packages/system/src/Nostr.ts
index 86e66597..460fb7ba 100644
--- a/packages/system/src/Nostr.ts
+++ b/packages/system/src/Nostr.ts
@@ -46,6 +46,7 @@ export interface ReqFilter {
"#t"?: string[];
"#d"?: string[];
"#r"?: string[];
+ "#a"?: string[];
search?: string;
since?: number;
until?: number;
diff --git a/packages/system/src/RequestBuilder.ts b/packages/system/src/RequestBuilder.ts
index 01d728af..df34c39d 100644
--- a/packages/system/src/RequestBuilder.ts
+++ b/packages/system/src/RequestBuilder.ts
@@ -204,7 +204,7 @@ export class RequestFilterBuilder {
return this;
}
- tag(key: "e" | "p" | "d" | "t" | "r", value?: Array) {
+ tag(key: "e" | "p" | "d" | "t" | "r" | "a", value?: Array) {
if (!value) return this;
this.#filter[`#${key}`] = appendDedupe(this.#filter[`#${key}`], value);
return this;