cloudx-react-native 3.4.7 → 3.6.0

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 (95) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +11 -5
  3. package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +14 -0
  4. package/android/src/main/java/com/cloudxreactnative/CloudXAdView.kt +9 -15
  5. package/android/src/main/java/com/cloudxreactnative/CloudXAdViewEvent.kt +1 -1
  6. package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +166 -0
  7. package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +7 -0
  8. package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +7 -0
  9. package/cloudx-react-native.podspec +3 -3
  10. package/ios/CloudX.h +2 -2
  11. package/ios/CloudX.mm +255 -5
  12. package/ios/CloudXAdView.h +10 -12
  13. package/ios/CloudXAdView.mm +10 -15
  14. package/ios/CloudXAdViewManager.h +6 -6
  15. package/ios/CloudXAdViewManager.mm +4 -4
  16. package/lib/commonjs/CloudX.js +5 -1
  17. package/lib/commonjs/CloudX.js.map +1 -1
  18. package/lib/commonjs/CloudXAdViewBase.js +11 -9
  19. package/lib/commonjs/CloudXAdViewBase.js.map +1 -1
  20. package/lib/commonjs/CloudXAppOpenAd.js +98 -0
  21. package/lib/commonjs/CloudXAppOpenAd.js.map +1 -0
  22. package/lib/commonjs/CloudXBannerView.js +2 -2
  23. package/lib/commonjs/CloudXMRECView.js +2 -2
  24. package/lib/commonjs/hooks.js +81 -0
  25. package/lib/commonjs/hooks.js.map +1 -1
  26. package/lib/commonjs/index.js +37 -0
  27. package/lib/commonjs/index.js.map +1 -1
  28. package/lib/commonjs/specs/CloudXAdViewNativeComponent.js +1 -1
  29. package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
  30. package/lib/commonjs/types/AppOpenAd.js +6 -0
  31. package/lib/commonjs/types/AppOpenAd.js.map +1 -0
  32. package/lib/commonjs/types/RevenueData.js +21 -0
  33. package/lib/commonjs/types/RevenueData.js.map +1 -0
  34. package/lib/commonjs/types/index.js +17 -0
  35. package/lib/commonjs/types/index.js.map +1 -1
  36. package/lib/commonjs/version.js +1 -1
  37. package/lib/module/CloudX.js +5 -1
  38. package/lib/module/CloudX.js.map +1 -1
  39. package/lib/module/CloudXAdViewBase.js +11 -9
  40. package/lib/module/CloudXAdViewBase.js.map +1 -1
  41. package/lib/module/CloudXAppOpenAd.js +91 -0
  42. package/lib/module/CloudXAppOpenAd.js.map +1 -0
  43. package/lib/module/CloudXBannerView.js +2 -2
  44. package/lib/module/CloudXMRECView.js +2 -2
  45. package/lib/module/hooks.js +80 -0
  46. package/lib/module/hooks.js.map +1 -1
  47. package/lib/module/index.js +7 -1
  48. package/lib/module/index.js.map +1 -1
  49. package/lib/module/specs/CloudXAdViewNativeComponent.js +1 -1
  50. package/lib/module/specs/NativeCloudX.js.map +1 -1
  51. package/lib/module/types/AppOpenAd.js +2 -0
  52. package/lib/module/types/AppOpenAd.js.map +1 -0
  53. package/lib/module/types/RevenueData.js +15 -0
  54. package/lib/module/types/RevenueData.js.map +1 -0
  55. package/lib/module/types/index.js +1 -1
  56. package/lib/module/types/index.js.map +1 -1
  57. package/lib/module/version.js +1 -1
  58. package/lib/typescript/src/CloudX.d.ts.map +1 -1
  59. package/lib/typescript/src/CloudXAdViewBase.d.ts +1 -1
  60. package/lib/typescript/src/CloudXAdViewBase.d.ts.map +1 -1
  61. package/lib/typescript/src/CloudXAppOpenAd.d.ts +4 -0
  62. package/lib/typescript/src/CloudXAppOpenAd.d.ts.map +1 -0
  63. package/lib/typescript/src/CloudXBannerView.d.ts +2 -2
  64. package/lib/typescript/src/CloudXMRECView.d.ts +2 -2
  65. package/lib/typescript/src/hooks.d.ts +14 -0
  66. package/lib/typescript/src/hooks.d.ts.map +1 -1
  67. package/lib/typescript/src/index.d.ts +6 -3
  68. package/lib/typescript/src/index.d.ts.map +1 -1
  69. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +1 -1
  70. package/lib/typescript/src/specs/NativeCloudX.d.ts +13 -0
  71. package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
  72. package/lib/typescript/src/types/AppOpenAd.d.ts +8 -0
  73. package/lib/typescript/src/types/AppOpenAd.d.ts.map +1 -0
  74. package/lib/typescript/src/types/CloudX.d.ts +6 -0
  75. package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
  76. package/lib/typescript/src/types/RevenueData.d.ts +32 -0
  77. package/lib/typescript/src/types/RevenueData.d.ts.map +1 -0
  78. package/lib/typescript/src/types/index.d.ts +3 -0
  79. package/lib/typescript/src/types/index.d.ts.map +1 -1
  80. package/lib/typescript/src/version.d.ts +1 -1
  81. package/package.json +6 -2
  82. package/src/CloudX.ts +6 -0
  83. package/src/CloudXAdViewBase.tsx +12 -11
  84. package/src/CloudXAppOpenAd.ts +109 -0
  85. package/src/CloudXBannerView.tsx +2 -2
  86. package/src/CloudXMRECView.tsx +2 -2
  87. package/src/hooks.ts +103 -0
  88. package/src/index.ts +17 -2
  89. package/src/specs/CloudXAdViewNativeComponent.ts +1 -1
  90. package/src/specs/NativeCloudX.ts +22 -0
  91. package/src/types/AppOpenAd.ts +8 -0
  92. package/src/types/CloudX.ts +7 -0
  93. package/src/types/RevenueData.ts +39 -0
  94. package/src/types/index.ts +3 -0
  95. package/src/version.ts +1 -1
