damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit 6f9a00d728c2cdb370372f6841bcd77eb46ac39e
parent 51e07df1b5aa9922ab605ba32cbc1f081914fe4b
Author: Askia Linder <askia.linder@lansforsakringar.se>
Date:   Sat, 21 Jun 2025 17:32:29 +0200

Handle npub correctly in draft notes

Damus stores npub as both Strings and URLs in NSAttributedString.Key.link when a note is saved as a draft. Make Damus correctly handle both when we retrieve and store drafts.

Changelog-Changed: Handle npub correctly in draft notes
Signed-off-by: Askeew <askeew@hotmail.com>
Closes: https://github.com/damus-io/damus/issues/2923

Diffstat:
Mdamus/Views/PostView.swift | 4+++-
MdamusTests/PostViewTests.swift | 42++++++++++++++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift @@ -863,7 +863,9 @@ func build_post(state: DamusState, post: NSAttributedString, action: PostAction, func build_post(state: DamusState, post: NSAttributedString, action: PostAction, uploadedMedias: [UploadedMedia], pubkeys: [Pubkey]) -> NostrPost { let post = NSMutableAttributedString(attributedString: post) post.enumerateAttributes(in: NSRange(location: 0, length: post.length), options: []) { attributes, range, stop in - if let link = attributes[.link] as? String { + let linkValue = attributes[.link] + let link = (linkValue as? String) ?? (linkValue as? URL)?.absoluteString + if let link { let nextCharIndex = range.upperBound if nextCharIndex < post.length, let nextChar = post.attributedSubstring(from: NSRange(location: nextCharIndex, length: 1)).string.first, diff --git a/damusTests/PostViewTests.swift b/damusTests/PostViewTests.swift @@ -176,6 +176,48 @@ final class PostViewTests: XCTestCase { XCTAssertEqual(post.tags, [["q", test_note.id.hex()]]) } + + func testBuildPostRecognizesStringsAsNpubs() throws { + // given + let expectedLink = "nostr:\(test_pubkey.npub)" + let content = NSMutableAttributedString(string: "@test", attributes: [ + NSAttributedString.Key.link: "damus:\(expectedLink)" + ]) + + // when + let post = build_post( + state: test_damus_state, + post: content, + action: .posting(.user(test_pubkey)), + uploadedMedias: [], + pubkeys: [] + ) + + // then + XCTAssertEqual(post.content, expectedLink) + } + + func testBuildPostRecognizesUrlsAsNpubs() throws { + // given + guard let npubUrl = URL(string: "damus:nostr:\(test_pubkey.npub)") else { + return XCTFail("Could not create URL") + } + let content = NSMutableAttributedString(string: "@test", attributes: [ + NSAttributedString.Key.link: npubUrl + ]) + + // when + let post = build_post( + state: test_damus_state, + post: content, + action: .posting(.user(test_pubkey)), + uploadedMedias: [], + pubkeys: [] + ) + + // then + XCTAssertEqual(post.content, "nostr:\(test_pubkey.npub)") + } } func checkMentionLinkEditorHandling(