@@ -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 ) {
@@ -52,7 +57,15 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
5257
5358 case " offerings " :
5459 return offerings ( result)
55-
60+
61+ case " logout " :
62+ Qonversion . logout ( )
63+ return result ( nil )
64+
65+ case " resetUser " :
66+ Qonversion . resetUser ( )
67+ return result ( nil )
68+
5669 default :
5770 break
5871 }
@@ -70,6 +83,9 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
7083 case " purchase " :
7184 return purchase ( args [ " productId " ] as? String , result)
7285
86+ case " promoPurchase " :
87+ return promoPurchase ( args [ " productId " ] as? String , result)
88+
7389 case " setUserId " :
7490 return setUserId ( args [ " userId " ] as? String , result)
7591
@@ -87,6 +103,9 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
87103
88104 case " storeSdkInfo " :
89105 return storeSdkInfo ( args, result)
106+
107+ case " identify " :
108+ return identify ( args [ " userId " ] as? String , result)
90109
91110 default :
92111 return result ( FlutterMethodNotImplemented)
@@ -107,7 +126,17 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
107126 result ( resultMap)
108127 }
109128 }
110-
129+
130+ private func identify( _ userId: String ? , _ result: @escaping FlutterResult ) {
131+ guard let userId = userId else {
132+ result ( FlutterError . noUserId)
133+ return
134+ }
135+
136+ Qonversion . identify ( userId)
137+ result ( nil )
138+ }
139+
111140 private func products( _ result: @escaping FlutterResult ) {
112141 Qonversion . products { ( products, error) in
113142 if let error = error {
@@ -133,6 +162,25 @@ public class SwiftQonversionFlutterSdkPlugin: NSObject, FlutterPlugin {
133162 }
134163 }
135164
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+
136184 private func checkPermissions( _ result: @escaping FlutterResult ) {
137185 Qonversion . checkPermissions { ( permissions, error) in
138186 if let error = error {
@@ -274,6 +322,14 @@ extension SwiftQonversionFlutterSdkPlugin: Qonversion.PurchasesDelegate {
274322 public func qonversionDidReceiveUpdatedPermissions( _ permissions: [ String : Qonversion . Permission ] ) {
275323 let payload = permissions. mapValues { $0. toMap ( ) } . toJson ( )
276324
277- 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)
278334 }
279335}
0 commit comments