mirror of
https://github.com/aljazceru/breez-sdk-liquid.git
synced 2025-12-24 01:14:22 +01:00
Swift notification plugin (#436)
* Add Swift notification plugin * Hash the metadata * Validate min sendable amount * Remove initializer as base class, UNNotificationServiceExtension, has no default initializer * Set the PaymentMethod * Handle PaymentDetails in SwapUpdated * Improve payment text
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import UserNotifications
|
||||
import Foundation
|
||||
|
||||
struct SwapUpdatedRequest: Codable {
|
||||
let id: String
|
||||
let status: String
|
||||
}
|
||||
|
||||
class SwapUpdatedTask : TaskProtocol {
|
||||
fileprivate let TAG = "SwapUpdatedTask"
|
||||
|
||||
internal var payload: String
|
||||
internal var contentHandler: ((UNNotificationContent) -> Void)?
|
||||
internal var bestAttemptContent: UNMutableNotificationContent?
|
||||
internal var logger: ServiceLogger
|
||||
internal var request: SwapUpdatedRequest? = nil
|
||||
|
||||
init(payload: String, logger: ServiceLogger, contentHandler: ((UNNotificationContent) -> Void)? = nil, bestAttemptContent: UNMutableNotificationContent? = nil) {
|
||||
self.payload = payload
|
||||
self.contentHandler = contentHandler
|
||||
self.bestAttemptContent = bestAttemptContent
|
||||
self.logger = logger
|
||||
}
|
||||
|
||||
func start(liquidSDK: BindingLiquidSdk) throws {
|
||||
do {
|
||||
self.request = try JSONDecoder().decode(SwapUpdatedRequest.self, from: self.payload.data(using: .utf8)!)
|
||||
} catch let e {
|
||||
self.logger.log(tag: TAG, line: "Failed to decode payload: \(e)", level: "ERROR")
|
||||
self.onShutdown()
|
||||
throw e
|
||||
}
|
||||
}
|
||||
|
||||
public func onEvent(e: SdkEvent) {
|
||||
if let swapIdHash = self.request?.id {
|
||||
switch e {
|
||||
case .paymentSucceeded(details: let payment):
|
||||
let swapId = self.getSwapId(details: payment.details)
|
||||
if swapIdHash == swapId?.sha256() {
|
||||
self.logger.log(tag: TAG, line: "Received payment succeeded event: \(swapIdHash)", level: "INFO")
|
||||
self.notifySuccess(payment: payment)
|
||||
}
|
||||
break
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getSwapId(details: PaymentDetails?) -> String? {
|
||||
if let details = details {
|
||||
switch details {
|
||||
case let .bitcoin(swapId, _, _, _):
|
||||
return swapId
|
||||
case let .lightning(swapId, _, _, _, _, _):
|
||||
return swapId
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func onShutdown() {
|
||||
let notificationTitle = ResourceHelper.shared.getString(key: Constants.SWAP_CONFIRMED_NOTIFICATION_FAILURE_TITLE, fallback: Constants.DEFAULT_SWAP_CONFIRMED_NOTIFICATION_FAILURE_TITLE)
|
||||
let notificationBody = ResourceHelper.shared.getString(key: Constants.SWAP_CONFIRMED_NOTIFICATION_FAILURE_TEXT, fallback: Constants.DEFAULT_SWAP_CONFIRMED_NOTIFICATION_FAILURE_TEXT)
|
||||
self.displayPushNotification(title: notificationTitle, body: notificationBody, logger: self.logger, threadIdentifier: Constants.NOTIFICATION_THREAD_SWAP_UPDATED)
|
||||
}
|
||||
|
||||
func notifySuccess(payment: Payment) {
|
||||
self.logger.log(tag: TAG, line: "Payment \(payment.txId ?? "") completed successfully", level: "INFO")
|
||||
let received = payment.paymentType == PaymentType.receive
|
||||
let notificationTitle = ResourceHelper.shared.getString(
|
||||
key: received ? Constants.PAYMENT_RECEIVED_NOTIFICATION_TITLE : Constants.PAYMENT_SENT_NOTIFICATION_TITLE,
|
||||
validateContains: "%d",
|
||||
fallback: received ? Constants.DEFAULT_PAYMENT_RECEIVED_NOTIFICATION_TITLE: Constants.DEFAULT_PAYMENT_SENT_NOTIFICATION_TITLE)
|
||||
self.displayPushNotification(title: String(format: notificationTitle, payment.amountSat), logger: self.logger, threadIdentifier: Constants.NOTIFICATION_THREAD_SWAP_UPDATED)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user