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>
This commit is contained in:
2025-03-01 20:38:36 -05:00
committed by Daniel D’Aquino
parent f1fdae5957
commit e1e6d9eb3d
4 changed files with 31 additions and 2 deletions

View File

@@ -191,6 +191,7 @@ func reduce_text_block(ind: Int, hide_text_index: Int, txt: String) -> String {
func invoice_str(_ invoice: Invoice) -> CompatibleText { func invoice_str(_ invoice: Invoice) -> CompatibleText {
var attributedString = AttributedString(stringLiteral: abbrev_identifier(invoice.string)) var attributedString = AttributedString(stringLiteral: abbrev_identifier(invoice.string))
attributedString.link = URL(string: "damus:lightning:\(invoice.string)")
attributedString.foregroundColor = DamusColors.purple attributedString.foregroundColor = DamusColors.purple
return CompatibleText(attributed: attributedString) return CompatibleText(attributed: attributedString)

View File

@@ -43,6 +43,18 @@ struct DamusURLHandler {
return .route(.Script(script: model)) return .route(.Script(script: model))
case .purple(let purple_url): case .purple(let purple_url):
return await damus_state.purple.handle(purple_url: 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: case nil:
break break
} }
@@ -91,6 +103,11 @@ struct DamusURLHandler {
return .filter(filt) return .filter(filt)
case .script(let script): case .script(let script):
return .script(script) return .script(script)
case .invoice(let bolt11):
if let invoice = decode_bolt11(bolt11) {
return .invoice(invoice)
}
return nil
} }
return nil return nil
} }
@@ -103,5 +120,6 @@ struct DamusURLHandler {
case wallet_connect(WalletConnectURL) case wallet_connect(WalletConnectURL)
case script([UInt8]) case script([UInt8])
case purple(DamusPurpleURL) case purple(DamusPurpleURL)
case invoice(Invoice)
} }
} }

View File

@@ -12,6 +12,7 @@ enum NostrLink: Equatable {
case ref(RefId) case ref(RefId)
case filter(NostrFilter) case filter(NostrFilter)
case script([UInt8]) case script([UInt8])
case invoice(String)
} }
func encode_pubkey_uri(_ pubkey: Pubkey) -> String { func encode_pubkey_uri(_ pubkey: Pubkey) -> String {
@@ -93,8 +94,15 @@ func decode_nostr_uri(_ s: String) -> NostrLink? {
return return
} }
if parts.count >= 2 && parts[0] == "t" { if parts.count >= 2 {
return .filter(NostrFilter(hashtag: [parts[1].lowercased()])) 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 { guard parts.count == 1 else {

View File

@@ -84,6 +84,7 @@ class NoteContentViewTests: XCTestCase {
XCTAssertEqual(runArray.count, 3) XCTAssertEqual(runArray.count, 3)
XCTAssertTrue(runArray[0].description.contains("Donations appreciated: ")) XCTAssertTrue(runArray[0].description.contains("Donations appreciated: "))
XCTAssertTrue(runArray[1].description.contains("lnbc100n:qpsql29r")) XCTAssertTrue(runArray[1].description.contains("lnbc100n:qpsql29r"))
XCTAssertEqual(runArray[1].link?.absoluteString, "damus:lightning:\(invoiceString)")
XCTAssertTrue(runArray[2].description.contains(" Pura Vida")) XCTAssertTrue(runArray[2].description.contains(" Pura Vida"))
} }
@@ -281,6 +282,7 @@ class NoteContentViewTests: XCTestCase {
XCTAssertEqual(runArray.count, 4) XCTAssertEqual(runArray.count, 4)
XCTAssertTrue(runArray[0].description.contains("Donations appreciated: ")) XCTAssertTrue(runArray[0].description.contains("Donations appreciated: "))
XCTAssertTrue(runArray[1].description.contains("lnbc100n:qpsql29r")) XCTAssertTrue(runArray[1].description.contains("lnbc100n:qpsql29r"))
XCTAssertEqual(runArray[1].link?.absoluteString, "damus:lightning:\(invoiceString)")
XCTAssertTrue(runArray[2].description.contains(" Pura Vida")) XCTAssertTrue(runArray[2].description.contains(" Pura Vida"))
XCTAssertTrue(runArray[3].description.contains("https://damus.io/nothidden.png")) XCTAssertTrue(runArray[3].description.contains("https://damus.io/nothidden.png"))
XCTAssertEqual(runArray[3].link?.absoluteString, "https://damus.io/nothidden.png") XCTAssertEqual(runArray[3].link?.absoluteString, "https://damus.io/nothidden.png")