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
This commit is contained in:
Askia Linder
2025-06-21 17:32:29 +02:00
committed by Daniel D’Aquino
parent 51e07df1b5
commit 6f9a00d728
2 changed files with 45 additions and 1 deletions

View File

@@ -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,

View File

@@ -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(