@qonversion/react-native-sdk 10.0.0-RC1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/README.md +129 -0
  2. package/android/build.gradle +92 -0
  3. package/android/gradle.properties +6 -0
  4. package/android/src/main/AndroidManifest.xml +2 -0
  5. package/android/src/main/java/com/qonversion/reactnativesdk/EntitiesConverter.kt +135 -0
  6. package/android/src/main/java/com/qonversion/reactnativesdk/NoCodesModule.kt +76 -0
  7. package/android/src/main/java/com/qonversion/reactnativesdk/QonversionModule.kt +278 -0
  8. package/android/src/main/java/com/qonversion/reactnativesdk/QonversionPackage.kt +43 -0
  9. package/android/src/main/java/com/qonversion/reactnativesdk/Utils.kt +32 -0
  10. package/ios/RNNoCodes.h +5 -0
  11. package/ios/RNNoCodes.mm +61 -0
  12. package/ios/RNNoCodesImpl.swift +69 -0
  13. package/ios/RNQonversion.h +5 -0
  14. package/ios/RNQonversion.mm +189 -0
  15. package/ios/RNQonversionImpl.swift +250 -0
  16. package/ios/qonversion-react-native-sdk-Bridging-Header.h +6 -0
  17. package/lib/module/NoCodes.js +32 -0
  18. package/lib/module/NoCodes.js.map +1 -0
  19. package/lib/module/NoCodesApi.js +2 -0
  20. package/lib/module/NoCodesApi.js.map +1 -0
  21. package/lib/module/NoCodesConfig.js +10 -0
  22. package/lib/module/NoCodesConfig.js.map +1 -0
  23. package/lib/module/NoCodesConfigBuilder.js +35 -0
  24. package/lib/module/NoCodesConfigBuilder.js.map +1 -0
  25. package/lib/module/Qonversion.js +35 -0
  26. package/lib/module/Qonversion.js.map +1 -0
  27. package/lib/module/QonversionApi.js +4 -0
  28. package/lib/module/QonversionApi.js.map +1 -0
  29. package/lib/module/QonversionConfig.js +16 -0
  30. package/lib/module/QonversionConfig.js.map +1 -0
  31. package/lib/module/QonversionConfigBuilder.js +90 -0
  32. package/lib/module/QonversionConfigBuilder.js.map +1 -0
  33. package/lib/module/dto/Entitlement.js +24 -0
  34. package/lib/module/dto/Entitlement.js.map +1 -0
  35. package/lib/module/dto/EntitlementsUpdateListener.js +4 -0
  36. package/lib/module/dto/EntitlementsUpdateListener.js.map +1 -0
  37. package/lib/module/dto/Experiment.js +11 -0
  38. package/lib/module/dto/Experiment.js.map +1 -0
  39. package/lib/module/dto/ExperimentGroup.js +11 -0
  40. package/lib/module/dto/ExperimentGroup.js.map +1 -0
  41. package/lib/module/dto/IntroEligibility.js +9 -0
  42. package/lib/module/dto/IntroEligibility.js.map +1 -0
  43. package/lib/module/dto/NoCodesAction.js +11 -0
  44. package/lib/module/dto/NoCodesAction.js.map +1 -0
  45. package/lib/module/dto/NoCodesError.js +13 -0
  46. package/lib/module/dto/NoCodesError.js.map +1 -0
  47. package/lib/module/dto/NoCodesListener.js +4 -0
  48. package/lib/module/dto/NoCodesListener.js.map +1 -0
  49. package/lib/module/dto/Offering.js +14 -0
  50. package/lib/module/dto/Offering.js.map +1 -0
  51. package/lib/module/dto/Offerings.js +13 -0
  52. package/lib/module/dto/Offerings.js.map +1 -0
  53. package/lib/module/dto/Product.js +114 -0
  54. package/lib/module/dto/Product.js.map +1 -0
  55. package/lib/module/dto/PromoPurchasesListener.js +4 -0
  56. package/lib/module/dto/PromoPurchasesListener.js.map +1 -0
  57. package/lib/module/dto/PromotionalOffer.js +10 -0
  58. package/lib/module/dto/PromotionalOffer.js.map +1 -0
  59. package/lib/module/dto/PurchaseModel.js +26 -0
  60. package/lib/module/dto/PurchaseModel.js.map +1 -0
  61. package/lib/module/dto/PurchaseOptions.js +15 -0
  62. package/lib/module/dto/PurchaseOptions.js.map +1 -0
  63. package/lib/module/dto/PurchaseOptionsBuilder.js +117 -0
  64. package/lib/module/dto/PurchaseOptionsBuilder.js.map +1 -0
  65. package/lib/module/dto/PurchaseUpdateModel.js +32 -0
  66. package/lib/module/dto/PurchaseUpdateModel.js.map +1 -0
  67. package/lib/module/dto/QonversionError.js +15 -0
  68. package/lib/module/dto/QonversionError.js.map +1 -0
  69. package/lib/module/dto/RemoteConfig.js +11 -0
  70. package/lib/module/dto/RemoteConfig.js.map +1 -0
  71. package/lib/module/dto/RemoteConfigList.js +18 -0
  72. package/lib/module/dto/RemoteConfigList.js.map +1 -0
  73. package/lib/module/dto/RemoteConfigurationSource.js +13 -0
  74. package/lib/module/dto/RemoteConfigurationSource.js.map +1 -0
  75. package/lib/module/dto/ScreenPresentationConfig.js +22 -0
  76. package/lib/module/dto/ScreenPresentationConfig.js.map +1 -0
  77. package/lib/module/dto/SubscriptionPeriod.js +26 -0
  78. package/lib/module/dto/SubscriptionPeriod.js.map +1 -0
  79. package/lib/module/dto/Transaction.js +18 -0
  80. package/lib/module/dto/Transaction.js.map +1 -0
  81. package/lib/module/dto/User.js +10 -0
  82. package/lib/module/dto/User.js.map +1 -0
  83. package/lib/module/dto/UserProperties.js +71 -0
  84. package/lib/module/dto/UserProperties.js.map +1 -0
  85. package/lib/module/dto/UserProperty.js +17 -0
  86. package/lib/module/dto/UserProperty.js.map +1 -0
  87. package/lib/module/dto/enums.js +425 -0
  88. package/lib/module/dto/enums.js.map +1 -0
  89. package/lib/module/dto/storeProducts/ProductInAppDetails.js +16 -0
  90. package/lib/module/dto/storeProducts/ProductInAppDetails.js.map +1 -0
  91. package/lib/module/dto/storeProducts/ProductInstallmentPlanDetails.js +25 -0
  92. package/lib/module/dto/storeProducts/ProductInstallmentPlanDetails.js.map +1 -0
  93. package/lib/module/dto/storeProducts/ProductOfferDetails.js +76 -0
  94. package/lib/module/dto/storeProducts/ProductOfferDetails.js.map +1 -0
  95. package/lib/module/dto/storeProducts/ProductPrice.js +37 -0
  96. package/lib/module/dto/storeProducts/ProductPrice.js.map +1 -0
  97. package/lib/module/dto/storeProducts/ProductPricingPhase.js +52 -0
  98. package/lib/module/dto/storeProducts/ProductPricingPhase.js.map +1 -0
  99. package/lib/module/dto/storeProducts/ProductStoreDetails.js +114 -0
  100. package/lib/module/dto/storeProducts/ProductStoreDetails.js.map +1 -0
  101. package/lib/module/dto/storeProducts/SKPaymentDiscount.js +13 -0
  102. package/lib/module/dto/storeProducts/SKPaymentDiscount.js.map +1 -0
  103. package/lib/module/dto/storeProducts/SKProduct.js +22 -0
  104. package/lib/module/dto/storeProducts/SKProduct.js.map +1 -0
  105. package/lib/module/dto/storeProducts/SKProductDiscount.js +16 -0
  106. package/lib/module/dto/storeProducts/SKProductDiscount.js.map +1 -0
  107. package/lib/module/dto/storeProducts/SKSubscriptionPeriod.js +10 -0
  108. package/lib/module/dto/storeProducts/SKSubscriptionPeriod.js.map +1 -0
  109. package/lib/module/dto/storeProducts/SkuDetails.js +30 -0
  110. package/lib/module/dto/storeProducts/SkuDetails.js.map +1 -0
  111. package/lib/module/index.js +40 -0
  112. package/lib/module/index.js.map +1 -0
  113. package/lib/module/internal/Mapper.js +676 -0
  114. package/lib/module/internal/Mapper.js.map +1 -0
  115. package/lib/module/internal/NoCodesInternal.js +70 -0
  116. package/lib/module/internal/NoCodesInternal.js.map +1 -0
  117. package/lib/module/internal/QonversionInternal.js +237 -0
  118. package/lib/module/internal/QonversionInternal.js.map +1 -0
  119. package/lib/module/internal/specs/NativeNoCodesModule.js +5 -0
  120. package/lib/module/internal/specs/NativeNoCodesModule.js.map +1 -0
  121. package/lib/module/internal/specs/NativeQonversionModule.js +5 -0
  122. package/lib/module/internal/specs/NativeQonversionModule.js.map +1 -0
  123. package/lib/module/internal/utils.js +10 -0
  124. package/lib/module/internal/utils.js.map +1 -0
  125. package/lib/module/package.json +1 -0
  126. package/lib/typescript/package.json +1 -0
  127. package/lib/typescript/src/NoCodes.d.ts +23 -0
  128. package/lib/typescript/src/NoCodes.d.ts.map +1 -0
  129. package/lib/typescript/src/NoCodesApi.d.ts +20 -0
  130. package/lib/typescript/src/NoCodesApi.d.ts.map +1 -0
  131. package/lib/typescript/src/NoCodesConfig.d.ts +8 -0
  132. package/lib/typescript/src/NoCodesConfig.d.ts.map +1 -0
  133. package/lib/typescript/src/NoCodesConfigBuilder.d.ts +26 -0
  134. package/lib/typescript/src/NoCodesConfigBuilder.d.ts.map +1 -0
  135. package/lib/typescript/src/Qonversion.d.ts +26 -0
  136. package/lib/typescript/src/Qonversion.d.ts.map +1 -0
  137. package/lib/typescript/src/QonversionApi.d.ts +285 -0
  138. package/lib/typescript/src/QonversionApi.d.ts.map +1 -0
  139. package/lib/typescript/src/QonversionConfig.d.ts +14 -0
  140. package/lib/typescript/src/QonversionConfig.d.ts.map +1 -0
  141. package/lib/typescript/src/QonversionConfigBuilder.d.ts +65 -0
  142. package/lib/typescript/src/QonversionConfigBuilder.d.ts.map +1 -0
  143. package/lib/typescript/src/dto/Entitlement.d.ts +22 -0
  144. package/lib/typescript/src/dto/Entitlement.d.ts.map +1 -0
  145. package/lib/typescript/src/dto/EntitlementsUpdateListener.d.ts +10 -0
  146. package/lib/typescript/src/dto/EntitlementsUpdateListener.d.ts.map +1 -0
  147. package/lib/typescript/src/dto/Experiment.d.ts +9 -0
  148. package/lib/typescript/src/dto/Experiment.d.ts.map +1 -0
  149. package/lib/typescript/src/dto/ExperimentGroup.d.ts +9 -0
  150. package/lib/typescript/src/dto/ExperimentGroup.d.ts.map +1 -0
  151. package/lib/typescript/src/dto/IntroEligibility.d.ts +7 -0
  152. package/lib/typescript/src/dto/IntroEligibility.d.ts.map +1 -0
  153. package/lib/typescript/src/dto/NoCodesAction.d.ts +10 -0
  154. package/lib/typescript/src/dto/NoCodesAction.d.ts.map +1 -0
  155. package/lib/typescript/src/dto/NoCodesError.d.ts +12 -0
  156. package/lib/typescript/src/dto/NoCodesError.d.ts.map +1 -0
  157. package/lib/typescript/src/dto/NoCodesListener.d.ts +34 -0
  158. package/lib/typescript/src/dto/NoCodesListener.d.ts.map +1 -0
  159. package/lib/typescript/src/dto/Offering.d.ts +11 -0
  160. package/lib/typescript/src/dto/Offering.d.ts.map +1 -0
  161. package/lib/typescript/src/dto/Offerings.d.ts +9 -0
  162. package/lib/typescript/src/dto/Offerings.d.ts.map +1 -0
  163. package/lib/typescript/src/dto/Product.d.ts +95 -0
  164. package/lib/typescript/src/dto/Product.d.ts.map +1 -0
  165. package/lib/typescript/src/dto/PromoPurchasesListener.d.ts +12 -0
  166. package/lib/typescript/src/dto/PromoPurchasesListener.d.ts.map +1 -0
  167. package/lib/typescript/src/dto/PromotionalOffer.d.ts +9 -0
  168. package/lib/typescript/src/dto/PromotionalOffer.d.ts.map +1 -0
  169. package/lib/typescript/src/dto/PurchaseModel.d.ts +19 -0
  170. package/lib/typescript/src/dto/PurchaseModel.d.ts.map +1 -0
  171. package/lib/typescript/src/dto/PurchaseOptions.d.ts +15 -0
  172. package/lib/typescript/src/dto/PurchaseOptions.d.ts.map +1 -0
  173. package/lib/typescript/src/dto/PurchaseOptionsBuilder.d.ts +84 -0
  174. package/lib/typescript/src/dto/PurchaseOptionsBuilder.d.ts.map +1 -0
  175. package/lib/typescript/src/dto/PurchaseUpdateModel.d.ts +25 -0
  176. package/lib/typescript/src/dto/PurchaseUpdateModel.d.ts.map +1 -0
  177. package/lib/typescript/src/dto/QonversionError.d.ts +11 -0
  178. package/lib/typescript/src/dto/QonversionError.d.ts.map +1 -0
  179. package/lib/typescript/src/dto/RemoteConfig.d.ts +10 -0
  180. package/lib/typescript/src/dto/RemoteConfig.d.ts.map +1 -0
  181. package/lib/typescript/src/dto/RemoteConfigList.d.ts +10 -0
  182. package/lib/typescript/src/dto/RemoteConfigList.d.ts.map +1 -0
  183. package/lib/typescript/src/dto/RemoteConfigurationSource.d.ts +11 -0
  184. package/lib/typescript/src/dto/RemoteConfigurationSource.d.ts.map +1 -0
  185. package/lib/typescript/src/dto/ScreenPresentationConfig.d.ts +18 -0
  186. package/lib/typescript/src/dto/ScreenPresentationConfig.d.ts.map +1 -0
  187. package/lib/typescript/src/dto/SubscriptionPeriod.d.ts +21 -0
  188. package/lib/typescript/src/dto/SubscriptionPeriod.d.ts.map +1 -0
  189. package/lib/typescript/src/dto/Transaction.d.ts +16 -0
  190. package/lib/typescript/src/dto/Transaction.d.ts.map +1 -0
  191. package/lib/typescript/src/dto/User.d.ts +7 -0
  192. package/lib/typescript/src/dto/User.d.ts.map +1 -0
  193. package/lib/typescript/src/dto/UserProperties.d.ts +49 -0
  194. package/lib/typescript/src/dto/UserProperties.d.ts.map +1 -0
  195. package/lib/typescript/src/dto/UserProperty.d.ts +13 -0
  196. package/lib/typescript/src/dto/UserProperty.d.ts.map +1 -0
  197. package/lib/typescript/src/dto/enums.d.ts +343 -0
  198. package/lib/typescript/src/dto/enums.d.ts.map +1 -0
  199. package/lib/typescript/src/dto/storeProducts/ProductInAppDetails.d.ts +13 -0
  200. package/lib/typescript/src/dto/storeProducts/ProductInAppDetails.d.ts.map +1 -0
  201. package/lib/typescript/src/dto/storeProducts/ProductInstallmentPlanDetails.d.ts +20 -0
  202. package/lib/typescript/src/dto/storeProducts/ProductInstallmentPlanDetails.d.ts.map +1 -0
  203. package/lib/typescript/src/dto/storeProducts/ProductOfferDetails.d.ts +63 -0
  204. package/lib/typescript/src/dto/storeProducts/ProductOfferDetails.d.ts.map +1 -0
  205. package/lib/typescript/src/dto/storeProducts/ProductPrice.d.ts +29 -0
  206. package/lib/typescript/src/dto/storeProducts/ProductPrice.d.ts.map +1 -0
  207. package/lib/typescript/src/dto/storeProducts/ProductPricingPhase.d.ts +44 -0
  208. package/lib/typescript/src/dto/storeProducts/ProductPricingPhase.d.ts.map +1 -0
  209. package/lib/typescript/src/dto/storeProducts/ProductStoreDetails.d.ts +97 -0
  210. package/lib/typescript/src/dto/storeProducts/ProductStoreDetails.d.ts.map +1 -0
  211. package/lib/typescript/src/dto/storeProducts/SKPaymentDiscount.d.ts +10 -0
  212. package/lib/typescript/src/dto/storeProducts/SKPaymentDiscount.d.ts.map +1 -0
  213. package/lib/typescript/src/dto/storeProducts/SKProduct.d.ts +21 -0
  214. package/lib/typescript/src/dto/storeProducts/SKProduct.d.ts.map +1 -0
  215. package/lib/typescript/src/dto/storeProducts/SKProductDiscount.d.ts +15 -0
  216. package/lib/typescript/src/dto/storeProducts/SKProductDiscount.d.ts.map +1 -0
  217. package/lib/typescript/src/dto/storeProducts/SKSubscriptionPeriod.d.ts +8 -0
  218. package/lib/typescript/src/dto/storeProducts/SKSubscriptionPeriod.d.ts.map +1 -0
  219. package/lib/typescript/src/dto/storeProducts/SkuDetails.d.ts +27 -0
  220. package/lib/typescript/src/dto/storeProducts/SkuDetails.d.ts.map +1 -0
  221. package/lib/typescript/src/index.d.ts +41 -0
  222. package/lib/typescript/src/index.d.ts.map +1 -0
  223. package/lib/typescript/src/internal/Mapper.d.ts +312 -0
  224. package/lib/typescript/src/internal/Mapper.d.ts.map +1 -0
  225. package/lib/typescript/src/internal/NoCodesInternal.d.ts +14 -0
  226. package/lib/typescript/src/internal/NoCodesInternal.d.ts.map +1 -0
  227. package/lib/typescript/src/internal/QonversionInternal.d.ts +60 -0
  228. package/lib/typescript/src/internal/QonversionInternal.d.ts.map +1 -0
  229. package/lib/typescript/src/internal/specs/NativeNoCodesModule.d.ts +17 -0
  230. package/lib/typescript/src/internal/specs/NativeNoCodesModule.d.ts.map +1 -0
  231. package/lib/typescript/src/internal/specs/NativeQonversionModule.d.ts +56 -0
  232. package/lib/typescript/src/internal/specs/NativeQonversionModule.d.ts.map +1 -0
  233. package/lib/typescript/src/internal/utils.d.ts +3 -0
  234. package/lib/typescript/src/internal/utils.d.ts.map +1 -0
  235. package/package.json +151 -0
  236. package/qonversion-react-native-sdk.podspec +21 -0
  237. package/src/NoCodes.ts +37 -0
  238. package/src/NoCodesApi.ts +22 -0
  239. package/src/NoCodesConfig.ts +16 -0
  240. package/src/NoCodesConfigBuilder.ts +40 -0
  241. package/src/Qonversion.ts +40 -0
  242. package/src/QonversionApi.ts +318 -0
  243. package/src/QonversionConfig.ts +32 -0
  244. package/src/QonversionConfigBuilder.ts +102 -0
  245. package/src/dto/Entitlement.ts +57 -0
  246. package/src/dto/EntitlementsUpdateListener.ts +11 -0
  247. package/src/dto/Experiment.ts +15 -0
  248. package/src/dto/ExperimentGroup.ts +15 -0
  249. package/src/dto/IntroEligibility.ts +11 -0
  250. package/src/dto/NoCodesAction.ts +21 -0
  251. package/src/dto/NoCodesError.ts +26 -0
  252. package/src/dto/NoCodesListener.ts +39 -0
  253. package/src/dto/Offering.ts +20 -0
  254. package/src/dto/Offerings.ts +17 -0
  255. package/src/dto/Product.ts +159 -0
  256. package/src/dto/PromoPurchasesListener.ts +13 -0
  257. package/src/dto/PromotionalOffer.ts +17 -0
  258. package/src/dto/PurchaseModel.ts +29 -0
  259. package/src/dto/PurchaseOptions.ts +33 -0
  260. package/src/dto/PurchaseOptionsBuilder.ts +127 -0
  261. package/src/dto/PurchaseUpdateModel.ts +43 -0
  262. package/src/dto/QonversionError.ts +24 -0
  263. package/src/dto/RemoteConfig.ts +16 -0
  264. package/src/dto/RemoteConfigList.ts +23 -0
  265. package/src/dto/RemoteConfigurationSource.ts +26 -0
  266. package/src/dto/ScreenPresentationConfig.ts +24 -0
  267. package/src/dto/SubscriptionPeriod.ts +33 -0
  268. package/src/dto/Transaction.ts +40 -0
  269. package/src/dto/User.ts +11 -0
  270. package/src/dto/UserProperties.ts +78 -0
  271. package/src/dto/UserProperty.ts +21 -0
  272. package/src/dto/enums.ts +389 -0
  273. package/src/dto/storeProducts/ProductInAppDetails.ts +17 -0
  274. package/src/dto/storeProducts/ProductInstallmentPlanDetails.ts +28 -0
  275. package/src/dto/storeProducts/ProductOfferDetails.ts +102 -0
  276. package/src/dto/storeProducts/ProductPrice.ts +46 -0
  277. package/src/dto/storeProducts/ProductPricingPhase.ts +71 -0
  278. package/src/dto/storeProducts/ProductStoreDetails.ts +151 -0
  279. package/src/dto/storeProducts/SKPaymentDiscount.ts +23 -0
  280. package/src/dto/storeProducts/SKProduct.ts +53 -0
  281. package/src/dto/storeProducts/SKProductDiscount.ts +38 -0
  282. package/src/dto/storeProducts/SKSubscriptionPeriod.ts +13 -0
  283. package/src/dto/storeProducts/SkuDetails.ts +68 -0
  284. package/src/index.ts +43 -0
  285. package/src/internal/Mapper.ts +1221 -0
  286. package/src/internal/NoCodesInternal.ts +84 -0
  287. package/src/internal/QonversionInternal.ts +370 -0
  288. package/src/internal/specs/NativeNoCodesModule.ts +20 -0
  289. package/src/internal/specs/NativeQonversionModule.ts +74 -0
  290. package/src/internal/utils.ts +9 -0
