From 041860438b65b8a4aebca5652f52ef1550409eb9 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Tue, 5 Mar 2024 08:52:25 +0000 Subject: [PATCH] fix(thread): show sub replies that don't tag root some clients such as primal do not inherit the e 'root' from the event they are replying to. we therefore need to subscribe to all replies individually to ensure we have the entire thread --- src/lib/stores/Issue.ts | 23 ++++++++++++++++- src/lib/stores/Proposal.ts | 51 ++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/lib/stores/Issue.ts b/src/lib/stores/Issue.ts index c22cdba..765b059 100644 --- a/src/lib/stores/Issue.ts +++ b/src/lib/stores/Issue.ts @@ -30,6 +30,8 @@ let sub: NDKSubscription let sub_replies: NDKSubscription +const sub_replies_to_replies: NDKSubscription[] = [] + export const ensureIssueFull = (repo_identifier: string, issue_id: string) => { if (selected_issue_id == issue_id) return if (issue_id == '') { @@ -40,6 +42,7 @@ export const ensureIssueFull = (repo_identifier: string, issue_id: string) => { if (sub) sub.stop() if (sub_replies) sub_replies.stop() + sub_replies_to_replies.forEach((sub) => sub.stop()) selected_issue_repo_id = repo_identifier selected_issue_id = issue_id @@ -170,7 +173,25 @@ export const ensureIssueFull = (repo_identifier: string, issue_id: string) => { }) } selected_issue_replies.update((replies) => { - return [...replies, event] + if (!replies.some((e) => e.id === event.id)) { + const sub_replies_to_reply = ndk.subscribe( + { + '#e': [event.id], + }, + { + groupable: true, + groupableDelay: 300, + closeOnEose: false, + }, + NDKRelaySet.fromRelayUrls(relays_to_use, ndk) + ) + sub_replies_to_reply.on('event', (event: NDKEvent) => { + process_replies(event) + }) + sub_replies_to_replies.push(sub_replies_to_reply) + return [...replies, event] + } + return [...replies] }) } diff --git a/src/lib/stores/Proposal.ts b/src/lib/stores/Proposal.ts index 440c863..f5f82f0 100644 --- a/src/lib/stores/Proposal.ts +++ b/src/lib/stores/Proposal.ts @@ -30,9 +30,7 @@ let sub: NDKSubscription let sub_replies: NDKSubscription -const sub_revisions: NDKSubscription[] = [] - -let revision_ids_queried: string[] +const sub_replies_to_replies: NDKSubscription[] = [] export const ensureProposalFull = ( repo_identifier: string, @@ -47,13 +45,12 @@ export const ensureProposalFull = ( if (sub) sub.stop() if (sub_replies) sub_replies.stop() - sub_revisions.forEach((sub) => sub.stop()) + sub_replies_to_replies.forEach((sub) => sub.stop()) selected_proposal_repo_id = repo_identifier selected_proposal_id = proposal_id selected_proposal_status_date = 0 selected_proposal_replies.set([]) - revision_ids_queried = [] selected_proposal_full.set({ ...full_defaults, @@ -185,32 +182,26 @@ export const ensureProposalFull = ( }) } selected_proposal_replies.update((replies) => { - return [...replies, event] + if (!replies.some((e) => e.id === event.id)) { + const sub_replies_to_reply = ndk.subscribe( + { + '#e': [event.id], + }, + { + groupable: true, + groupableDelay: 300, + closeOnEose: false, + }, + NDKRelaySet.fromRelayUrls(relays_to_use, ndk) + ) + sub_replies_to_reply.on('event', (event: NDKEvent) => { + process_replies(event) + }) + sub_replies_to_replies.push(sub_replies_to_reply) + return [...replies, event] + } + return [...replies] }) - if ( - event.tags.some((t) => t.length > 1 && t[1] === 'revision-root') && - !revision_ids_queried.includes(event.id) - ) { - // prevents an infinate loop of querying the same revision - revision_ids_queried.push(event.id) - const sub_revision_replies = ndk.subscribe( - { - '#e': [event.id], - limit: 100, - }, - { - groupable: true, - // default 100 - groupableDelay: 200, - closeOnEose: false, - }, - NDKRelaySet.fromRelayUrls(relays_to_use, ndk) - ) - sub_revision_replies.on('event', (event: NDKEvent) => { - process_replies(event) - }) - sub_revisions.push(sub_revision_replies) - } } sub_replies.on('event', (event: NDKEvent) => {