diff --git a/client/src/components/Thread/ReplyCard.tsx b/client/src/components/Thread/ReplyCard.tsx
index c839871..818f01d 100644
--- a/client/src/components/Thread/ReplyCard.tsx
+++ b/client/src/components/Thread/ReplyCard.tsx
@@ -58,18 +58,15 @@ const timeAgo = (unixTime: number) => {
const ReplyCard = ({ event, metadata, replyCount, repliedTo }: { event: Event, metadata: Event | null, replyCount: number, repliedTo: Event[] }) => {
const { comment, file } = parseContent(event);
const colorCombo = getColorFromHash(event.pubkey, colorCombos);
- const [events, setEvents] = useState
([]);
+ // const [events, setEvents] = useState([]);
let metadataParsed = null;
if (metadata !== null) {
metadataParsed = getMetadata(metadata);
}
- const replyPubkeys = event.tags.filter(tag => tag[0] === 'p');
+ // const replyPubkeys = event.tags.filter(tag => tag[0] === 'p');
- useEffect(() => {
- console.log(repliedTo)
- }, []);
return (
<>
diff --git a/client/src/components/Thread/Thread.tsx b/client/src/components/Thread/Thread.tsx
index e748ccb..072304a 100644
--- a/client/src/components/Thread/Thread.tsx
+++ b/client/src/components/Thread/Thread.tsx
@@ -1,7 +1,7 @@
import { useParams } from 'react-router-dom';
import { useState } from "react";
import { Event, nip19 } from "nostr-tools"
-import { subNote } from '../../utils/subscriptions';
+import { subNote, subNotesOnce } from '../../utils/subscriptions';
import { useEffect } from 'react';
import { uniqBy } from '../../utils/utils';
import { DocumentTextIcon, FolderPlusIcon } from '@heroicons/react/24/outline';
@@ -21,6 +21,8 @@ const Thread = () => {
let decodeResult = nip19.decode(id as string);
const [showForm, setShowForm] = useState(false);
const [postType, setPostType] = useState("");
+ const [hasRun, setHasRun] = useState(false);
+ const [preOPEvents, setPreOPEvents] = useState(['']);
// Define your callback function for subGlobalFeed
const onEvent = (event: Event, relay: string) => {
@@ -35,6 +37,7 @@ const Thread = () => {
}
// Subscribe to global feed when the component mounts
// Optionally, return a cleanup function to unsubscribe when the component unmounts
+
return () => {
// Your cleanup code here
};
@@ -42,6 +45,16 @@ const Thread = () => {
const uniqEvents = events.length > 0 ? uniqBy(events, "id") : [];
+ useEffect(() => {
+ if (!hasRun && events.length > 0) {
+ let OPNoteEvents = events[0].tags.filter(tag => tag[0] === 'e').map(tag => tag[1]);
+ console.log(OPNoteEvents);
+ setHasRun(true);
+ setPreOPEvents(OPNoteEvents)
+ subNotesOnce(OPNoteEvents, onEvent)
+ }
+ }, [uniqEvents, hasRun]);
+
const getMetadataEvent = (event: Event) => {
const metadataEvent = uniqEvents.find(e => e.pubkey === event.pubkey && e.kind === 0);
if (metadataEvent) {
@@ -58,6 +71,13 @@ const Thread = () => {
return uniqEvents.filter(e => event.tags.some(tag => tag[0] === 'p' && tag[1] === e.pubkey));
}
+ const earlierEvents = uniqEvents
+ .filter(event =>
+ event.kind === 1 &&
+ preOPEvents.includes(event.id)
+ )
+ .sort((a, b) => (b.created_at as any) - (a.created_at as any));
+
if (!uniqEvents[0]) {
return (
<>
@@ -85,6 +105,11 @@ const Thread = () => {
<>
+ {earlierEvents
+ .filter(event => event.kind === 1)
+ .sort((a, b) => a.created_at - b.created_at).map((event, index) => (
+
+ ))}
{
{/* This is the white line separator */}
- {uniqEvents
+ {uniqEvents
.slice(1)
.filter(event => event.kind === 1)
.sort((a, b) => a.created_at - b.created_at).map((event, index) => (
diff --git a/client/src/utils/subscriptions.ts b/client/src/utils/subscriptions.ts
index d36f053..1ef1f8f 100644
--- a/client/src/utils/subscriptions.ts
+++ b/client/src/utils/subscriptions.ts
@@ -202,4 +202,38 @@ export const subNoteOnce = (
});
pubkeys.clear();
}, 2000);
-};
\ No newline at end of file
+};
+
+/** quick subscribe to a note id (nip-19) */
+export const subNotesOnce = (
+ eventIds: string[],
+ onEvent: SubCallback,
+) => {
+ const pubkeys = new Set();
+ sub({
+ cb: (evt, relay) => {
+ pubkeys.add(evt.pubkey);
+ onEvent(evt, relay);
+ },
+ filter: {
+ ids: eventIds,
+ kinds: [1],
+ limit: 1,
+ },
+ unsub: true,
+ });
+
+ setTimeout(() => {
+ // get profile info
+ sub({
+ cb: onEvent,
+ filter: {
+ authors: Array.from(pubkeys),
+ kinds: [0],
+ limit: pubkeys.size,
+ },
+ unsub: true,
+ });
+ pubkeys.clear();
+ }, 2000);
+};
\ No newline at end of file