@@ -7,7 +7,9 @@ import Flutter
77import Qonversion
88
99public class SwiftQonversionFlutterSdkPlugin : NSObject , FlutterPlugin {
10- var purchasesEventStreamHandler : BaseEventStreamHandler ?
10+ var deferredPurchasesStreamHandler : BaseEventStreamHandler ?
11+ var promoPurchasesStreamHandler : BaseEventStreamHandler ?
12+ var promoPurchasesExecutionBlocks = [ String: Qonversion . PromoPurchaseCompletionHandler] ( )
1113
1214 public static func register( with registrar: FlutterPluginRegistrar ) {
1315 let messenger : FlutterBinaryMessenger
@@ -20,12 +22,15 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
2022 let instance = SwiftQonversionFlutterSdkPlugin ( )
2123 registrar. addMethodCallDelegate ( instance, channel: channel)
2224
23- // Register events listeners
25+ // Register deferred purchases events
2426 let purchasesListener = FlutterListenerWrapper < BaseEventStreamHandler > ( registrar, postfix: " updated_purchases " )
25- purchasesListener. register ( ) { instance. purchasesEventStreamHandler = $0 }
26-
27- // Setting delegate as soon as plugin is registered
27+ purchasesListener. register ( ) { instance. deferredPurchasesStreamHandler = $0 }
2828 Qonversion . setPurchasesDelegate ( instance)
29+
30+ // Register promo purchases events
31+ let promoPurchasesListener = FlutterListenerWrapper < BaseEventStreamHandler > ( registrar, postfix: " promo_purchases " )
32+ promoPurchasesListener. register ( ) { instance. promoPurchasesStreamHandler = $0 }
33+ Qonversion . setPromoPurchasesDelegate ( instance)
2934 }
3035
3136 public func handle( _ call: FlutterMethodCall , result: @escaping FlutterResult ) {
@@ -78,6 +83,9 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
7883 case " purchase " :
7984 return purchase ( args [ " productId " ] as? String , result)
8085
86+ case " promoPurchase " :
87+ return promoPurchase ( args [ " productId " ] as? String , result)
88+
8189 case " setUserId " :
8290 return setUserId ( args [ " userId " ] as? String , result)
8391
@@ -154,6 +162,25 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
154162 }
155163 }
156164
165+ private func promoPurchase( _ productId: String ? , _ result: @escaping FlutterResult ) {
166+ guard let productId = productId else {
167+ return result ( FlutterError . noProductId)
168+ }
169+
170+ if let executionBlock = promoPurchasesExecutionBlocks [ productId] {
171+ promoPurchasesExecutionBlocks. removeValue ( forKey: productId)
172+
173+ executionBlock { ( permissions, error, isCancelled) in
174+ let purchaseResult = PurchaseResult ( permissions: permissions,
175+ error: error,
176+ isCancelled: isCancelled)
177+ result ( purchaseResult. toMap ( ) )
178+ }
179+ } else {
180+ result ( FlutterError . promoPurchaseError ( productId) )
181+ }
182+ }
183+
157184 private func checkPermissions( _ result: @escaping FlutterResult ) {
158185 Qonversion . checkPermissions { ( permissions, error) in
159186 if let error = error {
@@ -295,6 +322,14 @@ extension SwiftQonversionFlutterSdkPlugin: Qonversion.PurchasesDelegate {
295322 public func qonversionDidReceiveUpdatedPermissions( _ permissions: [ String : Qonversion . Permission ] ) {
296323 let payload = permissions. mapValues { $0. toMap ( ) } . toJson ( )
297324
298- purchasesEventStreamHandler? . eventSink ? ( payload)
325+ deferredPurchasesStreamHandler? . eventSink ? ( payload)
326+ }
327+ }
328+
329+ extension SwiftQonversionFlutterSdkPlugin : QNPromoPurchasesDelegate {
330+ public func shouldPurchasePromoProduct( withIdentifier productID: String , executionBlock: @escaping Qonversion . PromoPurchaseCompletionHandler ) {
331+ promoPurchasesExecutionBlocks [ productID] = executionBlock
332+
333+ promoPurchasesStreamHandler? . eventSink ? ( productID)
299334 }
300335}
0 commit comments