damus

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

commit e1e6d9eb3dea99fa142af69b4654ab27b1232a1c
parent f1fdae59573f6961b3c1f241c3f8949b88918e7c
Author: Terry Yiu <git@tyiu.xyz>
Date:   Sat,  1 Mar 2025 20:38:36 -0500

Add inline note rendering of invoices to pull up wallet selector sheet

Changelog-Added: Added inline note rendering of invoices to pull up wallet selector sheet
Signed-off-by: Terry Yiu <git@tyiu.xyz>

Diffstat:
Mdamus/Models/NoteContent.swift | 1+
Mdamus/Models/URLHandler.swift | 18++++++++++++++++++
Mdamus/Nostr/NostrLink.swift | 12++++++++++--
MdamusTests/NoteContentViewTests.swift | 2++
4 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/damus/Models/NoteContent.swift b/damus/Models/NoteContent.swift @@ -191,6 +191,7 @@ func reduce_text_block(ind: Int, hide_text_index: Int, txt: String) -> String { func invoice_str(_ invoice: Invoice) -> CompatibleText { var attributedString = AttributedString(stringLiteral: abbrev_identifier(invoice.string)) + attributedString.link = URL(string: "damus:lightning:\(invoice.string)") attributedString.foregroundColor = DamusColors.purple return CompatibleText(attributed: attributedString) diff --git a/damus/Models/URLHandler.swift b/damus/Models/URLHandler.swift @@ -43,6 +43,18 @@ struct DamusURLHandler { return .route(.Script(script: model)) case .purple(let purple_url): return await damus_state.purple.handle(purple_url: purple_url) + case .invoice(let invoice): + if damus_state.settings.show_wallet_selector { + return .sheet(.select_wallet(invoice: invoice.string)) + } else { + do { + try open_with_wallet(wallet: damus_state.settings.default_wallet.model, invoice: invoice.string) + return .no_action + } + catch { + return .sheet(.select_wallet(invoice: invoice.string)) + } + } case nil: break } @@ -91,6 +103,11 @@ struct DamusURLHandler { return .filter(filt) case .script(let script): return .script(script) + case .invoice(let bolt11): + if let invoice = decode_bolt11(bolt11) { + return .invoice(invoice) + } + return nil } return nil } @@ -103,5 +120,6 @@ struct DamusURLHandler { case wallet_connect(WalletConnectURL) case script([UInt8]) case purple(DamusPurpleURL) + case invoice(Invoice) } } diff --git a/damus/Nostr/NostrLink.swift b/damus/Nostr/NostrLink.swift @@ -12,6 +12,7 @@ enum NostrLink: Equatable { case ref(RefId) case filter(NostrFilter) case script([UInt8]) + case invoice(String) } func encode_pubkey_uri(_ pubkey: Pubkey) -> String { @@ -93,8 +94,15 @@ func decode_nostr_uri(_ s: String) -> NostrLink? { return } - if parts.count >= 2 && parts[0] == "t" { - return .filter(NostrFilter(hashtag: [parts[1].lowercased()])) + if parts.count >= 2 { + switch parts[0] { + case "t": + return .filter(NostrFilter(hashtag: [parts[1].lowercased()])) + case "lightning": + return .invoice(parts[1]) + default: + break + } } guard parts.count == 1 else { diff --git a/damusTests/NoteContentViewTests.swift b/damusTests/NoteContentViewTests.swift @@ -84,6 +84,7 @@ class NoteContentViewTests: XCTestCase { XCTAssertEqual(runArray.count, 3) XCTAssertTrue(runArray[0].description.contains("Donations appreciated: ")) XCTAssertTrue(runArray[1].description.contains("lnbc100n:qpsql29r")) + XCTAssertEqual(runArray[1].link?.absoluteString, "damus:lightning:\(invoiceString)") XCTAssertTrue(runArray[2].description.contains(" Pura Vida")) } @@ -281,6 +282,7 @@ class NoteContentViewTests: XCTestCase { XCTAssertEqual(runArray.count, 4) XCTAssertTrue(runArray[0].description.contains("Donations appreciated: ")) XCTAssertTrue(runArray[1].description.contains("lnbc100n:qpsql29r")) + XCTAssertEqual(runArray[1].link?.absoluteString, "damus:lightning:\(invoiceString)") XCTAssertTrue(runArray[2].description.contains(" Pura Vida")) XCTAssertTrue(runArray[3].description.contains("https://damus.io/nothidden.png")) XCTAssertEqual(runArray[3].link?.absoluteString, "https://damus.io/nothidden.png")