@@ -72,5 +72,5 @@ repositories {
72
72
  dependencies {
73
73
  implementation "com.facebook.react:react-native:0.76.2"
74
74
 
75
- implementation "io.cloudx:sdk:4.1.7"
75
+ implementation "io.cloudx:sdk:4.4.0"
76
76
  }
@@ -17,11 +17,8 @@ object CloudXAdEvents {
17
17
  const val ON_MREC_AD_COLLAPSED_EVENT = "OnMRecAdCollapsedEvent"
18
18
  const val ON_MREC_AD_REVENUE_PAID = "OnMRecAdRevenuePaid"
19
19
 
20
- /*
21
- * In-tree Ad View component (CloudXBannerView / CloudXMRECView) per-view
22
- * direct events. These strings are both the event key and the JS prop
23
- * registrationName.
24
- */
20
+ // In-tree Ad View component (CloudXBannerView / CloudXMRECView) per-view direct events.
21
+ // These strings are both the event key and the JS prop registrationName.
25
22
  const val ON_AD_VIEW_LOADED_EVENT = "onAdLoadedEvent"
26
23
  const val ON_AD_VIEW_LOAD_FAILED_EVENT = "onAdLoadFailedEvent"
27
24
  const val ON_AD_VIEW_CLICKED_EVENT = "onAdClickedEvent"
@@ -36,6 +33,15 @@ object CloudXAdEvents {
36
33
  const val ON_INTERSTITIAL_HIDDEN_EVENT = "OnInterstitialHiddenEvent"
37
34
  const val ON_INTERSTITIAL_AD_REVENUE_PAID = "OnInterstitialAdRevenuePaid"
38
35
 
36
+ // App Open Events
37
+ const val ON_APPOPEN_LOADED_EVENT = "OnAppOpenLoadedEvent"
38
+ const val ON_APPOPEN_LOAD_FAILED_EVENT = "OnAppOpenLoadFailedEvent"
39
+ const val ON_APPOPEN_CLICKED_EVENT = "OnAppOpenClickedEvent"
40
+ const val ON_APPOPEN_DISPLAYED_EVENT = "OnAppOpenDisplayedEvent"
41
+ const val ON_APPOPEN_DISPLAY_FAILED_EVENT = "OnAppOpenDisplayFailedEvent"
42
+ const val ON_APPOPEN_HIDDEN_EVENT = "OnAppOpenHiddenEvent"
43
+ const val ON_APPOPEN_AD_REVENUE_PAID = "OnAppOpenAdRevenuePaid"
44
+
39
45
  // Rewarded Events
40
46
  const val ON_REWARDED_AD_LOADED_EVENT = "OnRewardedAdLoadedEvent"
41
47
  const val ON_REWARDED_AD_LOAD_FAILED_EVENT = "OnRewardedAdLoadFailedEvent"
@@ -39,3 +39,17 @@ fun getAdDisplayFailedInfo(ad: CloudXAd, error: CloudXError): WritableMap {
39
39
  map.putString("message", error.message)
40
40
  return map
41
41
  }
42
+
43
+ /**
44
+ * Synthetic display-failure payload for the no-current-activity show path.
45
+ * Mirrors the iOS no-view-controller payload ({adUnitId, code: -1, message})
46
+ * so JS can reset its isLoaded state instead of hanging on a show that
47
+ * silently never happened.
48
+ */
49
+ fun getNoActivityDisplayFailedInfo(adUnitId: String): WritableMap {
50
+ val map = Arguments.createMap()
51
+ map.putString("adUnitId", adUnitId)
52
+ map.putInt("code", -1)
53
+ map.putString("message", "No activity available to show the ad from")
54
+ return map
55
+ }
@@ -28,11 +28,9 @@ class CloudXAdView(private val reactContext: ThemedReactContext) : FrameLayout(r
28
28
  const val TAG = "CloudXAdView"
29
29
  }
30
30
 
31
- /*
32
- * adUnitId / adFormat are immutable once the ad view is created. Changing
33
- * them on a mounted view is ignored (with a warning) - remount via a React
34
- * key instead. The value check keeps benign same-value re-renders quiet.
35
- */
31
+ // adUnitId / adFormat are immutable once the ad view is created. Changing
32
+ // them on a mounted view is ignored (with a warning) — remount via a React
33
+ // key instead. The value check keeps benign same-value re-renders quiet.
36
34
  var adUnitId: String? = null
37
35
  set(value) {
38
36
  if (adView != null && value != field) {
@@ -80,7 +78,7 @@ class CloudXAdView(private val reactContext: ThemedReactContext) : FrameLayout(r
80
78
 
81
79
  /*
82
80
  * ReactViewGroup no-ops requestLayout, and getWidth()/getHeight() are 0 on
83
- * attach - re-run measure/layout on the next frame so the hosted ad renders.
81
+ * attach — re-run measure/layout on the next frame so the hosted ad renders.
84
82
  */
85
83
  override fun requestLayout() {
86
84
  super.requestLayout()
@@ -130,10 +128,8 @@ class CloudXAdView(private val reactContext: ThemedReactContext) : FrameLayout(r
130
128
  super.onDetachedFromWindow()
131
129
  adView?.stopAutoRefresh()
132
130
 
133
- /*
134
- * Defer one frame: a tab switch detaches but keeps the parent, a real
135
- * unmount removes it. Destroy only on a genuine unmount.
136
- */
131
+ // Defer one frame: a tab switch detaches but keeps the parent, a real
132
+ // unmount removes it. Destroy only on a genuine unmount.
137
133
  post {
138
134
  if (parent == null) {
139
135
  destroyAdView()
@@ -143,7 +139,7 @@ class CloudXAdView(private val reactContext: ThemedReactContext) : FrameLayout(r
143
139
  * unmount, so re-arm refresh. If the view is instead being
144
140
  * dropped, CloudXAdViewManagerImpl.onDropViewInstance calls
145
141
  * destroyAdView() first (nulling adView), so this stays a
146
- * null-safe no-op - refresh is never armed on a dead view.
142
+ * null-safe no-op — refresh is never armed on a dead view.
147
143
  */
148
144
  adView?.startAutoRefresh()
149
145
  }
@@ -233,10 +229,8 @@ class CloudXAdView(private val reactContext: ThemedReactContext) : FrameLayout(r
233
229
  private fun loadFailedPayload(failedAdUnitId: String, error: CloudXError): WritableMap {
234
230
  val map = Arguments.createMap()
235
231
  map.putString("adUnitId", failedAdUnitId)
236
- /*
237
- * Codegen spec declares `code` as Double; emit a double to match (and
238
- * to stay consistent with `revenue` and the iOS side).
239
- */
232
+ // Codegen spec declares `code` as Double; emit a double to match (and
233
+ // to stay consistent with `revenue` and the iOS side).
240
234
  map.putDouble("code", error.code.code.toDouble())
241
235
  map.putString("message", error.message)
242
236
  return map
@@ -21,7 +21,7 @@ class CloudXAdViewEvent(
21
21
  /*
22
22
  * Ad-lifecycle events are discrete and must never be dropped. The default
23
23
  * (true) lets the dispatcher coalesce events sharing the same
24
- * (eventName, viewId) within a batch, keeping only the latest - which would
24
+ * (eventName, viewId) within a batch, keeping only the latest — which would
25
25
  * silently drop, e.g., back-to-back revenue events on the same view.
26
26
  */
27
27
  override fun canCoalesce(): Boolean = false
@@ -30,9 +30,14 @@ import io.cloudx.sdk.CloudXArbiterResult
30
30
  import io.cloudx.sdk.CloudXError
31
31
  import io.cloudx.sdk.CloudXInitializationConfiguration
32
32
  import io.cloudx.sdk.CloudXInitializationListener
33
+ import io.cloudx.sdk.CloudXAppOpenAd
34
+ import io.cloudx.sdk.CloudXAppOpenListener
33
35
  import io.cloudx.sdk.CloudXInterstitialAd
34
36
  import io.cloudx.sdk.CloudXInterstitialListener
35
37
  import io.cloudx.sdk.CloudXLogLevel
38
+ import io.cloudx.sdk.CloudXRevenueData
39
+ import io.cloudx.sdk.CloudXRevenuePlatform
40
+ import io.cloudx.sdk.CloudXRevenuePrecision
36
41
  import io.cloudx.sdk.CloudXReward
37
42
  import io.cloudx.sdk.CloudXRewardedAd
38
43
  import io.cloudx.sdk.CloudXRewardedListener
@@ -47,6 +52,7 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
47
52
  }
48
53
 
49
54
  private val interstitials = ConcurrentHashMap<String, CloudXInterstitialAd>()
55
+ private val appOpenAds = ConcurrentHashMap<String, CloudXAppOpenAd>()
50
56
  private val rewardedAds = ConcurrentHashMap<String, CloudXRewardedAd>()
51
57
  private val adViews = ConcurrentHashMap<String, SdkAdView>()
52
58
  private val adViewAdFormats = ConcurrentHashMap<String, CloudXAdFormat>()
@@ -183,6 +189,15 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
183
189
  })
184
190
  }
185
191
 
192
+ fun reportRevenueData(data: ReadableMap, promise: Promise) {
193
+ val revenueData = data.toRevenueData()
194
+ if (revenueData == null) {
195
+ promise.resolve(false)
196
+ return
197
+ }
198
+ promise.resolve(CloudX.reportRevenueData(revenueData))
199
+ }
200
+
186
201
  // =========================================================================
187
202
  // Banner (Programmatic)
188
203
  // =========================================================================
@@ -243,6 +258,10 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
243
258
  val activity = maybeGetCurrentActivity()
244
259
  if (activity == null) {
245
260
  Log.e(TAG, "showInterstitial: no activity available")
261
+ sendReactNativeEvent(
262
+ CloudXAdEvents.ON_INTERSTITIAL_DISPLAY_FAILED_EVENT,
263
+ getNoActivityDisplayFailedInfo(adUnitId),
264
+ )
246
265
  return@runOnUiQueueThread
247
266
  }
248
267
  interstitial.show(activity, placement, customData)
@@ -259,6 +278,50 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
259
278
  }
260
279
  }
261
280
 
281
+ // =========================================================================
282
+ // App Open
283
+ // =========================================================================
284
+
285
+ fun loadAppOpen(adUnitId: String) {
286
+ retrieveAppOpen(adUnitId).load()
287
+ }
288
+
289
+ fun setAppOpenExtraParameters(adUnitId: String, extraParameters: ReadableMap) {
290
+ CloudXExtraParameters.forEach(extraParameters) { key, value ->
291
+ retrieveAppOpen(adUnitId).setExtraParameter(key, value)
292
+ }
293
+ }
294
+
295
+ fun isAppOpenReady(adUnitId: String, promise: Promise) {
296
+ promise.resolve(retrieveAppOpen(adUnitId).isAdReady)
297
+ }
298
+
299
+ fun showAppOpen(adUnitId: String, placement: String?, customData: String?) {
300
+ reactApplicationContext.runOnUiQueueThread {
301
+ val appOpen = retrieveAppOpen(adUnitId)
302
+ val activity = maybeGetCurrentActivity()
303
+ if (activity == null) {
304
+ Log.e(TAG, "showAppOpen: no activity available")
305
+ sendReactNativeEvent(
306
+ CloudXAdEvents.ON_APPOPEN_DISPLAY_FAILED_EVENT,
307
+ getNoActivityDisplayFailedInfo(adUnitId),
308
+ )
309
+ return@runOnUiQueueThread
310
+ }
311
+ appOpen.show(activity, placement, customData)
312
+ }
313
+ }
314
+
315
+ fun destroyAppOpen(adUnitId: String) {
316
+ reactApplicationContext.runOnUiQueueThread {
317
+ appOpenAds.remove(adUnitId)?.let {
318
+ it.listener = null
319
+ it.revenueListener = null
320
+ it.destroy()
321
+ }
322
+ }
323
+ }
324
+
262
325
  // =========================================================================
263
326
  // Rewarded
264
327
  // =========================================================================
@@ -283,6 +346,10 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
283
346
  val activity = maybeGetCurrentActivity()
284
347
  if (activity == null) {
285
348
  Log.e(TAG, "showRewarded: no activity available")
349
+ sendReactNativeEvent(
350
+ CloudXAdEvents.ON_REWARDED_AD_DISPLAY_FAILED_EVENT,
351
+ getNoActivityDisplayFailedInfo(adUnitId),
352
+ )
286
353
  return@runOnUiQueueThread
287
354
  }
288
355
  rewarded.show(activity, placement, customData)
@@ -372,6 +439,29 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
372
439
  }
373
440
  }
374
441
 
442
+ private fun createAppOpenListener(adUnitId: String): CloudXAppOpenListener {
443
+ return object : CloudXAppOpenListener {
444
+ override fun onAdLoaded(cloudXAd: CloudXAd) {
445
+ sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_LOADED_EVENT, getAdInfo(cloudXAd))
446
+ }
447
+ override fun onAdLoadFailed(failedAdUnitId: String, cloudXError: CloudXError) {
448
+ sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_LOAD_FAILED_EVENT, getAdLoadFailedInfo(failedAdUnitId, cloudXError))
449
+ }
450
+ override fun onAdClicked(cloudXAd: CloudXAd) {
451
+ sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_CLICKED_EVENT, getAdInfo(cloudXAd))
452
+ }
453
+ override fun onAdDisplayed(cloudXAd: CloudXAd) {
454
+ sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_DISPLAYED_EVENT, getAdInfo(cloudXAd))
455
+ }
456
+ override fun onAdDisplayFailed(cloudXAd: CloudXAd, cloudXError: CloudXError) {
457
+ sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_DISPLAY_FAILED_EVENT, getAdDisplayFailedInfo(cloudXAd, cloudXError))
458
+ }
459
+ override fun onAdHidden(cloudXAd: CloudXAd) {
460
+ sendReactNativeEvent(CloudXAdEvents.ON_APPOPEN_HIDDEN_EVENT, getAdInfo(cloudXAd))
461
+ }
462
+ }
463
+ }
464
+
375
465
  private fun createRewardedListener(adUnitId: String): CloudXRewardedListener {
376
466
  return object : CloudXRewardedListener {
377
467
  override fun onAdLoaded(cloudXAd: CloudXAd) {
@@ -572,10 +662,63 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
572
662
  )
573
663
  }
574
664
 
665
+ private fun ReadableMap.toRevenueData(): CloudXRevenueData? {
666
+ val platform = stringValue("platform")
667
+ val revenuePlatform = platform?.toRevenuePlatformOrNull()
668
+ val revenue = doubleValue("revenue")
669
+ val adFormat = stringValue("adFormat")
670
+ if (revenuePlatform == null || revenue == null || adFormat.isNullOrBlank()) {
671
+ Log.w(TAG, "reportRevenueData: ignoring data with missing or invalid required fields")
672
+ return null
673
+ }
674
+ if (!revenue.isFinite()) {
675
+ Log.w(TAG, "reportRevenueData: ignoring data with non-finite revenue=$revenue")
676
+ return null
677
+ }
678
+
679
+ return CloudXRevenueData.builder(
680
+ revenuePlatform,
681
+ revenue,
682
+ adFormat,
683
+ )
684
+ .currencyCode(optionalStringValue("currencyCode"))
685
+ .precision(stringValue("precision")?.toRevenuePrecisionOrNull())
686
+ .networkName(optionalStringValue("networkName"))
687
+ .adUnitId(optionalStringValue("adUnitId"))
688
+ .thirdPartyAdPlacementId(optionalStringValue("thirdPartyAdPlacementId"))
689
+ .creativeId(optionalStringValue("creativeId"))
690
+ .networkPlacement(optionalStringValue("networkPlacement"))
691
+ .countryCode(optionalStringValue("countryCode"))
692
+ .userSegment(optionalStringValue("userSegment"))
693
+ .build()
694
+ }
695
+
696
+ private fun String.toRevenuePlatformOrNull(): CloudXRevenuePlatform? {
697
+ val platform = trim()
698
+ if (platform.isBlank()) return null
699
+ return when {
700
+ platform.equals("AdMob", ignoreCase = true) -> CloudXRevenuePlatform.ADMOB
701
+ platform.equals("InMobi", ignoreCase = true) -> CloudXRevenuePlatform.INMOBI
702
+ else -> CloudXRevenuePlatform.custom(platform)
703
+ }
704
+ }
705
+
706
+ private fun String.toRevenuePrecisionOrNull(): CloudXRevenuePrecision? = when (lowercase(Locale.ROOT)) {
707
+ "exact" -> CloudXRevenuePrecision.EXACT
708
+ "estimated" -> CloudXRevenuePrecision.ESTIMATED
709
+ "publisher_defined" -> CloudXRevenuePrecision.PUBLISHER_DEFINED
710
+ "undefined" -> CloudXRevenuePrecision.UNDEFINED
711
+ else -> {
712
+ Log.w(TAG, "reportRevenueData: ignoring unknown precision=$this")
713
+ null
714
+ }
715
+ }
716
+
575
717
  private fun String.toCloudXAdFormatOrNull(): CloudXAdFormat? = when (uppercase(Locale.ROOT)) {
576
718
  CloudXAdFormat.BANNER.name -> CloudXAdFormat.BANNER
577
719
  CloudXAdFormat.MREC.name -> CloudXAdFormat.MREC
578
720
  CloudXAdFormat.INTERSTITIAL.name -> CloudXAdFormat.INTERSTITIAL
721
+ CloudXAdFormat.APP_OPEN.name -> CloudXAdFormat.APP_OPEN
579
722
  CloudXAdFormat.REWARDED.name -> CloudXAdFormat.REWARDED
580
723
  CloudXAdFormat.NATIVE.name -> CloudXAdFormat.NATIVE
581
724
  else -> null
@@ -743,6 +886,17 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
743
886
  return interstitial
744
887
  }
745
888
 
889
+ private fun retrieveAppOpen(adUnitId: String): CloudXAppOpenAd {
890
+ var appOpen = appOpenAds[adUnitId]
891
+ if (appOpen == null) {
892
+ appOpen = CloudX.createAppOpen(reactApplicationContext, adUnitId)
893
+ appOpen.listener = createAppOpenListener(adUnitId)
894
+ appOpen.revenueListener = createFullscreenRevenueListener(adUnitId, CloudXAdEvents.ON_APPOPEN_AD_REVENUE_PAID)
895
+ appOpenAds[adUnitId] = appOpen
896
+ }
897
+ return appOpen
898
+ }
899
+
746
900
  private fun retrieveRewarded(adUnitId: String): CloudXRewardedAd {
747
901
  var rewarded = rewardedAds[adUnitId]
748
902
  if (rewarded == null) {
@@ -885,6 +1039,11 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
885
1039
  }
886
1040
  interstitials.clear()
887
1041
 
1042
+ for (appOpen in appOpenAds.values) {
1043
+ appOpen.destroy()
1044
+ }
1045
+ appOpenAds.clear()
1046
+
888
1047
  for (rewarded in rewardedAds.values) {
889
1048
  rewarded.destroy()
890
1049
  }
@@ -926,6 +1085,13 @@ class CloudXModuleImpl(private val reactApplicationContext: ReactApplicationCont
926
1085
  "ON_INTERSTITIAL_DISPLAY_FAILED_EVENT" to CloudXAdEvents.ON_INTERSTITIAL_DISPLAY_FAILED_EVENT,
927
1086
  "ON_INTERSTITIAL_HIDDEN_EVENT" to CloudXAdEvents.ON_INTERSTITIAL_HIDDEN_EVENT,
928
1087
  "ON_INTERSTITIAL_AD_REVENUE_PAID" to CloudXAdEvents.ON_INTERSTITIAL_AD_REVENUE_PAID,
1088
+ "ON_APPOPEN_LOADED_EVENT" to CloudXAdEvents.ON_APPOPEN_LOADED_EVENT,
1089
+ "ON_APPOPEN_LOAD_FAILED_EVENT" to CloudXAdEvents.ON_APPOPEN_LOAD_FAILED_EVENT,
1090
+ "ON_APPOPEN_CLICKED_EVENT" to CloudXAdEvents.ON_APPOPEN_CLICKED_EVENT,
1091
+ "ON_APPOPEN_DISPLAYED_EVENT" to CloudXAdEvents.ON_APPOPEN_DISPLAYED_EVENT,
1092
+ "ON_APPOPEN_DISPLAY_FAILED_EVENT" to CloudXAdEvents.ON_APPOPEN_DISPLAY_FAILED_EVENT,
1093
+ "ON_APPOPEN_HIDDEN_EVENT" to CloudXAdEvents.ON_APPOPEN_HIDDEN_EVENT,
1094
+ "ON_APPOPEN_AD_REVENUE_PAID" to CloudXAdEvents.ON_APPOPEN_AD_REVENUE_PAID,
929
1095
  "ON_REWARDED_AD_LOADED_EVENT" to CloudXAdEvents.ON_REWARDED_AD_LOADED_EVENT,
930
1096
  "ON_REWARDED_AD_LOAD_FAILED_EVENT" to CloudXAdEvents.ON_REWARDED_AD_LOAD_FAILED_EVENT,
931
1097
  "ON_REWARDED_AD_CLICKED_EVENT" to CloudXAdEvents.ON_REWARDED_AD_CLICKED_EVENT,
@@ -31,6 +31,7 @@ class CloudXModule(reactContext: ReactApplicationContext) :
31
31
  @ReactMethod override fun setHasUserConsent(hasUserConsent: Boolean?) = impl.setHasUserConsent(hasUserConsent)
32
32
  @ReactMethod override fun setDoNotSell(isDoNotSell: Boolean?) = impl.setDoNotSell(isDoNotSell)
33
33
  @ReactMethod override fun arbiter(configuration: ReadableMap, promise: Promise) = impl.arbiter(configuration, promise)
34
+ @ReactMethod override fun reportRevenueData(data: ReadableMap, promise: Promise) = impl.reportRevenueData(data, promise)
34
35
 
35
36
  @ReactMethod override fun createBanner(adUnitId: String, position: String) = impl.createBanner(adUnitId, position)
36
37
  @ReactMethod override fun createBannerWithOffsets(adUnitId: String, position: String, xOffset: Double, yOffset: Double) = impl.createBannerWithOffsets(adUnitId, position, xOffset, yOffset)
@@ -66,6 +67,12 @@ class CloudXModule(reactContext: ReactApplicationContext) :
66
67
  @ReactMethod override fun showInterstitial(adUnitId: String, placement: String?, customData: String?) = impl.showInterstitial(adUnitId, placement, customData)
67
68
  @ReactMethod override fun destroyInterstitial(adUnitId: String) = impl.destroyInterstitial(adUnitId)
68
69
 
70
+ @ReactMethod override fun loadAppOpen(adUnitId: String) = impl.loadAppOpen(adUnitId)
71
+ @ReactMethod override fun setAppOpenExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setAppOpenExtraParameters(adUnitId, extraParameters)
72
+ @ReactMethod override fun isAppOpenReady(adUnitId: String, promise: Promise) = impl.isAppOpenReady(adUnitId, promise)
73
+ @ReactMethod override fun showAppOpen(adUnitId: String, placement: String?, customData: String?) = impl.showAppOpen(adUnitId, placement, customData)
74
+ @ReactMethod override fun destroyAppOpen(adUnitId: String) = impl.destroyAppOpen(adUnitId)
75
+
69
76
  @ReactMethod override fun loadRewarded(adUnitId: String) = impl.loadRewarded(adUnitId)
70
77
  @ReactMethod override fun setRewardedExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setRewardedExtraParameters(adUnitId, extraParameters)
71
78
  @ReactMethod override fun isRewardedReady(adUnitId: String, promise: Promise) = impl.isRewardedReady(adUnitId, promise)
@@ -46,6 +46,7 @@ class CloudXModule(reactContext: ReactApplicationContext) :
46
46
  }
47
47
 
48
48
  @ReactMethod fun arbiter(configuration: ReadableMap, promise: Promise) = impl.arbiter(configuration, promise)
49
+ @ReactMethod fun reportRevenueData(data: ReadableMap, promise: Promise) = impl.reportRevenueData(data, promise)
49
50
 
50
51
  @ReactMethod fun createBanner(adUnitId: String, position: String) = impl.createBanner(adUnitId, position)
51
52
  @ReactMethod fun createBannerWithOffsets(adUnitId: String, position: String, xOffset: Double, yOffset: Double) = impl.createBannerWithOffsets(adUnitId, position, xOffset, yOffset)
@@ -81,6 +82,12 @@ class CloudXModule(reactContext: ReactApplicationContext) :
81
82
  @ReactMethod fun showInterstitial(adUnitId: String, placement: String?, customData: String?) = impl.showInterstitial(adUnitId, placement, customData)
82
83
  @ReactMethod fun destroyInterstitial(adUnitId: String) = impl.destroyInterstitial(adUnitId)
83
84
 
85
+ @ReactMethod fun loadAppOpen(adUnitId: String) = impl.loadAppOpen(adUnitId)
86
+ @ReactMethod fun setAppOpenExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setAppOpenExtraParameters(adUnitId, extraParameters)
87
+ @ReactMethod fun isAppOpenReady(adUnitId: String, promise: Promise) = impl.isAppOpenReady(adUnitId, promise)
88
+ @ReactMethod fun showAppOpen(adUnitId: String, placement: String?, customData: String?) = impl.showAppOpen(adUnitId, placement, customData)
89
+ @ReactMethod fun destroyAppOpen(adUnitId: String) = impl.destroyAppOpen(adUnitId)
90
+
84
91
  @ReactMethod fun loadRewarded(adUnitId: String) = impl.loadRewarded(adUnitId)
85
92
  @ReactMethod fun setRewardedExtraParameters(adUnitId: String, extraParameters: ReadableMap) = impl.setRewardedExtraParameters(adUnitId, extraParameters)
86
93
  @ReactMethod fun isRewardedReady(adUnitId: String, promise: Promise) = impl.isRewardedReady(adUnitId, promise)
@@ -6,15 +6,15 @@ Pod::Spec.new do |s|
6
6
  s.name = "cloudx-react-native"
7
7
  s.version = package["version"]
8
8
  s.summary = package["description"]
9
- s.homepage = "https://github.com/cloudx-io/cloudx-react-native"
9
+ s.homepage = "https://github.com/cloudx-io/mobile/tree/main/react-native"
10
10
  s.license = package["license"]
11
11
  s.authors = { "CloudX" => "support@cloudx.io" }
12
12
  s.platforms = { :ios => "13.0" }
13
- s.source = { :git => "https://github.com/cloudx-io/cloudx-react-native.git", :tag => "#{s.version}" }
13
+ s.source = { :git => "https://github.com/cloudx-io/mobile.git", :tag => "react-native/sdk/#{s.version}" }
14
14
 
15
15
  s.requires_arc = true
16
16
 
17
- s.dependency "CloudXCore", "~> 3.4.5"
17
+ s.dependency "CloudXCore", "~> 3.6.0"
18
18
 
19
19
  s.source_files = "ios/**/*.{h,mm}"
20
20
 
package/ios/CloudX.h CHANGED
@@ -11,10 +11,10 @@
11
11
 
12
12
  #ifdef RCT_NEW_ARCH_ENABLED
13
13
  #import <CloudXSpec/CloudXSpec.h>
14
- @interface CloudX : RCTEventEmitter<NativeCloudXSpec, CLXInterstitialDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
14
+ @interface CloudX : RCTEventEmitter<NativeCloudXSpec, CLXInterstitialDelegate, CLXAppOpenDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
15
15
  #else
16
16
  #import <React/RCTBridgeModule.h>
17
- @interface CloudX : RCTEventEmitter<RCTBridgeModule, CLXInterstitialDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
17
+ @interface CloudX : RCTEventEmitter<RCTBridgeModule, CLXInterstitialDelegate, CLXAppOpenDelegate, CLXRewardedDelegate, CLXBannerDelegate, CLXAdRevenueDelegate>
18
18
  #endif
19
19
 
20
20
  NS_ASSUME_NONNULL_BEGIN