@@ -0,0 +1,278 @@
1
+ package com.reactlibrary
2
+
3
+ import android.app.Activity
4
+ import android.app.Application
5
+ import com.facebook.react.bridge.Promise
6
+ import com.facebook.react.bridge.ReactApplicationContext
7
+ import com.facebook.react.bridge.ReactMethod
8
+ import com.facebook.react.bridge.ReadableArray
9
+ import com.facebook.react.bridge.ReadableMap
10
+ import com.facebook.react.module.annotations.ReactModule
11
+ import com.qonversion.reactnativesdk.EntitiesConverter
12
+ import com.qonversion.reactnativesdk.NativeQonversionModuleSpec
13
+ import com.qonversion.reactnativesdk.Utils.Companion.getResultListener
14
+ import io.qonversion.sandwich.ActivityProvider
15
+ import io.qonversion.sandwich.BridgeData
16
+ import io.qonversion.sandwich.QonversionEventsListener
17
+ import io.qonversion.sandwich.QonversionSandwich
18
+ import org.json.JSONException
19
+
20
+ @ReactModule(name = QonversionModule.NAME)
21
+ class QonversionModule(reactContext: ReactApplicationContext) : NativeQonversionModuleSpec(reactContext), QonversionEventsListener {
22
+ private val qonversionSandwich = QonversionSandwich(
23
+ (reactContext.applicationContext as Application),
24
+ object : ActivityProvider {
25
+ override val currentActivity: Activity?
26
+ get() = this@QonversionModule.currentActivity
27
+ },
28
+ this
29
+ )
30
+
31
+ override fun getName(): String {
32
+ return NAME
33
+ }
34
+
35
+ @ReactMethod
36
+ override fun storeSDKInfo(source: String, sdkVersion: String) {
37
+ qonversionSandwich.storeSdkInfo(source, sdkVersion)
38
+ }
39
+
40
+ @ReactMethod
41
+ override fun initializeSdk(
42
+ projectKey: String,
43
+ launchModeKey: String,
44
+ environmentKey: String?,
45
+ entitlementsCacheLifetimeKey: String?,
46
+ proxyUrl: String?,
47
+ kidsMode: Boolean
48
+ ) {
49
+ qonversionSandwich.initialize(
50
+ reactApplicationContext,
51
+ projectKey,
52
+ launchModeKey,
53
+ environmentKey,
54
+ entitlementsCacheLifetimeKey,
55
+ proxyUrl,
56
+ kidsMode
57
+ )
58
+ }
59
+
60
+ @ReactMethod
61
+ override fun syncHistoricalData() {
62
+ qonversionSandwich.syncHistoricalData()
63
+ }
64
+
65
+ @ReactMethod
66
+ override fun purchase(
67
+ productId: String,
68
+ quantity: Double,
69
+ contextKeys: ReadableArray?,
70
+ promoOffer: ReadableMap?,
71
+ offerId: String?,
72
+ applyOffer: Boolean,
73
+ oldProductId: String?,
74
+ updatePolicyKey: String?,
75
+ promise: Promise
76
+ ) {
77
+ var contextKeysList: List<String>? = null
78
+ if (contextKeys != null) {
79
+ contextKeysList = EntitiesConverter.convertArrayToStringList(contextKeys)
80
+ }
81
+ qonversionSandwich.purchase(
82
+ productId,
83
+ offerId,
84
+ applyOffer,
85
+ oldProductId,
86
+ updatePolicyKey,
87
+ contextKeysList,
88
+ getResultListener(promise)
89
+ )
90
+ }
91
+
92
+ @ReactMethod
93
+ override fun updatePurchase(
94
+ productId: String,
95
+ offerId: String?,
96
+ applyOffer: Boolean,
97
+ oldProductId: String?,
98
+ updatePolicyKey: String?,
99
+ promise: Promise
100
+ ) {
101
+ purchase(
102
+ productId,
103
+ 1.0,
104
+ null,
105
+ null,
106
+ offerId,
107
+ applyOffer,
108
+ oldProductId,
109
+ updatePolicyKey,
110
+ promise
111
+ )
112
+ }
113
+
114
+ @ReactMethod
115
+ override fun setDefinedProperty(key: String, value: String) {
116
+ qonversionSandwich.setDefinedProperty(key, value)
117
+ }
118
+
119
+ @ReactMethod
120
+ override fun setCustomProperty(key: String, value: String) {
121
+ qonversionSandwich.setCustomProperty(key, value)
122
+ }
123
+
124
+ @ReactMethod
125
+ override fun userProperties(promise: Promise) {
126
+ qonversionSandwich.userProperties(getResultListener(promise))
127
+ }
128
+
129
+ @ReactMethod
130
+ override fun addAttributionData(map: ReadableMap?, provider: String) {
131
+ try {
132
+ val attributesHashMap = EntitiesConverter.convertReadableMapToHashMap(
133
+ map!!
134
+ )
135
+ qonversionSandwich.addAttributionData(provider, attributesHashMap)
136
+ } catch (e: JSONException) {
137
+ e.printStackTrace()
138
+ }
139
+ }
140
+
141
+ @ReactMethod
142
+ override fun checkEntitlements(promise: Promise) {
143
+ qonversionSandwich.checkEntitlements(getResultListener(promise))
144
+ }
145
+
146
+ @ReactMethod
147
+ override fun products(promise: Promise) {
148
+ qonversionSandwich.products(getResultListener(promise))
149
+ }
150
+
151
+ @ReactMethod
152
+ override fun offerings(promise: Promise) {
153
+ qonversionSandwich.offerings(getResultListener(promise))
154
+ }
155
+
156
+ @ReactMethod
157
+ override fun checkTrialIntroEligibilityForProductIds(ids: ReadableArray?, promise: Promise) {
158
+ val idList = EntitiesConverter.convertArrayToStringList(
159
+ ids!!
160
+ )
161
+ qonversionSandwich.checkTrialIntroEligibility(idList, getResultListener(promise))
162
+ }
163
+
164
+ @ReactMethod
165
+ override fun restore(promise: Promise) {
166
+ qonversionSandwich.restore(getResultListener(promise))
167
+ }
168
+
169
+ @ReactMethod
170
+ override fun syncPurchases() {
171
+ qonversionSandwich.syncPurchases()
172
+ }
173
+
174
+ @ReactMethod
175
+ override fun identify(userId: String, promise: Promise) {
176
+ qonversionSandwich.identify(userId, getResultListener(promise))
177
+ }
178
+
179
+ @ReactMethod
180
+ override fun logout() {
181
+ qonversionSandwich.logout()
182
+ }
183
+
184
+ @ReactMethod
185
+ override fun userInfo(promise: Promise) {
186
+ qonversionSandwich.userInfo(getResultListener(promise))
187
+ }
188
+
189
+ @ReactMethod
190
+ override fun remoteConfig(contextKey: String?, promise: Promise) {
191
+ qonversionSandwich.remoteConfig(contextKey, getResultListener(promise))
192
+ }
193
+
194
+ @ReactMethod
195
+ override fun remoteConfigList(promise: Promise) {
196
+ qonversionSandwich.remoteConfigList(getResultListener(promise))
197
+ }
198
+
199
+ @ReactMethod
200
+ override fun remoteConfigListForContextKeys(
201
+ contextKeys: ReadableArray?,
202
+ includeEmptyContextKey: Boolean,
203
+ promise: Promise
204
+ ) {
205
+ val keysList = EntitiesConverter.convertArrayToStringList(
206
+ contextKeys!!
207
+ )
208
+ qonversionSandwich.remoteConfigList(
209
+ keysList,
210
+ includeEmptyContextKey,
211
+ getResultListener(promise)
212
+ )
213
+ }
214
+
215
+ @ReactMethod
216
+ override fun attachUserToExperiment(experimentId: String, groupId: String, promise: Promise) {
217
+ qonversionSandwich.attachUserToExperiment(experimentId, groupId, getResultListener(promise))
218
+ }
219
+
220
+ @ReactMethod
221
+ override fun detachUserFromExperiment(experimentId: String, promise: Promise) {
222
+ qonversionSandwich.detachUserFromExperiment(experimentId, getResultListener(promise))
223
+ }
224
+
225
+ @ReactMethod
226
+ override fun attachUserToRemoteConfiguration(remoteConfigurationId: String, promise: Promise) {
227
+ qonversionSandwich.attachUserToRemoteConfiguration(
228
+ remoteConfigurationId,
229
+ getResultListener(promise)
230
+ )
231
+ }
232
+
233
+ @ReactMethod
234
+ override fun detachUserFromRemoteConfiguration(remoteConfigurationId: String, promise: Promise) {
235
+ qonversionSandwich.detachUserFromRemoteConfiguration(
236
+ remoteConfigurationId,
237
+ getResultListener(promise)
238
+ )
239
+ }
240
+
241
+ @ReactMethod
242
+ override fun isFallbackFileAccessible(promise: Promise) {
243
+ qonversionSandwich.isFallbackFileAccessible(getResultListener(promise))
244
+ }
245
+
246
+ override fun syncStoreKit2Purchases() {
247
+ // iOS only
248
+ }
249
+
250
+ override fun collectAdvertisingId() {
251
+ // iOS only
252
+ }
253
+
254
+ override fun collectAppleSearchAdsAttribution() {
255
+ // iOS only
256
+ }
257
+
258
+ override fun presentCodeRedemptionSheet() {
259
+ // iOS only
260
+ }
261
+
262
+ override fun promoPurchase(productId: String?, promise: Promise?) {
263
+ // iOS only
264
+ }
265
+
266
+ override fun getPromotionalOffer(product: String?, discount: String?, promise: Promise?) {
267
+ // iOS only
268
+ }
269
+
270
+ override fun onEntitlementsUpdated(entitlements: BridgeData) {
271
+ val mappedEntitlements = EntitiesConverter.convertMapToWritableMap(entitlements)
272
+ emitOnEntitlementsUpdated(mappedEntitlements)
273
+ }
274
+
275
+ companion object {
276
+ const val NAME = "RNQonversion"
277
+ }
278
+ }
@@ -0,0 +1,43 @@
1
+ package com.qonversion.reactnativesdk
2
+
3
+ import com.facebook.react.BaseReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfo
7
+ import com.facebook.react.module.model.ReactModuleInfoProvider
8
+ import com.reactlibrary.QonversionModule
9
+
10
+ class QonversionPackage : BaseReactPackage() {
11
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
+ return if (name == NoCodesModule.NAME) {
13
+ NoCodesModule(reactContext)
14
+ } else if (name == QonversionModule.NAME) {
15
+ QonversionModule(reactContext)
16
+ } else {
17
+ null
18
+ }
19
+ }
20
+
21
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
22
+ return ReactModuleInfoProvider {
23
+ mapOf(
24
+ QonversionModule.NAME to ReactModuleInfo(
25
+ QonversionModule.NAME,
26
+ QonversionModule.NAME,
27
+ canOverrideExistingModule = false,
28
+ needsEagerInit = false,
29
+ isCxxModule = false,
30
+ isTurboModule = true
31
+ ),
32
+ NoCodesModule.NAME to ReactModuleInfo(
33
+ NoCodesModule.NAME,
34
+ NoCodesModule.NAME,
35
+ canOverrideExistingModule = false,
36
+ needsEagerInit = false,
37
+ isCxxModule = false,
38
+ isTurboModule = true
39
+ )
40
+ )
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,32 @@
1
+ package com.qonversion.reactnativesdk
2
+
3
+ import com.facebook.react.bridge.Promise
4
+ import com.facebook.react.bridge.WritableMap
5
+ import io.qonversion.sandwich.ResultListener
6
+ import io.qonversion.sandwich.SandwichError
7
+
8
+ class Utils {
9
+ companion object {
10
+ @JvmStatic
11
+ fun getResultListener(promise: Promise): ResultListener {
12
+ return object : ResultListener {
13
+ override fun onSuccess(data: Map<String, *>) {
14
+ val payload: WritableMap = EntitiesConverter.convertMapToWritableMap(data)
15
+ promise.resolve(payload)
16
+ }
17
+
18
+ override fun onError(error: SandwichError) {
19
+ rejectWithError(error, promise)
20
+ }
21
+ }
22
+ }
23
+
24
+ @JvmStatic
25
+ @JvmOverloads
26
+ fun rejectWithError(sandwichError: SandwichError, promise: Promise, customErrorCode: String? = null) {
27
+ val errorMessage = sandwichError.description + "\n" + sandwichError.additionalMessage
28
+ val errorCode = customErrorCode ?: sandwichError.code
29
+ promise.reject(errorCode, errorMessage)
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ #import <QonversionSdkSpec/QonversionSdkSpec.h>
2
+
3
+ @interface RNNoCodes : NativeNoCodesModuleSpecBase <NativeNoCodesModuleSpec>
4
+
5
+ @end
@@ -0,0 +1,61 @@
1
+ #import "RNNoCodes.h"
2
+ #import "qonversion_react_native_sdk-Swift.h"
3
+
4
+ @interface RNNoCodes () <NoCodesEventDelegate>
5
+
6
+ @property (nonatomic, strong) RNNoCodesImpl *impl;
7
+
8
+ @end
9
+
10
+ @implementation RNNoCodes RCT_EXPORT_MODULE()
11
+
12
+ - (instancetype)init {
13
+ self = [super init];
14
+ if (self) {
15
+ _impl = [[RNNoCodesImpl alloc] init];
16
+ [_impl setDelegate:self];
17
+ }
18
+ return self;
19
+ }
20
+
21
+ - (void)initialize:(NSString *)projectKey
22
+ source:(NSString *)source
23
+ version:(NSString *)version {
24
+ [self.impl initializeWithProjectKey:projectKey source:source version:version];
25
+ }
26
+
27
+ - (void)setScreenPresentationConfig:(NSDictionary *)configData
28
+ contextKey:(NSString *)contextKey
29
+ resolve:(RCTPromiseResolveBlock)resolve
30
+ reject:(RCTPromiseRejectBlock)reject {
31
+ [self.impl setScreenPresentationConfig:configData contextKey:contextKey];
32
+ }
33
+
34
+ - (void)showScreen:(NSString *)contextKey
35
+ resolve:(RCTPromiseResolveBlock)resolve
36
+ reject:(RCTPromiseRejectBlock)reject {
37
+ dispatch_async(dispatch_get_main_queue(), ^{
38
+ [self.impl showScreenWithContextKey:contextKey];
39
+ });
40
+ }
41
+
42
+ - (void)close:(RCTPromiseResolveBlock)resolve
43
+ reject:(RCTPromiseRejectBlock)reject {
44
+ dispatch_async(dispatch_get_main_queue(), ^{
45
+ [self.impl close];
46
+ });
47
+ }
48
+
49
+ - (void)noCodesDidTriggerWithEvent:(NSString * _Nonnull)event payload:(NSDictionary<NSString *,id> * _Nullable)payload {
50
+ [self emitOnNoCodeEvent:@{@"name": event, @"payload": payload ?: [NSNull null]}];
51
+ }
52
+
53
+ #pragma mark - TurboModule
54
+
55
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
56
+ (const facebook::react::ObjCTurboModule::InitParams &)params
57
+ {
58
+ return std::make_shared<facebook::react::NativeNoCodesModuleSpecJSI>(params);
59
+ }
60
+
61
+ @end
@@ -0,0 +1,69 @@
1
+ //
2
+ // RNNoCodesImpl.swift
3
+ // qonversion-react-native-sdk
4
+ //
5
+ // Created by Kamo Spertsyan on 15.08.2025.
6
+ //
7
+
8
+ import Foundation
9
+ import QonversionSandwich
10
+ import React
11
+
12
+ @objc
13
+ public protocol NoCodesEventDelegate {
14
+ func noCodesDidTrigger(event: String, payload: [String: Any]?)
15
+ }
16
+
17
+ class NoCodesEventHandler: NoCodesEventListener {
18
+ weak var delegate: NoCodesEventDelegate?
19
+
20
+ init(delegate: NoCodesEventDelegate?) {
21
+ self.delegate = delegate
22
+ }
23
+
24
+ func noCodesDidTrigger(event: String, payload: [String : Any]?) {
25
+ delegate?.noCodesDidTrigger(event: event, payload: payload)
26
+ }
27
+ }
28
+
29
+ @objc
30
+ public class RNNoCodesImpl: NSObject {
31
+
32
+ var noCodesSandwich: NoCodesSandwich?
33
+ var eventHandler: NoCodesEventHandler
34
+
35
+ @objc
36
+ public override init() {
37
+ eventHandler = NoCodesEventHandler(delegate: nil)
38
+
39
+ super.init()
40
+
41
+ noCodesSandwich = NoCodesSandwich(noCodesEventListener: eventHandler)
42
+ }
43
+
44
+ @objc
45
+ public func initialize(projectKey: String, source: String, version: String) {
46
+ // Ignore source and version, because it's taken from the Qonversion SDK.
47
+ noCodesSandwich?.initialize(projectKey: projectKey)
48
+ }
49
+
50
+ @MainActor @objc
51
+ public func setScreenPresentationConfig(_ configData: [String: Any], contextKey: String) {
52
+ noCodesSandwich?.setScreenPresentationConfig(configData, forContextKey: contextKey)
53
+ }
54
+
55
+ @MainActor @objc
56
+ public func showScreen(contextKey: String) {
57
+ noCodesSandwich?.showScreen(contextKey)
58
+ }
59
+
60
+ @MainActor @objc
61
+ public func close() {
62
+ noCodesSandwich?.close()
63
+ }
64
+
65
+ @objc
66
+ public func setDelegate(_ delegate: NoCodesEventDelegate?) {
67
+ eventHandler.delegate = delegate
68
+ }
69
+ }
@@ -0,0 +1,5 @@
1
+ #import <QonversionSdkSpec/QonversionSdkSpec.h>
2
+
3
+ @interface RNQonversion : NativeQonversionModuleSpecBase <NativeQonversionModuleSpec>
4
+
5
+ @end
@@ -0,0 +1,189 @@
1
+ #import "RNQonversion.h"
2
+ #import "qonversion_react_native_sdk-Swift.h"
3
+
4
+ @interface RNQonversion () <QonversionEventDelegate>
5
+
6
+ @property (nonatomic, strong) RNQonversionImpl *impl;
7
+
8
+ @end
9
+
10
+ @implementation RNQonversion RCT_EXPORT_MODULE()
11
+
12
+ - (instancetype)init {
13
+ self = [super init];
14
+ if (self) {
15
+ _impl = [[RNQonversionImpl alloc] init];
16
+ [_impl setDelegate:self];
17
+ }
18
+ return self;
19
+ }
20
+
21
+ - (void)storeSDKInfo:(nonnull NSString *)sdkName sdkVersion:(nonnull NSString *)sdkVersion {
22
+ [self.impl storeSDKInfo:sdkName version:sdkVersion];
23
+ }
24
+
25
+ - (void)initializeSdk:(nonnull NSString *)projectKey launchMode:(nonnull NSString *)launchModeKey environment:(nonnull NSString *)environmentKey entitlementsCacheLifetime:(nonnull NSString *)cacheLifetimeKey proxyUrl:(NSString * _Nullable)proxyUrl kidsMode:(BOOL)kidsMode {
26
+ [self.impl initializeSdk:projectKey launchModeKey:launchModeKey environmentKey:environmentKey cacheLifetimeKey:cacheLifetimeKey proxyUrl:proxyUrl kidsMode:kidsMode];
27
+ }
28
+
29
+ - (void)syncHistoricalData {
30
+ [self.impl syncHistoricalData];
31
+ }
32
+
33
+ - (void)syncStoreKit2Purchases {
34
+ [self.impl syncStoreKit2Purchases];
35
+ }
36
+
37
+ - (void)getPromotionalOffer:(nonnull NSString *)productId discount:(NSString * _Nullable)discountId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
38
+ [self.impl getPromotionalOffer:productId discountId:discountId resolve:resolve reject:reject];
39
+ }
40
+
41
+ - (void)purchase:(nonnull NSString *)productId quantity:(double)quantity contextKeys:(NSArray * _Nullable)contextKeys promoOffer:(JS::NativeQonversionModule::QPromoOfferDetails &)promoOffer offerId:(NSString * _Nullable)offerId applyOffer:(BOOL)applyOffer oldProductId:(NSString * _Nullable)oldProductId updatePolicyKey:(NSString * _Nullable)updatePolicyKey resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
42
+ NSDictionary *promoOfferDict = convertPromoOfferDetailsToDictionary(promoOffer);
43
+ [self.impl purchase:productId quantity:quantity contextKeys:contextKeys promoOffer:promoOfferDict resolve:resolve reject:reject];
44
+ }
45
+
46
+ - (void)setDefinedProperty:(NSString *)property value:(NSString *)value {
47
+ [self.impl setDefinedProperty:property value:value];
48
+ }
49
+
50
+ - (void)setCustomProperty:(NSString *)property value:(NSString *)value {
51
+ [self.impl setCustomProperty:property value:value];
52
+ }
53
+
54
+ - (void)userProperties:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
55
+ [self.impl userProperties:resolve reject:reject];
56
+ }
57
+
58
+ - (void)addAttributionData:(NSDictionary *)data provider:(NSString *)provider {
59
+ [self.impl addAttributionData:data provider:provider];
60
+ }
61
+
62
+ - (void)checkEntitlements:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
63
+ [self.impl checkEntitlements:resolve reject:reject];
64
+ }
65
+
66
+ - (void)products:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
67
+ [self.impl products:resolve reject:reject];
68
+ }
69
+
70
+ - (void)offerings:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
71
+ [self.impl offerings:resolve reject:reject];
72
+ }
73
+
74
+ - (void)checkTrialIntroEligibilityForProductIds:(NSArray *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
75
+ [self.impl checkTrialIntroEligibilityForProductIds:data resolve:resolve reject:reject];
76
+ }
77
+
78
+ - (void)restore:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
79
+ [self.impl restore:resolve reject:reject];
80
+ }
81
+
82
+ - (void)identify:(NSString *)userId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
83
+ [self.impl identify:userId resolve:resolve reject:reject];
84
+ }
85
+
86
+ - (void)logout {
87
+ [self.impl logout];
88
+ }
89
+
90
+ - (void)userInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
91
+ [self.impl userInfo:resolve reject:reject];
92
+ }
93
+
94
+ - (void)remoteConfig:(NSString *)contextKey resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
95
+ [self.impl remoteConfig:contextKey resolve:resolve reject:reject];
96
+ }
97
+
98
+ - (void)remoteConfigList:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
99
+ [self.impl remoteConfigList:resolve reject:reject];
100
+ }
101
+
102
+ - (void)remoteConfigListForContextKeys:(NSArray<NSString *> *)contextKeys includeEmptyContextKey:(BOOL)includeEmptyContextKey resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
103
+ [self.impl remoteConfigListForContextKeys:contextKeys includeEmptyContextKey:includeEmptyContextKey resolve:resolve reject:reject];
104
+ }
105
+
106
+ - (void)attachUserToExperiment:(NSString *)experimentId groupId:(NSString *)groupId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
107
+ [self.impl attachUserToExperiment:experimentId groupId:groupId resolve:resolve reject:reject];
108
+ }
109
+
110
+ - (void)detachUserFromExperiment:(NSString *)experimentId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
111
+ [self.impl detachUserFromExperiment:experimentId resolve:resolve reject:reject];
112
+ }
113
+
114
+ - (void)attachUserToRemoteConfiguration:(NSString *)remoteConfigurationId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
115
+ [self.impl attachUserToRemoteConfiguration:remoteConfigurationId resolve:resolve reject:reject];
116
+ }
117
+
118
+ - (void)detachUserFromRemoteConfiguration:(NSString *)remoteConfigurationId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
119
+ [self.impl detachUserFromRemoteConfiguration:remoteConfigurationId resolve:resolve reject:reject];
120
+ }
121
+
122
+ - (void)isFallbackFileAccessible:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
123
+ [self.impl isFallbackFileAccessible:resolve reject:reject];
124
+ }
125
+
126
+ - (void)collectAdvertisingId {
127
+ [self.impl collectAdvertisingId];
128
+ }
129
+
130
+ - (void)collectAppleSearchAdsAttribution {
131
+ [self.impl collectAppleSearchAdsAttribution];
132
+ }
133
+
134
+ - (void)promoPurchase:(NSString *)storeProductId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
135
+ [self.impl promoPurchase:storeProductId resolve:resolve reject:reject];
136
+ }
137
+
138
+ - (void)presentCodeRedemptionSheet {
139
+ [self.impl presentCodeRedemptionSheet];
140
+ }
141
+
142
+ - (void)syncPurchases {
143
+ // Android only.
144
+ }
145
+
146
+ - (void)updatePurchase:(nonnull NSString *)productId offerId:(NSString * _Nullable)offerId applyOffer:(BOOL)applyOffer oldProductId:(NSString * _Nullable)oldProductId updatePolicyKey:(NSString * _Nullable)updatePolicyKey resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
147
+ // Android only
148
+ }
149
+
150
+
151
+ - (void)qonversionDidReceiveUpdatedEntitlements:(NSDictionary<NSString *,id> * _Nonnull)entitlements {
152
+ [self emitOnEntitlementsUpdated:entitlements];
153
+ }
154
+
155
+ - (void)shouldPurchasePromoProductWith:(NSString * _Nonnull)productId {
156
+ [self emitOnPromoPurchaseReceived:productId];
157
+ }
158
+
159
+ #pragma mark - Private
160
+
161
+ NSDictionary *convertPromoOfferDetailsToDictionary(JS::NativeQonversionModule::QPromoOfferDetails &promoOffer) {
162
+ NSMutableDictionary *dict = [NSMutableDictionary dictionary];
163
+ if (promoOffer.productDiscountId()) {
164
+ dict[@"productDiscountId"] = promoOffer.productDiscountId();
165
+ }
166
+ if (promoOffer.keyIdentifier()) {
167
+ dict[@"keyIdentifier"] = promoOffer.keyIdentifier();
168
+ }
169
+ if (promoOffer.nonce()) {
170
+ dict[@"nonce"] = promoOffer.nonce();
171
+ }
172
+ if (promoOffer.signature()) {
173
+ dict[@"signature"] = promoOffer.signature();
174
+ }
175
+ if (promoOffer.timestamp()) {
176
+ dict[@"timestamp"] = @(promoOffer.timestamp().value());
177
+ }
178
+ return [dict copy];
179
+ }
180
+
181
+ #pragma mark - TurboModule
182
+
183
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
184
+ (const facebook::react::ObjCTurboModule::InitParams &)params
185
+ {
186
+ return std::make_shared<facebook::react::NativeQonversionModuleSpecJSI>(params);
187
+ }
188
+
189
+ @end