From 5865b000c03278be1d3ae5ba542fe3a37e2759b8 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Thu, 24 Oct 2024 15:07:39 -0700 Subject: [PATCH] fix: regression that dropped q tags from quote reposts It looks like some refactor broke q tags on quote reposts. This drops the gather_quote_tags entirely and just relies on the logic in build_post. The references field wasn't being used for anything other than pubkeys, so we switch to pubkeys directly. Changelog-Fixed: Fix quote repost counting Signed-off-by: William Casarin --- damus/Nostr/NostrEvent.swift | 28 ---------------------------- damus/Views/PostView.swift | 28 ++++++++-------------------- damusTests/PostViewTests.swift | 8 +++++++- 3 files changed, 15 insertions(+), 49 deletions(-) diff --git a/damus/Nostr/NostrEvent.swift b/damus/Nostr/NostrEvent.swift index bf3f7efd..7c3e94bc 100644 --- a/damus/Nostr/NostrEvent.swift +++ b/damus/Nostr/NostrEvent.swift @@ -484,34 +484,6 @@ func uniq(_ xs: [T]) -> [T] { return ys } -func gather_reply_ids(our_pubkey: Pubkey, from: NostrEvent) -> [RefId] { - var ids: [RefId] = from.referenced_ids.first.map({ ref in [ .event(ref) ] }) ?? [] - - let pks = from.referenced_pubkeys.reduce(into: [RefId]()) { rs, pk in - if pk == our_pubkey { - return - } - rs.append(.pubkey(pk)) - } - - ids.append(.event(from.id)) - ids.append(contentsOf: uniq(pks)) - - if from.pubkey != our_pubkey { - ids.append(.pubkey(from.pubkey)) - } - - return ids -} - -func gather_quote_ids(our_pubkey: Pubkey, from: NostrEvent) -> [RefId] { - var ids: [RefId] = [.quote(from.id.quote_id)] - if from.pubkey != our_pubkey { - ids.append(.pubkey(from.pubkey)) - } - return ids -} - func event_from_json(dat: String) -> NostrEvent? { return NostrEvent.owned_from_json(json: dat) } diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift index e3ea4a0d..edb64bd5 100644 --- a/damus/Views/PostView.swift +++ b/damus/Views/PostView.swift @@ -56,7 +56,7 @@ struct PostView: View { @State var image_upload_confirm: Bool = false @State var imagePastedFromPasteboard: UIImage? = nil @State var imageUploadConfirmPasteboard: Bool = false - @State var references: [RefId] = [] + @State var pubkeys: [Pubkey] = [] @State var filtered_pubkeys: Set = [] @State var focusWordAttributes: (String?, NSRange?) = (nil, nil) @State var newCursorIndex: Int? @@ -100,12 +100,8 @@ struct PostView: View { // don't add duplicate pubkeys but retain order var pkset = Set() - // we only want pubkeys really - let pks = references.reduce(into: Array()) { acc, ref in - guard case .pubkey(let pk) = ref else { - return - } - + // only unique and non-filtered pubkeys + let pks = pubkeys.reduce(into: Array()) { acc, pk in if pkset.contains(pk) || filtered_pubkeys.contains(pk) { return } @@ -401,16 +397,6 @@ struct PostView: View { self.tagModel.diff = post.string.count } - var pubkeys: [Pubkey] { - self.references.reduce(into: [Pubkey]()) { pks, ref in - guard case .pubkey(let pk) = ref else { - return - } - - pks.append(pk) - } - } - var body: some View { GeometryReader { (deviceSize: GeometryProxy) in VStack(alignment: .leading, spacing: 0) { @@ -494,14 +480,14 @@ struct PostView: View { switch action { case .replying_to(let replying_to): - references = gather_reply_ids(our_pubkey: damus_state.pubkey, from: replying_to) + break case .quoting(let quoting): - references = gather_quote_ids(our_pubkey: damus_state.pubkey, from: quoting) + break case .posting(let target): guard !loaded_draft else { break } fill_target_content(target: target) case .highlighting(let draft): - references = [draft.source.ref()] + break } DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { @@ -721,6 +707,8 @@ func build_post(state: DamusState, post: NSMutableAttributedString, action: Post case .quoting(let ev): content.append(" nostr:" + bech32_note_id(ev.id)) + tags.append(["q", ev.id.hex()]); + if let quoted_ev = state.events.lookup(ev.id) { tags.append(["p", quoted_ev.pubkey.hex()]) } diff --git a/damusTests/PostViewTests.swift b/damusTests/PostViewTests.swift index 0cb68c00..12b19778 100644 --- a/damusTests/PostViewTests.swift +++ b/damusTests/PostViewTests.swift @@ -153,7 +153,13 @@ final class PostViewTests: XCTestCase { XCTAssertNil(newManuallyEditedContent.attribute(.link, at: 11, effectiveRange: nil)) }) } - + + func testQuoteRepost() { + let post = build_post(state: test_damus_state, post: .init(), action: .quoting(test_note), uploadedMedias: [], pubkeys: []) + + XCTAssertEqual(post.tags, [["q", test_note.id.hex()]]) + } + func testMentionLinkEditorHandling_noWhitespaceAfterLink2_addsWhitespace() { var content: NSMutableAttributedString