cloudx-react-native 3.8.0 → 3.10.1

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 (141) hide show
  1. package/README.md +1 -0
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +10 -0
  4. package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +41 -0
  5. package/android/src/main/java/com/cloudxreactnative/CloudXAdView.kt +1 -0
  6. package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +14 -0
  7. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdView.kt +718 -0
  8. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdViewManagerImpl.kt +119 -0
  9. package/android/src/main/java/com/cloudxreactnative/CloudXPackage.kt +4 -1
  10. package/android/src/main/res/layout/cloudx_rn_native_media_banner_template.xml +100 -0
  11. package/android/src/main/res/layout/cloudx_rn_native_medium_template.xml +99 -0
  12. package/android/src/main/res/layout/cloudx_rn_native_small_template.xml +72 -0
  13. package/android/src/main/res/layout/cloudx_rn_native_vertical_media_template.xml +117 -0
  14. package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +2 -0
  15. package/android/src/newarch/com/cloudxreactnative/CloudXNativeAdViewManager.kt +86 -0
  16. package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +2 -0
  17. package/android/src/oldarch/com/cloudxreactnative/CloudXNativeAdViewManager.kt +118 -0
  18. package/android/src/test/java/com/cloudxreactnative/CloudXModuleImplArbiterBidsTest.kt +3 -3
  19. package/android/src/test/java/com/cloudxreactnative/CloudXModuleImplThreadingTest.kt +91 -0
  20. package/android/src/test/java/com/cloudxreactnative/FakeReadable.kt +2 -2
  21. package/cloudx-react-native.podspec +2 -1
  22. package/ios/CloudX.h +8 -0
  23. package/ios/CloudX.mm +164 -28
  24. package/ios/CloudXAdView.mm +2 -0
  25. package/ios/CloudXNativeAdView.h +75 -0
  26. package/ios/CloudXNativeAdView.mm +979 -0
  27. package/ios/CloudXNativeAdViewManager.h +12 -0
  28. package/ios/CloudXNativeAdViewManager.mm +119 -0
  29. package/ios/PrivacyInfo.xcprivacy +20 -0
  30. package/lib/commonjs/CloudX.js +4 -0
  31. package/lib/commonjs/CloudX.js.map +1 -1
  32. package/lib/commonjs/CloudXAdViewBase.js +9 -97
  33. package/lib/commonjs/CloudXAdViewBase.js.map +1 -1
  34. package/lib/commonjs/CloudXErrorCode.js +2 -0
  35. package/lib/commonjs/CloudXErrorCode.js.map +1 -1
  36. package/lib/commonjs/CloudXNativeAdView.js +331 -0
  37. package/lib/commonjs/CloudXNativeAdView.js.map +1 -0
  38. package/lib/commonjs/CloudXNativeAdViewComponents.js +252 -0
  39. package/lib/commonjs/CloudXNativeAdViewComponents.js.map +1 -0
  40. package/lib/commonjs/CloudXNativeAdViewProvider.js +117 -0
  41. package/lib/commonjs/CloudXNativeAdViewProvider.js.map +1 -0
  42. package/lib/commonjs/extraParameters.js +52 -0
  43. package/lib/commonjs/extraParameters.js.map +1 -0
  44. package/lib/commonjs/hooks.js +34 -0
  45. package/lib/commonjs/hooks.js.map +1 -1
  46. package/lib/commonjs/index.js +72 -0
  47. package/lib/commonjs/index.js.map +1 -1
  48. package/lib/commonjs/specs/CloudXAdViewNativeComponent.js.map +1 -1
  49. package/lib/commonjs/specs/CloudXNativeAdViewNativeComponent.js +41 -0
  50. package/lib/commonjs/specs/CloudXNativeAdViewNativeComponent.js.map +1 -0
  51. package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
  52. package/lib/commonjs/types/NativeAd.js +70 -0
  53. package/lib/commonjs/types/NativeAd.js.map +1 -0
  54. package/lib/commonjs/types/index.js +13 -0
  55. package/lib/commonjs/types/index.js.map +1 -1
  56. package/lib/commonjs/useCloudXSdkInitialization.js +75 -0
  57. package/lib/commonjs/useCloudXSdkInitialization.js.map +1 -0
  58. package/lib/commonjs/version.js +1 -1
  59. package/lib/commonjs/version.js.map +1 -1
  60. package/lib/module/CloudX.js +4 -0
  61. package/lib/module/CloudX.js.map +1 -1
  62. package/lib/module/CloudXAdViewBase.js +8 -96
  63. package/lib/module/CloudXAdViewBase.js.map +1 -1
  64. package/lib/module/CloudXErrorCode.js +2 -0
  65. package/lib/module/CloudXErrorCode.js.map +1 -1
  66. package/lib/module/CloudXNativeAdView.js +324 -0
  67. package/lib/module/CloudXNativeAdView.js.map +1 -0
  68. package/lib/module/CloudXNativeAdViewComponents.js +240 -0
  69. package/lib/module/CloudXNativeAdViewComponents.js.map +1 -0
  70. package/lib/module/CloudXNativeAdViewProvider.js +110 -0
  71. package/lib/module/CloudXNativeAdViewProvider.js.map +1 -0
  72. package/lib/module/extraParameters.js +45 -0
  73. package/lib/module/extraParameters.js.map +1 -0
  74. package/lib/module/hooks.js +34 -0
  75. package/lib/module/hooks.js.map +1 -1
  76. package/lib/module/index.js +13 -0
  77. package/lib/module/index.js.map +1 -1
  78. package/lib/module/specs/CloudXAdViewNativeComponent.js.map +1 -1
  79. package/lib/module/specs/CloudXNativeAdViewNativeComponent.js +35 -0
  80. package/lib/module/specs/CloudXNativeAdViewNativeComponent.js.map +1 -0
  81. package/lib/module/specs/NativeCloudX.js.map +1 -1
  82. package/lib/module/types/NativeAd.js +68 -0
  83. package/lib/module/types/NativeAd.js.map +1 -0
  84. package/lib/module/types/index.js +1 -0
  85. package/lib/module/types/index.js.map +1 -1
  86. package/lib/module/useCloudXSdkInitialization.js +68 -0
  87. package/lib/module/useCloudXSdkInitialization.js.map +1 -0
  88. package/lib/module/version.js +1 -1
  89. package/lib/module/version.js.map +1 -1
  90. package/lib/typescript/src/CloudX.d.ts.map +1 -1
  91. package/lib/typescript/src/CloudXAdViewBase.d.ts.map +1 -1
  92. package/lib/typescript/src/CloudXErrorCode.d.ts +2 -0
  93. package/lib/typescript/src/CloudXErrorCode.d.ts.map +1 -1
  94. package/lib/typescript/src/CloudXNativeAdView.d.ts +24 -0
  95. package/lib/typescript/src/CloudXNativeAdView.d.ts.map +1 -0
  96. package/lib/typescript/src/CloudXNativeAdViewComponents.d.ts +67 -0
  97. package/lib/typescript/src/CloudXNativeAdViewComponents.d.ts.map +1 -0
  98. package/lib/typescript/src/CloudXNativeAdViewProvider.d.ts +72 -0
  99. package/lib/typescript/src/CloudXNativeAdViewProvider.d.ts.map +1 -0
  100. package/lib/typescript/src/extraParameters.d.ts +4 -0
  101. package/lib/typescript/src/extraParameters.d.ts.map +1 -0
  102. package/lib/typescript/src/hooks.d.ts.map +1 -1
  103. package/lib/typescript/src/index.d.ts +4 -1
  104. package/lib/typescript/src/index.d.ts.map +1 -1
  105. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts +1 -0
  106. package/lib/typescript/src/specs/CloudXAdViewNativeComponent.d.ts.map +1 -1
  107. package/lib/typescript/src/specs/CloudXNativeAdViewNativeComponent.d.ts +103 -0
  108. package/lib/typescript/src/specs/CloudXNativeAdViewNativeComponent.d.ts.map +1 -0
  109. package/lib/typescript/src/specs/NativeCloudX.d.ts +1 -0
  110. package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
  111. package/lib/typescript/src/types/AdInfo.d.ts +6 -1
  112. package/lib/typescript/src/types/AdInfo.d.ts.map +1 -1
  113. package/lib/typescript/src/types/CloudX.d.ts +2 -0
  114. package/lib/typescript/src/types/CloudX.d.ts.map +1 -1
  115. package/lib/typescript/src/types/NativeAd.d.ts +114 -0
  116. package/lib/typescript/src/types/NativeAd.d.ts.map +1 -0
  117. package/lib/typescript/src/types/index.d.ts +2 -0
  118. package/lib/typescript/src/types/index.d.ts.map +1 -1
  119. package/lib/typescript/src/useCloudXSdkInitialization.d.ts +16 -0
  120. package/lib/typescript/src/useCloudXSdkInitialization.d.ts.map +1 -0
  121. package/lib/typescript/src/version.d.ts +1 -1
  122. package/lib/typescript/src/version.d.ts.map +1 -1
  123. package/package.json +1 -1
  124. package/src/CloudX.ts +5 -0
  125. package/src/CloudXAdViewBase.tsx +9 -125
  126. package/src/CloudXErrorCode.ts +3 -0
  127. package/src/CloudXNativeAdView.tsx +419 -0
  128. package/src/CloudXNativeAdViewComponents.tsx +203 -0
  129. package/src/CloudXNativeAdViewProvider.tsx +149 -0
  130. package/src/extraParameters.ts +65 -0
  131. package/src/hooks.ts +38 -0
  132. package/src/index.ts +24 -0
  133. package/src/specs/CloudXAdViewNativeComponent.ts +1 -0
  134. package/src/specs/CloudXNativeAdViewNativeComponent.ts +137 -0
  135. package/src/specs/NativeCloudX.ts +1 -0
  136. package/src/types/AdInfo.ts +8 -1
  137. package/src/types/CloudX.ts +3 -0
  138. package/src/types/NativeAd.ts +125 -0
  139. package/src/types/index.ts +7 -0
  140. package/src/useCloudXSdkInitialization.ts +73 -0
  141. package/src/version.ts +1 -1
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useCloudXSdkInitializationGate = void 0;
7
+ var _react = require("react");
8
+ var _NativeCloudX = _interopRequireDefault(require("./specs/NativeCloudX"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ /*
11
+ * Once the SDK reports initialized it stays initialized for the JS VM's life,
12
+ * so cache it module-wide: only the first ad view mounted before init has to
13
+ * poll + show a placeholder; every later mount (banner, MREC, or native)
14
+ * renders its native view immediately.
15
+ */
16
+ let cachedIsInitialized = false;
17
+
18
+ /**
19
+ * Polls CloudX SDK initialization state and caches the result module-wide.
20
+ *
21
+ * Shared by `CloudXAdViewBase` (banner/MREC) and `CloudXNativeAdView` so
22
+ * every in-tree ad-view component gates native-view creation on SDK
23
+ * initialization identically: a view mounted before `CloudX.initialize()`
24
+ * completes would create its native ad against an uninitialized SDK, which
25
+ * on iOS returns nil and leaves the view permanently dead (no retry, no
26
+ * load-failed event). There is no init event to subscribe to, so poll
27
+ * `isInitialized()` until ready.
28
+ *
29
+ * @param componentName Used only in the console warnings, so callers can
30
+ * tell which component is waiting on initialization.
31
+ */
32
+ const useCloudXSdkInitializationGate = componentName => {
33
+ const [isInitialized, setIsInitialized] = (0, _react.useState)(cachedIsInitialized);
34
+ (0, _react.useEffect)(() => {
35
+ if (cachedIsInitialized) {
36
+ return;
37
+ }
38
+ let cancelled = false;
39
+ let timer;
40
+ let warnedOnce = false;
41
+ const check = () => {
42
+ _NativeCloudX.default.isInitialized().then(ready => {
43
+ if (cancelled) {
44
+ return;
45
+ }
46
+ if (ready) {
47
+ cachedIsInitialized = true;
48
+ setIsInitialized(true);
49
+ return;
50
+ }
51
+ if (!warnedOnce) {
52
+ warnedOnce = true;
53
+ console.warn(`${componentName} mounted before CloudX SDK initialization; will render once initialize() completes.`);
54
+ }
55
+ timer = setTimeout(check, 1000);
56
+ }).catch(error => {
57
+ if (cancelled) {
58
+ return;
59
+ }
60
+ console.warn(`${componentName} failed to read initialization state:`, error);
61
+ timer = setTimeout(check, 1000);
62
+ });
63
+ };
64
+ check();
65
+ return () => {
66
+ cancelled = true;
67
+ if (timer) {
68
+ clearTimeout(timer);
69
+ }
70
+ };
71
+ }, [componentName]);
72
+ return isInitialized;
73
+ };
74
+ exports.useCloudXSdkInitializationGate = useCloudXSdkInitializationGate;
75
+ //# sourceMappingURL=useCloudXSdkInitialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_NativeCloudX","_interopRequireDefault","e","__esModule","default","cachedIsInitialized","useCloudXSdkInitializationGate","componentName","isInitialized","setIsInitialized","useState","useEffect","cancelled","timer","warnedOnce","check","NativeCloudX","then","ready","console","warn","setTimeout","catch","error","clearTimeout","exports"],"sourceRoot":"../../src","sources":["useCloudXSdkInitialization.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAgD,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA,IAAIG,mBAAmB,GAAG,KAAK;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,8BAA8B,GAAIC,aAAqB,IAAc;EAC9E,MAAM,CAACC,aAAa,EAAEC,gBAAgB,CAAC,GAAG,IAAAC,eAAQ,EAACL,mBAAmB,CAAC;EAEvE,IAAAM,gBAAS,EAAC,MAAM;IACZ,IAAIN,mBAAmB,EAAE;MACrB;IACJ;IACA,IAAIO,SAAS,GAAG,KAAK;IACrB,IAAIC,KAAgD;IACpD,IAAIC,UAAU,GAAG,KAAK;IACtB,MAAMC,KAAK,GAAGA,CAAA,KAAM;MAChBC,qBAAY,CAACR,aAAa,CAAC,CAAC,CACvBS,IAAI,CAAEC,KAAK,IAAK;QACb,IAAIN,SAAS,EAAE;UACX;QACJ;QACA,IAAIM,KAAK,EAAE;UACPb,mBAAmB,GAAG,IAAI;UAC1BI,gBAAgB,CAAC,IAAI,CAAC;UACtB;QACJ;QACA,IAAI,CAACK,UAAU,EAAE;UACbA,UAAU,GAAG,IAAI;UACjBK,OAAO,CAACC,IAAI,CACR,GAAGb,aAAa,qFACpB,CAAC;QACL;QACAM,KAAK,GAAGQ,UAAU,CAACN,KAAK,EAAE,IAAI,CAAC;MACnC,CAAC,CAAC,CACDO,KAAK,CAAEC,KAAK,IAAK;QACd,IAAIX,SAAS,EAAE;UACX;QACJ;QACAO,OAAO,CAACC,IAAI,CAAC,GAAGb,aAAa,uCAAuC,EAAEgB,KAAK,CAAC;QAC5EV,KAAK,GAAGQ,UAAU,CAACN,KAAK,EAAE,IAAI,CAAC;MACnC,CAAC,CAAC;IACV,CAAC;IACDA,KAAK,CAAC,CAAC;IACP,OAAO,MAAM;MACTH,SAAS,GAAG,IAAI;MAChB,IAAIC,KAAK,EAAE;QACPW,YAAY,CAACX,KAAK,CAAC;MACvB;IACJ,CAAC;EACL,CAAC,EAAE,CAACN,aAAa,CAAC,CAAC;EAEnB,OAAOC,aAAa;AACxB,CAAC;AAACiB,OAAA,CAAAnB,8BAAA,GAAAA,8BAAA","ignoreList":[]}
@@ -9,5 +9,5 @@ exports.PLUGIN_VERSION = void 0;
9
9
  // This value is reported to the native SDK in CloudX.initialize() and is used
10
10
  // for wrapper-version telemetry/attribution, so a stale value mis-attributes
11
11
  // installs to the wrong release.
12
- const PLUGIN_VERSION = exports.PLUGIN_VERSION = '3.8.0';
12
+ const PLUGIN_VERSION = exports.PLUGIN_VERSION = '3.10.1';
13
13
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["PLUGIN_VERSION","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACO,MAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["PLUGIN_VERSION","exports"],"sourceRoot":"../../src","sources":["version.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACO,MAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG,QAAQ","ignoreList":[]}
@@ -6,6 +6,9 @@ const isInitialized = () => {
6
6
  const initialize = appKey => {
7
7
  return NativeCloudX.initialize(PLUGIN_VERSION, appKey);
8
8
  };
9
+ const showMediationDebugger = () => {
10
+ return NativeCloudX.showMediationDebugger();
11
+ };
9
12
  const isTablet = () => {
10
13
  return NativeCloudX.isTablet();
11
14
  };
@@ -45,6 +48,7 @@ const reportRevenueData = data => {
45
48
  export const CloudX = {
46
49
  isInitialized,
47
50
  initialize,
51
+ showMediationDebugger,
48
52
  isTablet,
49
53
  getVersion,
50
54
  setMinLogLevel,
@@ -1 +1 @@
1
- {"version":3,"names":["NativeCloudX","PLUGIN_VERSION","isInitialized","initialize","appKey","isTablet","getVersion","setMinLogLevel","level","setHashedUserID","hashedUserID","setUserKeyValue","key","value","setAppKeyValue","clearAllKeyValues","setVisualDebuggingEnabled","enabled","setHasUserConsent","hasUserConsent","setDoNotSell","isDoNotSell","arbiter","configuration","reportRevenueData","data","CloudX"],"sourceRoot":"../../src","sources":["CloudX.ts"],"mappings":"AAIA,OAAOA,YAAY,MAAM,sBAAsB;AAC/C,SAASC,cAAc,QAAQ,WAAW;AAE1C,MAAMC,aAAa,GAAGA,CAAA,KAAwB;EAC1C,OAAOF,YAAY,CAACE,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,MAAMC,UAAU,GAAIC,MAAc,IAA0C;EACxE,OAAOJ,YAAY,CAACG,UAAU,CAACF,cAAc,EAAEG,MAAM,CAAC;AAC1D,CAAC;AAED,MAAMC,QAAQ,GAAGA,CAAA,KAAwB;EACrC,OAAOL,YAAY,CAACK,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAMC,UAAU,GAAGA,CAAA,KAAuB;EACtC,OAAON,YAAY,CAACM,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,cAAc,GAAIC,KAA0B,IAAW;EACzDR,YAAY,CAACO,cAAc,CAACC,KAAK,CAAC;AACtC,CAAC;AAED,MAAMC,eAAe,GAAIC,YAAoB,IAAW;EACpDV,YAAY,CAACS,eAAe,CAACC,YAAY,CAAC;AAC9C,CAAC;AAED,MAAMC,eAAe,GAAGA,CAACC,GAAW,EAAEC,KAAa,KAAW;EAC1Db,YAAY,CAACW,eAAe,CAACC,GAAG,EAAEC,KAAK,CAAC;AAC5C,CAAC;AAED,MAAMC,cAAc,GAAGA,CAACF,GAAW,EAAEC,KAAa,KAAW;EACzDb,YAAY,CAACc,cAAc,CAACF,GAAG,EAAEC,KAAK,CAAC;AAC3C,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAY;EAClCf,YAAY,CAACe,iBAAiB,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,yBAAyB,GAAIC,OAAgB,IAAW;EAC1DjB,YAAY,CAACgB,yBAAyB,CAACC,OAAO,CAAC;AACnD,CAAC;AAED,MAAMC,iBAAiB,GAAIC,cAA8B,IAAW;EAChEnB,YAAY,CAACkB,iBAAiB,CAACC,cAAc,CAAC;AAClD,CAAC;AAED,MAAMC,YAAY,GAAIC,WAA2B,IAAW;EACxDrB,YAAY,CAACoB,YAAY,CAACC,WAAW,CAAC;AAC1C,CAAC;AAED,MAAMC,OAAO,GAAIC,aAAyC,IAAmC;EACzF,OAAOvB,YAAY,CAACsB,OAAO,CAACC,aAAa,CAAC;AAC9C,CAAC;AAED,MAAMC,iBAAiB,GAAIC,IAAuB,IAAuB;EACrE,OAAOzB,YAAY,CAACwB,iBAAiB,CAACC,IAAI,CAAC;AAC/C,CAAC;AAED,OAAO,MAAMC,MAAkB,GAAG;EAC9BxB,aAAa;EACbC,UAAU;EACVE,QAAQ;EACRC,UAAU;EACVC,cAAc;EACdE,eAAe;EACfE,eAAe;EACfG,cAAc;EACdC,iBAAiB;EACjBC,yBAAyB;EACzBE,iBAAiB;EACjBE,YAAY;EACZE,OAAO;EACPE;AACJ,CAAC;AAED,eAAeE,MAAM","ignoreList":[]}
1
+ {"version":3,"names":["NativeCloudX","PLUGIN_VERSION","isInitialized","initialize","appKey","showMediationDebugger","isTablet","getVersion","setMinLogLevel","level","setHashedUserID","hashedUserID","setUserKeyValue","key","value","setAppKeyValue","clearAllKeyValues","setVisualDebuggingEnabled","enabled","setHasUserConsent","hasUserConsent","setDoNotSell","isDoNotSell","arbiter","configuration","reportRevenueData","data","CloudX"],"sourceRoot":"../../src","sources":["CloudX.ts"],"mappings":"AAIA,OAAOA,YAAY,MAAM,sBAAsB;AAC/C,SAASC,cAAc,QAAQ,WAAW;AAE1C,MAAMC,aAAa,GAAGA,CAAA,KAAwB;EAC1C,OAAOF,YAAY,CAACE,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,MAAMC,UAAU,GAAIC,MAAc,IAA0C;EACxE,OAAOJ,YAAY,CAACG,UAAU,CAACF,cAAc,EAAEG,MAAM,CAAC;AAC1D,CAAC;AAED,MAAMC,qBAAqB,GAAGA,CAAA,KAAwB;EAClD,OAAOL,YAAY,CAACK,qBAAqB,CAAC,CAAC;AAC/C,CAAC;AAED,MAAMC,QAAQ,GAAGA,CAAA,KAAwB;EACrC,OAAON,YAAY,CAACM,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAMC,UAAU,GAAGA,CAAA,KAAuB;EACtC,OAAOP,YAAY,CAACO,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,cAAc,GAAIC,KAA0B,IAAW;EACzDT,YAAY,CAACQ,cAAc,CAACC,KAAK,CAAC;AACtC,CAAC;AAED,MAAMC,eAAe,GAAIC,YAAoB,IAAW;EACpDX,YAAY,CAACU,eAAe,CAACC,YAAY,CAAC;AAC9C,CAAC;AAED,MAAMC,eAAe,GAAGA,CAACC,GAAW,EAAEC,KAAa,KAAW;EAC1Dd,YAAY,CAACY,eAAe,CAACC,GAAG,EAAEC,KAAK,CAAC;AAC5C,CAAC;AAED,MAAMC,cAAc,GAAGA,CAACF,GAAW,EAAEC,KAAa,KAAW;EACzDd,YAAY,CAACe,cAAc,CAACF,GAAG,EAAEC,KAAK,CAAC;AAC3C,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAY;EAClChB,YAAY,CAACgB,iBAAiB,CAAC,CAAC;AACpC,CAAC;AAED,MAAMC,yBAAyB,GAAIC,OAAgB,IAAW;EAC1DlB,YAAY,CAACiB,yBAAyB,CAACC,OAAO,CAAC;AACnD,CAAC;AAED,MAAMC,iBAAiB,GAAIC,cAA8B,IAAW;EAChEpB,YAAY,CAACmB,iBAAiB,CAACC,cAAc,CAAC;AAClD,CAAC;AAED,MAAMC,YAAY,GAAIC,WAA2B,IAAW;EACxDtB,YAAY,CAACqB,YAAY,CAACC,WAAW,CAAC;AAC1C,CAAC;AAED,MAAMC,OAAO,GAAIC,aAAyC,IAAmC;EACzF,OAAOxB,YAAY,CAACuB,OAAO,CAACC,aAAa,CAAC;AAC9C,CAAC;AAED,MAAMC,iBAAiB,GAAIC,IAAuB,IAAuB;EACrE,OAAO1B,YAAY,CAACyB,iBAAiB,CAACC,IAAI,CAAC;AAC/C,CAAC;AAED,OAAO,MAAMC,MAAkB,GAAG;EAC9BzB,aAAa;EACbC,UAAU;EACVE,qBAAqB;EACrBC,QAAQ;EACRC,UAAU;EACVC,cAAc;EACdE,eAAe;EACfE,eAAe;EACfG,cAAc;EACdC,iBAAiB;EACjBC,yBAAyB;EACzBE,iBAAiB;EACjBE,YAAY;EACZE,OAAO;EACPE;AACJ,CAAC;AAED,eAAeE,MAAM","ignoreList":[]}
@@ -3,6 +3,8 @@ import React, { useEffect, useMemo, useState } from 'react';
3
3
  import { View } from 'react-native';
4
4
  import NativeCloudXAdView from './specs/CloudXAdViewNativeComponent';
5
5
  import NativeCloudX from './specs/NativeCloudX';
6
+ import { toNativeExtraParameterEntries } from './extraParameters';
7
+ import { useCloudXSdkInitializationGate } from './useCloudXSdkInitialization';
6
8
 
7
9
  /**
8
10
  * Ad format rendered by the in-tree view component.
@@ -35,14 +37,6 @@ const AD_SIZE = {
35
37
  * phone->leader; every later mount reads the resolved value synchronously.
36
38
  */
37
39
  let cachedIsTablet = null;
38
-
39
- /*
40
- * Once the SDK reports initialized it stays initialized for the JS VM's life,
41
- * so cache it module-wide: only the first ad view mounted before init has to
42
- * poll + show a placeholder; every later mount renders the native view
43
- * immediately. Mirrors cachedIsTablet above.
44
- */
45
- let cachedIsInitialized = false;
46
40
  const parseAdValues = json => {
47
41
  if (!json) {
48
42
  return {};
@@ -60,6 +54,7 @@ const toAdInfo = event => ({
60
54
  networkName: event.networkName,
61
55
  networkPlacement: event.networkPlacement || null,
62
56
  placement: event.placement || null,
57
+ creativeId: event.creativeId || null,
63
58
  revenue: event.revenue ?? 0,
64
59
  adValues: parseAdValues(event.adValuesJson)
65
60
  });
@@ -68,50 +63,6 @@ const toLoadFailedInfo = event => ({
68
63
  code: event.code,
69
64
  message: event.message || null
70
65
  });
71
- const warnIgnoredUndefinedExtraParameter = keyPath => {
72
- console.warn(`CloudXAdView ignored extra parameter "${keyPath}" because ` + 'undefined values are not supported. Use null when a value is intentional.');
73
- };
74
- const normalizeExtraParameterValue = (keyPath, value) => {
75
- if (value === undefined) {
76
- warnIgnoredUndefinedExtraParameter(keyPath);
77
- return undefined;
78
- }
79
- if (Array.isArray(value)) {
80
- return value.reduce((items, item, index) => {
81
- const normalized = normalizeExtraParameterValue(`${keyPath}[${index}]`, item);
82
- if (normalized !== undefined) {
83
- items.push(normalized);
84
- }
85
- return items;
86
- }, []);
87
- }
88
- if (value !== null && typeof value === 'object') {
89
- return Object.entries(value).reduce((object, [childKey, childValue]) => {
90
- const normalized = normalizeExtraParameterValue(`${keyPath}.${childKey}`, childValue);
91
- if (normalized !== undefined) {
92
- object[childKey] = normalized;
93
- }
94
- return object;
95
- }, {});
96
- }
97
- return value;
98
- };
99
- const toNativeExtraParameterEntries = extraParameters => {
100
- if (!extraParameters) {
101
- return [];
102
- }
103
- return Object.entries(extraParameters).reduce((entries, [key, value]) => {
104
- const normalizedValue = normalizeExtraParameterValue(key, value);
105
- if (normalizedValue === undefined) {
106
- return entries;
107
- }
108
- entries.push({
109
- key,
110
- value: normalizedValue
111
- });
112
- return entries;
113
- }, []);
114
- };
115
66
 
116
67
  /**
117
68
  * Shared implementation for the in-tree banner/MREC view component. Resolves a
@@ -147,51 +98,12 @@ export const CloudXAdViewBase = ({
147
98
  * Gate native ad-view creation on SDK initialization. A view mounted before
148
99
  * CloudX.initialize() completes would create the ad against an uninitialized
149
100
  * SDK — on iOS createBannerWithAdUnitId: returns nil and the view is
150
- * permanently dead (no retry, no load-failed event). There is no init event
151
- * to subscribe to, so poll isInitialized() until ready, then mount the
152
- * native view (which is what delivers adUnitId/adFormat and triggers create).
153
- * Mirrors CloudXNativeAdView. Cached module-wide so only the first pre-init
154
- * mount pays the placeholder + poll.
101
+ * permanently dead (no retry, no load-failed event). Shared with
102
+ * CloudXNativeAdView via useCloudXSdkInitializationGate: cached module-wide
103
+ * so only the first pre-init mount across any ad-view type pays the
104
+ * placeholder + poll.
155
105
  */
156
- const [isInitialized, setIsInitialized] = useState(cachedIsInitialized);
157
- useEffect(() => {
158
- if (cachedIsInitialized) {
159
- return;
160
- }
161
- let cancelled = false;
162
- let timer;
163
- let warnedOnce = false;
164
- const check = () => {
165
- NativeCloudX.isInitialized().then(ready => {
166
- if (cancelled) {
167
- return;
168
- }
169
- if (ready) {
170
- cachedIsInitialized = true;
171
- setIsInitialized(true);
172
- return;
173
- }
174
- if (!warnedOnce) {
175
- warnedOnce = true;
176
- console.warn('CloudXAdView mounted before CloudX SDK initialization; will render once initialize() completes.');
177
- }
178
- timer = setTimeout(check, 1000);
179
- }).catch(error => {
180
- if (cancelled) {
181
- return;
182
- }
183
- console.warn('CloudXAdView failed to read initialization state:', error);
184
- timer = setTimeout(check, 1000);
185
- });
186
- };
187
- check();
188
- return () => {
189
- cancelled = true;
190
- if (timer) {
191
- clearTimeout(timer);
192
- }
193
- };
194
- }, []);
106
+ const isInitialized = useCloudXSdkInitializationGate('CloudXAdView');
195
107
  useEffect(() => {
196
108
  if (adFormat !== 'BANNER' || cachedIsTablet !== null) {
197
109
  return;
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useMemo","useState","View","NativeCloudXAdView","NativeCloudX","AD_SIZE","banner","width","height","leader","mrec","cachedIsTablet","cachedIsInitialized","parseAdValues","json","parsed","JSON","parse","toAdInfo","event","adUnitId","adFormat","networkName","networkPlacement","placement","revenue","adValues","adValuesJson","toLoadFailedInfo","code","message","warnIgnoredUndefinedExtraParameter","keyPath","console","warn","normalizeExtraParameterValue","value","undefined","Array","isArray","reduce","items","item","index","normalized","push","Object","entries","object","childKey","childValue","toNativeExtraParameterEntries","extraParameters","key","normalizedValue","CloudXAdViewBase","customData","onAdLoaded","onAdLoadFailed","onAdClicked","onAdRevenuePaid","style","viewProps","isTablet","setIsTablet","nativeViewProps","onAdExpanded","onAdCollapsed","isInitialized","setIsInitialized","cancelled","timer","warnedOnce","check","then","ready","setTimeout","catch","error","clearTimeout","tablet","defaultSize","resolvedStyle","nativeExtraParameters","createElement","_extends","onAdLoadedEvent","e","nativeEvent","onAdLoadFailedEvent","onAdClickedEvent","onAdRevenuePaidEvent"],"sourceRoot":"../../src","sources":["CloudXAdViewBase.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useMemo","useState","View","NativeCloudXAdView","NativeCloudX","toNativeExtraParameterEntries","useCloudXSdkInitializationGate","AD_SIZE","banner","width","height","leader","mrec","cachedIsTablet","parseAdValues","json","parsed","JSON","parse","toAdInfo","event","adUnitId","adFormat","networkName","networkPlacement","placement","creativeId","revenue","adValues","adValuesJson","toLoadFailedInfo","code","message","CloudXAdViewBase","customData","extraParameters","onAdLoaded","onAdLoadFailed","onAdClicked","onAdRevenuePaid","style","viewProps","isTablet","setIsTablet","nativeViewProps","onAdExpanded","onAdCollapsed","isInitialized","cancelled","then","tablet","catch","defaultSize","resolvedStyle","nativeExtraParameters","createElement","_extends","onAdLoadedEvent","e","nativeEvent","onAdLoadFailedEvent","onAdClickedEvent","onAdRevenuePaidEvent"],"sourceRoot":"../../src","sources":["CloudXAdViewBase.tsx"],"mappings":"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","ignoreList":[]}
@@ -52,6 +52,8 @@ export let CloudXErrorCode = /*#__PURE__*/function (CloudXErrorCode) {
52
52
  CloudXErrorCode[CloudXErrorCode["LOAD_NOT_ALLOWED_WHILE_SHOWING"] = 303] = "LOAD_NOT_ALLOWED_WHILE_SHOWING";
53
53
  /** Ad failed to load. */
54
54
  CloudXErrorCode[CloudXErrorCode["LOAD_FAILED"] = 304] = "LOAD_FAILED";
55
+ /** `load` was rejected because the per-ad-unit concurrent load cap was reached. Wait for an in-flight load to terminate or raise the cap. */
56
+ CloudXErrorCode[CloudXErrorCode["LOAD_REJECTED_CONCURRENCY"] = 305] = "LOAD_REJECTED_CONCURRENCY";
55
57
  // AD DISPLAY / SHOW (400-499)
56
58
  /** Ad is not ready to be shown. */
57
59
  CloudXErrorCode[CloudXErrorCode["AD_NOT_READY"] = 400] = "AD_NOT_READY";
@@ -1 +1 @@
1
- {"version":3,"names":["CloudXErrorCode"],"sourceRoot":"../../src","sources":["CloudXErrorCode.ts"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAYA,eAAe,0BAAfA,eAAe;EACvB;EAEA;EAHQA,eAAe,CAAfA,eAAe;EAMvB;EAEA;EARQA,eAAe,CAAfA,eAAe;EAWvB;EAXQA,eAAe,CAAfA,eAAe;EAcvB;EAdQA,eAAe,CAAfA,eAAe;EAiBvB;EAjBQA,eAAe,CAAfA,eAAe;EAoBvB;EApBQA,eAAe,CAAfA,eAAe;EAuBvB;EAvBQA,eAAe,CAAfA,eAAe;EA0BvB;EA1BQA,eAAe,CAAfA,eAAe;EA6BvB;EAEA;EA/BQA,eAAe,CAAfA,eAAe;EAkCvB;EAlCQA,eAAe,CAAfA,eAAe;EAqCvB;EArCQA,eAAe,CAAfA,eAAe;EAwCvB;EAxCQA,eAAe,CAAfA,eAAe;EA2CvB;EA3CQA,eAAe,CAAfA,eAAe;EA8CvB;EAEA;EAhDQA,eAAe,CAAfA,eAAe;EAmDvB;EAnDQA,eAAe,CAAfA,eAAe;EAsDvB;EAtDQA,eAAe,CAAfA,eAAe;EAyDvB;EAzDQA,eAAe,CAAfA,eAAe;EA4DvB;EA5DQA,eAAe,CAAfA,eAAe;EA+DvB;EAEA;EAjEQA,eAAe,CAAfA,eAAe;EAoEvB;EApEQA,eAAe,CAAfA,eAAe;EAuEvB;EAvEQA,eAAe,CAAfA,eAAe;EA0EvB;EAEA;EA5EQA,eAAe,CAAfA,eAAe;EA+EvB;EAEA;EAjFQA,eAAe,CAAfA,eAAe;EAoFvB;EApFQA,eAAe,CAAfA,eAAe;EAuFvB;EAvFQA,eAAe,CAAfA,eAAe;EA0FvB;EA1FQA,eAAe,CAAfA,eAAe;EA6FvB;EA7FQA,eAAe,CAAfA,eAAe;EAgGvB;EAhGQA,eAAe,CAAfA,eAAe;EAmGvB;EAnGQA,eAAe,CAAfA,eAAe;EAsGvB;EAtGQA,eAAe,CAAfA,eAAe;EAyGvB;EAzGQA,eAAe,CAAfA,eAAe;EA4GvB;EA5GQA,eAAe,CAAfA,eAAe;EA+GvB;EA/GQA,eAAe,CAAfA,eAAe;EAkHvB;EAlHQA,eAAe,CAAfA,eAAe;EAqHvB;EArHQA,eAAe,CAAfA,eAAe;EAwHvB;EAxHQA,eAAe,CAAfA,eAAe;EA2HvB;EA3HQA,eAAe,CAAfA,eAAe;EA8HvB;EA9HQA,eAAe,CAAfA,eAAe;EAiIvB;EAjIQA,eAAe,CAAfA,eAAe;EAoIvB;EApIQA,eAAe,CAAfA,eAAe;EAuIvB;EAvIQA,eAAe,CAAfA,eAAe;EA0IvB;EA1IQA,eAAe,CAAfA,eAAe;EA6IvB;EA7IQA,eAAe,CAAfA,eAAe;EAgJvB;EAhJQA,eAAe,CAAfA,eAAe;EAmJvB;EAnJQA,eAAe,CAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["CloudXErrorCode"],"sourceRoot":"../../src","sources":["CloudXErrorCode.ts"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAYA,eAAe,0BAAfA,eAAe;EACvB;EAEA;EAHQA,eAAe,CAAfA,eAAe;EAMvB;EAEA;EARQA,eAAe,CAAfA,eAAe;EAWvB;EAXQA,eAAe,CAAfA,eAAe;EAcvB;EAdQA,eAAe,CAAfA,eAAe;EAiBvB;EAjBQA,eAAe,CAAfA,eAAe;EAoBvB;EApBQA,eAAe,CAAfA,eAAe;EAuBvB;EAvBQA,eAAe,CAAfA,eAAe;EA0BvB;EA1BQA,eAAe,CAAfA,eAAe;EA6BvB;EAEA;EA/BQA,eAAe,CAAfA,eAAe;EAkCvB;EAlCQA,eAAe,CAAfA,eAAe;EAqCvB;EArCQA,eAAe,CAAfA,eAAe;EAwCvB;EAxCQA,eAAe,CAAfA,eAAe;EA2CvB;EA3CQA,eAAe,CAAfA,eAAe;EA8CvB;EAEA;EAhDQA,eAAe,CAAfA,eAAe;EAmDvB;EAnDQA,eAAe,CAAfA,eAAe;EAsDvB;EAtDQA,eAAe,CAAfA,eAAe;EAyDvB;EAzDQA,eAAe,CAAfA,eAAe;EA4DvB;EA5DQA,eAAe,CAAfA,eAAe;EA+DvB;EA/DQA,eAAe,CAAfA,eAAe;EAkEvB;EAEA;EApEQA,eAAe,CAAfA,eAAe;EAuEvB;EAvEQA,eAAe,CAAfA,eAAe;EA0EvB;EA1EQA,eAAe,CAAfA,eAAe;EA6EvB;EAEA;EA/EQA,eAAe,CAAfA,eAAe;EAkFvB;EAEA;EApFQA,eAAe,CAAfA,eAAe;EAuFvB;EAvFQA,eAAe,CAAfA,eAAe;EA0FvB;EA1FQA,eAAe,CAAfA,eAAe;EA6FvB;EA7FQA,eAAe,CAAfA,eAAe;EAgGvB;EAhGQA,eAAe,CAAfA,eAAe;EAmGvB;EAnGQA,eAAe,CAAfA,eAAe;EAsGvB;EAtGQA,eAAe,CAAfA,eAAe;EAyGvB;EAzGQA,eAAe,CAAfA,eAAe;EA4GvB;EA5GQA,eAAe,CAAfA,eAAe;EA+GvB;EA/GQA,eAAe,CAAfA,eAAe;EAkHvB;EAlHQA,eAAe,CAAfA,eAAe;EAqHvB;EArHQA,eAAe,CAAfA,eAAe;EAwHvB;EAxHQA,eAAe,CAAfA,eAAe;EA2HvB;EA3HQA,eAAe,CAAfA,eAAe;EA8HvB;EA9HQA,eAAe,CAAfA,eAAe;EAiIvB;EAjIQA,eAAe,CAAfA,eAAe;EAoIvB;EApIQA,eAAe,CAAfA,eAAe;EAuIvB;EAvIQA,eAAe,CAAfA,eAAe;EA0IvB;EA1IQA,eAAe,CAAfA,eAAe;EA6IvB;EA7IQA,eAAe,CAAfA,eAAe;EAgJvB;EAhJQA,eAAe,CAAfA,eAAe;EAmJvB;EAnJQA,eAAe,CAAfA,eAAe;EAsJvB;EAtJQA,eAAe,CAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA","ignoreList":[]}
@@ -0,0 +1,324 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import * as React from 'react';
3
+ import { useCallback, useContext, useEffect, useImperativeHandle, useMemo, useRef, useState, forwardRef } from 'react';
4
+ import { findNodeHandle, View } from 'react-native';
5
+ import NativeCloudXNativeAdView, { Commands } from './specs/CloudXNativeAdViewNativeComponent';
6
+ import { toNativeExtraParameterEntries } from './extraParameters';
7
+ import { CloudXNativeAssetType } from './types/NativeAd';
8
+ import { CloudXNativeAdViewContext, CloudXNativeAdViewProvider } from './CloudXNativeAdViewProvider';
9
+ import { useCloudXSdkInitializationGate } from './useCloudXSdkInitialization';
10
+ const parseAdValues = json => {
11
+ if (!json) {
12
+ return {};
13
+ }
14
+ try {
15
+ const parsed = JSON.parse(json);
16
+ return parsed && typeof parsed === 'object' ? parsed : {};
17
+ } catch {
18
+ return {};
19
+ }
20
+ };
21
+ const parseNativeAdMetadata = json => {
22
+ if (!json) {
23
+ return null;
24
+ }
25
+ try {
26
+ const parsed = JSON.parse(json);
27
+ return parsed && typeof parsed === 'object' ? parsed : null;
28
+ } catch {
29
+ return null;
30
+ }
31
+ };
32
+ const toAdInfo = event => {
33
+ const nativeAd = parseNativeAdMetadata(event.nativeAdJson);
34
+ return {
35
+ adUnitId: event.adUnitId,
36
+ adFormat: event.adFormat,
37
+ networkName: event.networkName,
38
+ networkPlacement: event.networkPlacement || null,
39
+ placement: event.placement || null,
40
+ creativeId: event.creativeId || null,
41
+ revenue: event.revenue ?? 0,
42
+ adValues: parseAdValues(event.adValuesJson),
43
+ nativeAd
44
+ };
45
+ };
46
+ const toLoadFailedInfo = event => ({
47
+ adUnitId: event.adUnitId,
48
+ code: event.code,
49
+ message: event.message || null
50
+ });
51
+
52
+ /**
53
+ * Renders a native ad. Defaults to the SDK's bundled template layouts;
54
+ * set `renderMode="manual"` to drive layout through the pre-built asset
55
+ * components (`CloudXTitleView`, `CloudXMediaView`, etc.) instead.
56
+ *
57
+ * Manual mode is never inferred from the presence of children — `renderMode`
58
+ * is always explicit so a publisher's intent is visible at the call site.
59
+ */
60
+ export const CloudXNativeAdView = /*#__PURE__*/forwardRef(function CloudXNativeAdView(props, ref) {
61
+ const {
62
+ renderMode = 'template',
63
+ style,
64
+ testID,
65
+ children
66
+ } = props;
67
+
68
+ /*
69
+ * Gate native ad-view creation on SDK initialization; shared with
70
+ * CloudXAdViewBase (banner/MREC) via useCloudXSdkInitializationGate.
71
+ * See that hook for why polling (rather than an init event) is
72
+ * required.
73
+ */
74
+ const isInitialized = useCloudXSdkInitializationGate('CloudXNativeAdView');
75
+
76
+ // Dev-only guard: an asset component (CloudXTitleView, etc.) mounted
77
+ // while renderMode is 'template' silently does nothing on the native
78
+ // side, which is almost always a publisher forgetting to set
79
+ // renderMode="manual". Warn once per host instance.
80
+ const warnedAssetInTemplateMode = useRef(false);
81
+ const handleAssetRoleRegistered = useCallback(role => {
82
+ if (renderMode !== 'template' || warnedAssetInTemplateMode.current) {
83
+ return;
84
+ }
85
+ warnedAssetInTemplateMode.current = true;
86
+ console.warn(`CloudXNativeAdView: <${role}/> is a manual-render asset component, but this ` + 'CloudXNativeAdView has renderMode="template" (the default). Set renderMode="manual" ' + 'to bind asset views, or remove the child to use the bundled template layout.');
87
+ }, [renderMode]);
88
+ if (!isInitialized) {
89
+ // Preserve children + view-safe props so a manual layout's asset
90
+ // views mount and reserve their space before the SDK is ready.
91
+ // The imperative ref is NOT forwarded here — it stays unset until
92
+ // the native view mounts, so callers can't dispatch
93
+ // loadAd/destroyAd at a placeholder.
94
+ return /*#__PURE__*/React.createElement(CloudXNativeAdViewProvider, {
95
+ onAssetRoleRegistered: handleAssetRoleRegistered
96
+ }, /*#__PURE__*/React.createElement(View, {
97
+ style: style,
98
+ testID: testID
99
+ }, children));
100
+ }
101
+ return /*#__PURE__*/React.createElement(CloudXNativeAdViewProvider, {
102
+ onAssetRoleRegistered: handleAssetRoleRegistered
103
+ }, /*#__PURE__*/React.createElement(CloudXNativeAdViewImpl, _extends({}, props, {
104
+ ref: ref
105
+ })));
106
+ });
107
+ export default CloudXNativeAdView;
108
+ const CloudXNativeAdViewImpl = /*#__PURE__*/forwardRef(function CloudXNativeAdViewImpl(props, ref) {
109
+ const {
110
+ adUnitId,
111
+ placement,
112
+ customData,
113
+ template,
114
+ disableVideoFullScreen,
115
+ startVideoUnmuted,
116
+ hideVideoMediaControls,
117
+ extraParameters,
118
+ localExtraParameters,
119
+ renderMode = 'template',
120
+ onAdLoaded,
121
+ onAdLoadFailed,
122
+ onAdDisplayFailed,
123
+ onAdClicked,
124
+ onAdExpired,
125
+ onAdClosed,
126
+ onAdRevenuePaid,
127
+ style,
128
+ testID,
129
+ children,
130
+ ...rest
131
+ } = props;
132
+ const isManual = renderMode === 'manual';
133
+ const {
134
+ setNativeAd,
135
+ titleRef,
136
+ advertiserRef,
137
+ bodyRef,
138
+ callToActionRef,
139
+ iconRef,
140
+ optionsRef,
141
+ mediaRef,
142
+ starRatingRef,
143
+ mountedAssetRoles
144
+ } = useContext(CloudXNativeAdViewContext);
145
+ const nativeRef = useRef(null);
146
+ const pendingMetadata = useRef(null);
147
+ // Cache of the last successfully loaded ad, used to backfill the
148
+ // CloudXAdInfo fields onAdDisplayFailedEvent doesn't carry (the
149
+ // native event is a bare {adUnitId, code, message} — a display
150
+ // failure always follows a prior load of the same ad).
151
+ const lastAdInfoRef = useRef(null);
152
+ const [bindTick, setBindTick] = useState(0);
153
+ const loadAd = useCallback(() => {
154
+ if (nativeRef.current) {
155
+ Commands.loadAd(nativeRef.current);
156
+ }
157
+ }, []);
158
+ const destroyAd = useCallback(() => {
159
+ if (nativeRef.current) {
160
+ Commands.destroyAd(nativeRef.current);
161
+ }
162
+ // Clear the shared metadata so asset components stop rendering the
163
+ // destroyed ad's content and a subsequent load starts clean.
164
+ pendingMetadata.current = null;
165
+ lastAdInfoRef.current = null;
166
+ setNativeAd(null);
167
+ }, [setNativeAd]);
168
+
169
+ /**
170
+ * Escape hatch for imperative control. The native view auto-loads on
171
+ * attach and tears down its native ad on unmount; most integrations
172
+ * never need this ref. Primary lifecycle is still mount/props/unmount.
173
+ *
174
+ * `loadAd()` does NOT force a new auction. Both native SDKs re-serve the
175
+ * ad they already hold while it is neither expired nor destroyed —
176
+ * including after its impression — so changed targeting is not picked
177
+ * up. Call `destroyAd()` first to get a genuinely fresh ad.
178
+ */
179
+ useImperativeHandle(ref, () => ({
180
+ loadAd,
181
+ destroyAd
182
+ }), [loadAd, destroyAd]);
183
+ const nativeExtraParameters = useMemo(() => toNativeExtraParameterEntries(extraParameters), [extraParameters]);
184
+ const nativeLocalExtraParameters = useMemo(() => toNativeExtraParameterEntries(localExtraParameters), [localExtraParameters]);
185
+ const bindAssetView = useCallback((assetRef, assetName) => {
186
+ if (!nativeRef.current || !(assetRef !== null && assetRef !== void 0 && assetRef.current)) return false;
187
+ const assetTag = findNodeHandle(assetRef.current);
188
+ if (assetTag == null) return false;
189
+ Commands.updateAssetView(nativeRef.current, assetTag, assetName);
190
+ return true;
191
+ }, []);
192
+ const handleAdLoaded = useCallback(event => {
193
+ const adInfo = toAdInfo(event.nativeEvent);
194
+ lastAdInfoRef.current = adInfo;
195
+ if (isManual && adInfo.nativeAd) {
196
+ pendingMetadata.current = adInfo.nativeAd;
197
+ setNativeAd(adInfo.nativeAd);
198
+ setBindTick(n => n + 1);
199
+ }
200
+ onAdLoaded === null || onAdLoaded === void 0 || onAdLoaded(adInfo);
201
+ }, [isManual, setNativeAd, onAdLoaded]);
202
+ const handleAdLoadFailed = useCallback(event => {
203
+ onAdLoadFailed === null || onAdLoadFailed === void 0 || onAdLoadFailed(toLoadFailedInfo(event.nativeEvent));
204
+ }, [onAdLoadFailed]);
205
+ const handleAdDisplayFailed = useCallback(event => {
206
+ if (!onAdDisplayFailed) return;
207
+ const {
208
+ adUnitId: failedAdUnitId,
209
+ code,
210
+ message
211
+ } = event.nativeEvent;
212
+ // The cached ad info is only a valid description of this
213
+ // failure if it describes the ad unit that actually failed. A
214
+ // display failure arriving after a re-target would otherwise
215
+ // report the previous unit's network, placement and revenue.
216
+ const cached = lastAdInfoRef.current;
217
+ const base = cached && cached.adUnitId === failedAdUnitId ? cached : null;
218
+ const displayFailedInfo = {
219
+ // The event's own adUnitId is authoritative.
220
+ adUnitId: failedAdUnitId || (base === null || base === void 0 ? void 0 : base.adUnitId) || '',
221
+ adFormat: (base === null || base === void 0 ? void 0 : base.adFormat) ?? 'NATIVE',
222
+ networkName: (base === null || base === void 0 ? void 0 : base.networkName) ?? '',
223
+ networkPlacement: (base === null || base === void 0 ? void 0 : base.networkPlacement) ?? null,
224
+ placement: (base === null || base === void 0 ? void 0 : base.placement) ?? null,
225
+ revenue: (base === null || base === void 0 ? void 0 : base.revenue) ?? 0,
226
+ adValues: (base === null || base === void 0 ? void 0 : base.adValues) ?? {},
227
+ nativeAd: (base === null || base === void 0 ? void 0 : base.nativeAd) ?? null,
228
+ code: code,
229
+ message: message || null
230
+ };
231
+ onAdDisplayFailed(displayFailedInfo);
232
+ }, [onAdDisplayFailed]);
233
+ const handleAdClicked = useCallback(event => onAdClicked === null || onAdClicked === void 0 ? void 0 : onAdClicked(toAdInfo(event.nativeEvent)), [onAdClicked]);
234
+ const handleAdExpired = useCallback(event => onAdExpired === null || onAdExpired === void 0 ? void 0 : onAdExpired(toAdInfo(event.nativeEvent)), [onAdExpired]);
235
+ const handleAdClosed = useCallback(event => onAdClosed === null || onAdClosed === void 0 ? void 0 : onAdClosed(toAdInfo(event.nativeEvent)), [onAdClosed]);
236
+ const handleAdRevenuePaid = useCallback(event => onAdRevenuePaid === null || onAdRevenuePaid === void 0 ? void 0 : onAdRevenuePaid(toAdInfo(event.nativeEvent)), [onAdRevenuePaid]);
237
+ useEffect(() => {
238
+ if (!isManual || bindTick === 0) return;
239
+ const metadata = pendingMetadata.current;
240
+ if (!metadata) return;
241
+ const iconAvailable = metadata.isIconImageAvailable;
242
+ const plan = [[titleRef, CloudXNativeAssetType.TITLE, Boolean(metadata.title)], [advertiserRef, CloudXNativeAssetType.ADVERTISER, Boolean(metadata.advertiser)], [bodyRef, CloudXNativeAssetType.BODY, Boolean(metadata.body)], [callToActionRef, CloudXNativeAssetType.CALL_TO_ACTION, Boolean(metadata.callToAction)], [iconRef, CloudXNativeAssetType.ICON, iconAvailable], [optionsRef, CloudXNativeAssetType.OPTIONS, metadata.isOptionsViewAvailable], [mediaRef, CloudXNativeAssetType.MEDIA, metadata.isMediaViewAvailable], [starRatingRef, CloudXNativeAssetType.STAR_RATING, metadata.starRating != null && metadata.starRating > 0]];
243
+
244
+ // Asset refs mount asynchronously: components render from context
245
+ // state that was just set, so on the first frame after onAdLoaded
246
+ // some refs may still be null. Retry binding across a few frames
247
+ // and only dispatch renderNativeAd (which registers click +
248
+ // impression tracking) once every wanted asset is bound — or,
249
+ // after exhausting retries, render with what did bind and warn.
250
+ const MAX_BIND_ATTEMPTS = 10;
251
+ let cancelled = false;
252
+ // Track every retry timer so unmount can cancel the chain instead
253
+ // of leaving fire-and-forget timers that dispatch commands at a
254
+ // recycled or unmounted view tag.
255
+ const pendingTimers = new Set();
256
+ const scheduleRetry = fn => {
257
+ const timer = setTimeout(fn, 16);
258
+ pendingTimers.add(timer);
259
+ };
260
+ const attemptBind = (attempt, remaining) => {
261
+ if (cancelled || pendingMetadata.current == null) return;
262
+ if (!nativeRef.current) {
263
+ if (attempt < MAX_BIND_ATTEMPTS) {
264
+ scheduleRetry(() => attemptBind(attempt + 1, remaining));
265
+ }
266
+ return;
267
+ }
268
+ for (const [assetRef, assetName, wanted] of plan) {
269
+ if (!wanted || !remaining.has(assetName)) continue;
270
+ if (bindAssetView(assetRef, assetName)) {
271
+ remaining.delete(assetName);
272
+ }
273
+ }
274
+ if (remaining.size > 0 && attempt < MAX_BIND_ATTEMPTS) {
275
+ scheduleRetry(() => attemptBind(attempt + 1, remaining));
276
+ return;
277
+ }
278
+ if (remaining.size > 0) {
279
+ console.warn(`CloudXNativeAdView: asset view(s) never mounted for binding: ${[...remaining].join(', ')}. ` + 'Rendering with the bound subset; click/impression tracking may be incomplete.');
280
+ }
281
+ Commands.renderNativeAd(nativeRef.current);
282
+ };
283
+
284
+ // An asset is only worth waiting for when the ad carries it AND the
285
+ // publisher mounted its component. Waiting on the ad's asset set
286
+ // alone made every layout that omits an optional component (an ad
287
+ // with an advertiser rendered by a layout with no
288
+ // CloudXAdvertiserView, say) burn all MAX_BIND_ATTEMPTS retries
289
+ // before dispatching renderNativeAd, delaying impression and click
290
+ // registration, and warn about it on every such ad.
291
+ const wanted = new Set(plan.filter(([, name, w]) => w && mountedAssetRoles.current.has(`CloudX${name}`)).map(([, name]) => name));
292
+ attemptBind(1, wanted);
293
+ return () => {
294
+ cancelled = true;
295
+ pendingTimers.forEach(timer => clearTimeout(timer));
296
+ pendingTimers.clear();
297
+ };
298
+ }, [bindTick, isManual, bindAssetView, titleRef, advertiserRef, bodyRef, callToActionRef, iconRef, optionsRef, mediaRef, starRatingRef, mountedAssetRoles]);
299
+ return /*#__PURE__*/React.createElement(NativeCloudXNativeAdView, _extends({}, rest, {
300
+ ref: r => {
301
+ nativeRef.current = r;
302
+ },
303
+ adUnitId: adUnitId,
304
+ templateName: template,
305
+ placement: placement ?? null,
306
+ customData: customData ?? null,
307
+ disableVideoFullScreen: disableVideoFullScreen,
308
+ startVideoUnmuted: startVideoUnmuted,
309
+ hideVideoMediaControls: hideVideoMediaControls,
310
+ extraParameters: nativeExtraParameters,
311
+ localExtraParameters: nativeLocalExtraParameters,
312
+ manualRender: isManual,
313
+ onAdLoadedEvent: handleAdLoaded,
314
+ onAdLoadFailedEvent: handleAdLoadFailed,
315
+ onAdDisplayFailedEvent: handleAdDisplayFailed,
316
+ onAdClickedEvent: handleAdClicked,
317
+ onAdExpiredEvent: handleAdExpired,
318
+ onAdClosedEvent: handleAdClosed,
319
+ onAdRevenuePaidEvent: handleAdRevenuePaid,
320
+ style: style,
321
+ testID: testID
322
+ }), children);
323
+ });
324
+ //# sourceMappingURL=CloudXNativeAdView.js.map