@@ -20,6 +20,8 @@ class SendViewModel: ObservableObject {
2020 @Published var sendError : MondayError ?
2121 var price : Double
2222 @Published var balances : BalanceDetails
23+ @Published var paymentSendState : PaymentSendState = . pending
24+ private var sentPaymentId : String ?
2325
2426 init (
2527 lightningClient: LightningNodeClient ,
@@ -31,14 +33,39 @@ class SendViewModel: ObservableObject {
3133 self . sendViewState = sendViewState
3234 self . price = price
3335 self . balances = balances
36+ NotificationCenter . default. addObserver (
37+ self ,
38+ selector: #selector( handleLdkEvent ( _: ) ) ,
39+ name: . ldkEventReceived,
40+ object: nil
41+ )
42+ }
43+
44+ @objc private func handleLdkEvent( _ notification: Notification ) {
45+ guard let event = notification. object as? Event else { return }
46+ guard let paymentId = sentPaymentId else { return }
47+ switch event {
48+ case . paymentSuccessful( _, let paymentHash, _, _) :
49+ if paymentHash == paymentId {
50+ paymentSendState = . succeeded
51+ }
52+ case . paymentFailed( _, let paymentHash, _) :
53+ if let hash = paymentHash, hash == paymentId {
54+ paymentSendState = . failed
55+ }
56+ default :
57+ break
58+ }
3459 }
3560
3661 func send( ) async throws {
3762 do {
63+ var paymentId : String ? = nil
3864 switch paymentAddress? . type {
3965 case . bip21:
4066 let uriString = paymentAddress? . address ?? " "
41- _ = try await lightningClient. send ( uriString)
67+ let result = try await lightningClient. send ( uriString)
68+ if let id = ( result as? QrPaymentResult ) ? . id { paymentId = id }
4269 case . onchain:
4370 let uriString = unifiedQRString (
4471 onchainAddress: paymentAddress? . address ?? " " ,
@@ -47,12 +74,14 @@ class SendViewModel: ObservableObject {
4774 bolt11: nil ,
4875 bolt12: nil
4976 )
50- _ = try await lightningClient. send ( uriString)
77+ let result = try await lightningClient. send ( uriString)
78+ if let id = ( result as? QrPaymentResult ) ? . id { paymentId = id }
5179 case . bolt11:
52- _ = try await lightningClient. sendBolt11Payment (
80+ let result = try await lightningClient. sendBolt11Payment (
5381 Bolt11Invoice ( paymentAddress? . address ?? " " ) ,
5482 nil
5583 )
84+ paymentId = result. value
5685 default :
5786 debugPrint ( " Unhandled paymentAddress type " )
5887 DispatchQueue . main. async {
@@ -62,6 +91,10 @@ class SendViewModel: ObservableObject {
6291 )
6392 }
6493 }
94+ if let paymentId = paymentId {
95+ self . sentPaymentId = paymentId
96+ self . paymentSendState = . pending
97+ }
6598 } catch let error as NodeError {
6699 NotificationCenter . default. post ( name: . ldkErrorReceived, object: error)
67100 let errorString = handleNodeError ( error)
0 commit comments