cloudx-react-native 3.11.0 → 3.11.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 (77) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/cloudxreactnative/CloudXAdEvents.kt +9 -0
  3. package/android/src/main/java/com/cloudxreactnative/CloudXAdInfo.kt +76 -0
  4. package/android/src/main/java/com/cloudxreactnative/CloudXModuleImpl.kt +110 -0
  5. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdHolder.kt +184 -0
  6. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdView.kt +209 -70
  7. package/android/src/main/java/com/cloudxreactnative/CloudXNativeAdViewManagerImpl.kt +6 -0
  8. package/android/src/newarch/com/cloudxreactnative/CloudXModule.kt +9 -0
  9. package/android/src/newarch/com/cloudxreactnative/CloudXNativeAdViewManager.kt +2 -0
  10. package/android/src/oldarch/com/cloudxreactnative/CloudXModule.kt +14 -0
  11. package/android/src/oldarch/com/cloudxreactnative/CloudXNativeAdViewManager.kt +3 -0
  12. package/android/src/test/java/com/cloudxreactnative/CloudXNativeAdPreloadTest.kt +351 -0
  13. package/android/src/test/java/com/cloudxreactnative/FakeReadable.kt +2 -2
  14. package/ios/CloudX.h +12 -0
  15. package/ios/CloudX.mm +94 -1
  16. package/ios/CloudXNativeAdHolder.h +66 -0
  17. package/ios/CloudXNativeAdHolder.mm +247 -0
  18. package/ios/CloudXNativeAdView.h +9 -0
  19. package/ios/CloudXNativeAdView.mm +308 -64
  20. package/ios/CloudXNativeAdViewManager.mm +7 -0
  21. package/lib/commonjs/CloudXNativeAd.js +178 -0
  22. package/lib/commonjs/CloudXNativeAd.js.map +1 -0
  23. package/lib/commonjs/CloudXNativeAdView.js +58 -11
  24. package/lib/commonjs/CloudXNativeAdView.js.map +1 -1
  25. package/lib/commonjs/hooks.js +203 -0
  26. package/lib/commonjs/hooks.js.map +1 -1
  27. package/lib/commonjs/index.js +13 -0
  28. package/lib/commonjs/index.js.map +1 -1
  29. package/lib/commonjs/specs/CloudXNativeAdViewNativeComponent.js +2 -0
  30. package/lib/commonjs/specs/CloudXNativeAdViewNativeComponent.js.map +1 -1
  31. package/lib/commonjs/specs/NativeCloudX.js.map +1 -1
  32. package/lib/commonjs/types/NativeAd.js +21 -1
  33. package/lib/commonjs/types/NativeAd.js.map +1 -1
  34. package/lib/commonjs/types/index.js.map +1 -1
  35. package/lib/commonjs/version.js +1 -1
  36. package/lib/module/CloudXNativeAd.js +170 -0
  37. package/lib/module/CloudXNativeAd.js.map +1 -0
  38. package/lib/module/CloudXNativeAdView.js +58 -11
  39. package/lib/module/CloudXNativeAdView.js.map +1 -1
  40. package/lib/module/hooks.js +202 -0
  41. package/lib/module/hooks.js.map +1 -1
  42. package/lib/module/index.js +2 -1
  43. package/lib/module/index.js.map +1 -1
  44. package/lib/module/specs/CloudXNativeAdViewNativeComponent.js +2 -0
  45. package/lib/module/specs/CloudXNativeAdViewNativeComponent.js.map +1 -1
  46. package/lib/module/specs/NativeCloudX.js.map +1 -1
  47. package/lib/module/types/NativeAd.js +26 -1
  48. package/lib/module/types/NativeAd.js.map +1 -1
  49. package/lib/module/types/index.js.map +1 -1
  50. package/lib/module/version.js +1 -1
  51. package/lib/typescript/src/CloudXNativeAd.d.ts +58 -0
  52. package/lib/typescript/src/CloudXNativeAd.d.ts.map +1 -0
  53. package/lib/typescript/src/CloudXNativeAdView.d.ts +6 -13
  54. package/lib/typescript/src/CloudXNativeAdView.d.ts.map +1 -1
  55. package/lib/typescript/src/hooks.d.ts +30 -0
  56. package/lib/typescript/src/hooks.d.ts.map +1 -1
  57. package/lib/typescript/src/index.d.ts +4 -3
  58. package/lib/typescript/src/index.d.ts.map +1 -1
  59. package/lib/typescript/src/specs/CloudXNativeAdViewNativeComponent.d.ts +23 -2
  60. package/lib/typescript/src/specs/CloudXNativeAdViewNativeComponent.d.ts.map +1 -1
  61. package/lib/typescript/src/specs/NativeCloudX.d.ts +13 -0
  62. package/lib/typescript/src/specs/NativeCloudX.d.ts.map +1 -1
  63. package/lib/typescript/src/types/NativeAd.d.ts +76 -13
  64. package/lib/typescript/src/types/NativeAd.d.ts.map +1 -1
  65. package/lib/typescript/src/types/index.d.ts +1 -1
  66. package/lib/typescript/src/types/index.d.ts.map +1 -1
  67. package/lib/typescript/src/version.d.ts +1 -1
  68. package/package.json +1 -1
  69. package/src/CloudXNativeAd.ts +177 -0
  70. package/src/CloudXNativeAdView.tsx +82 -15
  71. package/src/hooks.ts +236 -0
  72. package/src/index.ts +14 -1
  73. package/src/specs/CloudXNativeAdViewNativeComponent.ts +27 -2
  74. package/src/specs/NativeCloudX.ts +20 -0
  75. package/src/types/NativeAd.ts +85 -18
  76. package/src/types/index.ts +4 -0
  77. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CloudXNativeAdViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../../src/specs/CloudXNativeAdViewNativeComponent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CloudXNativeAdViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../../src/specs/CloudXNativeAdViewNativeComponent.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,10 @@ export interface Spec extends TurboModule {
46
46
  ON_APPOPEN_DISPLAY_FAILED_EVENT: string;
47
47
  ON_APPOPEN_HIDDEN_EVENT: string;
48
48
  ON_APPOPEN_AD_REVENUE_PAID: string;
49
+ ON_NATIVE_AD_CLICKED_EVENT: string;
50
+ ON_NATIVE_AD_EXPIRED_EVENT: string;
51
+ ON_NATIVE_AD_CLOSED_EVENT: string;
52
+ ON_NATIVE_AD_REVENUE_PAID: string;
49
53
  };
50
54
  isInitialized(): Promise<boolean>;
51
55
  initialize(pluginVersion: string, appKey: string): Promise<CloudXConfiguration>;
@@ -103,6 +107,15 @@ export interface Spec extends TurboModule {
103
107
  isAppOpenReady(adUnitId: string): Promise<boolean>;
104
108
  showAppOpen(adUnitId: string, placement?: string | null, customData?: string | null): void;
105
109
  destroyAppOpen(adUnitId: string): void;
110
+ /**
111
+ * Loads a native ad with no view attached. Resolves with
112
+ * `{ nativeAdId, adInfo }` once an ad is held natively; rejects with the
113
+ * CloudX error code as the promise code. The ad stays held until
114
+ * `destroyNativeAd`, expiry, or module invalidation.
115
+ */
116
+ loadNativeAd(adUnitId: string, options: UnsafeObject): Promise<UnsafeObject>;
117
+ /** Releases a held native ad. Idempotent; unknown ids are ignored. */
118
+ destroyNativeAd(nativeAdId: string): void;
106
119
  addListener(eventName: string): void;
107
120
  removeListeners(count: number): void;
108
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NativeCloudX.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeCloudX.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;GAQG;AACH,MAAM,WAAW,IAAK,SAAQ,WAAW;IAKrC,QAAQ,CAAC,YAAY,EAAE,MAAM;QAEzB,yBAAyB,EAAE,MAAM,CAAC;QAClC,8BAA8B,EAAE,MAAM,CAAC;QACvC,0BAA0B,EAAE,MAAM,CAAC;QACnC,2BAA2B,EAAE,MAAM,CAAC;QACpC,4BAA4B,EAAE,MAAM,CAAC;QACrC,yBAAyB,EAAE,MAAM,CAAC;QAGlC,uBAAuB,EAAE,MAAM,CAAC;QAChC,4BAA4B,EAAE,MAAM,CAAC;QACrC,wBAAwB,EAAE,MAAM,CAAC;QACjC,yBAAyB,EAAE,MAAM,CAAC;QAClC,0BAA0B,EAAE,MAAM,CAAC;QACnC,uBAAuB,EAAE,MAAM,CAAC;QAGhC,4BAA4B,EAAE,MAAM,CAAC;QACrC,iCAAiC,EAAE,MAAM,CAAC;QAC1C,6BAA6B,EAAE,MAAM,CAAC;QACtC,+BAA+B,EAAE,MAAM,CAAC;QACxC,oCAAoC,EAAE,MAAM,CAAC;QAC7C,4BAA4B,EAAE,MAAM,CAAC;QACrC,+BAA+B,EAAE,MAAM,CAAC;QAGxC,2BAA2B,EAAE,MAAM,CAAC;QACpC,gCAAgC,EAAE,MAAM,CAAC;QACzC,4BAA4B,EAAE,MAAM,CAAC;QACrC,8BAA8B,EAAE,MAAM,CAAC;QACvC,mCAAmC,EAAE,MAAM,CAAC;QAC5C,2BAA2B,EAAE,MAAM,CAAC;QACpC,oCAAoC,EAAE,MAAM,CAAC;QAC7C,2BAA2B,EAAE,MAAM,CAAC;QAGpC,uBAAuB,EAAE,MAAM,CAAC;QAChC,4BAA4B,EAAE,MAAM,CAAC;QACrC,wBAAwB,EAAE,MAAM,CAAC;QACjC,0BAA0B,EAAE,MAAM,CAAC;QACnC,+BAA+B,EAAE,MAAM,CAAC;QACxC,uBAAuB,EAAE,MAAM,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;KACtC,CAAC;IAMF,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChF,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAM9B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAMlD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,iBAAiB,IAAI,IAAI,CAAC;IAM1B,iBAAiB,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IACxD,YAAY,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAMhD,OAAO,CAAC,aAAa,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAG5D,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAMxD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACpG,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACzE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACrE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACvE,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,CAAC;IAChF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9E,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAMtC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACnE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACrE,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9E,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5E,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAMvE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,CAAC;IACtF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAChG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAM5C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,CAAC;IAClF,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5F,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAMxC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,CAAC;IACjF,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC3F,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAMvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;;AAED,wBAAgE"}
1
+ {"version":3,"file":"NativeCloudX.d.ts","sourceRoot":"","sources":["../../../../src/specs/NativeCloudX.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import type { ViewProps } from 'react-native';
2
2
  import type { CloudXAdDisplayFailedInfo, CloudXAdInfo } from './AdInfo';
3
3
  import type { CloudXAdProps } from './AdProps';
4
- import type { CloudXExtraParameterValue } from './ExtraParameters';
4
+ import type { CloudXExtraParameters, CloudXExtraParameterValue } from './ExtraParameters';
5
+ import type { CloudXNativeAd } from '../CloudXNativeAd';
5
6
  /**
6
7
  * Built-in native ad template variants rendered by the SDK's view component.
7
8
  *
@@ -75,40 +76,102 @@ export type CloudXLocalExtraParameters = {
75
76
  [key: string]: CloudXExtraParameterValue;
76
77
  };
77
78
  /**
78
- * Props for the native-ad view component.
79
- *
80
- * Callbacks inherited from {@link CloudXAdProps} (`onAdLoaded`, `onAdLoadFailed`,
81
- * `onAdClicked`, `onAdRevenuePaid`) receive unwrapped payloads, not synthetic events.
79
+ * Load-time options for {@link CloudXNativeAd.load}. These configure the
80
+ * auction and the loader, so they are fixed once the ad is loaded; the view
81
+ * that later renders the ad only chooses the layout.
82
82
  */
83
- export type CloudXNativeAdViewProps = CloudXAdProps & ViewProps & {
84
- template?: CloudXNativeTemplate;
85
- localExtraParameters?: CloudXLocalExtraParameters;
83
+ export type CloudXNativeAdLoadOptions = {
84
+ placement?: string | null;
85
+ customData?: string | null;
86
+ extraParameters?: CloudXExtraParameters | null;
87
+ localExtraParameters?: CloudXLocalExtraParameters | null;
86
88
  disableVideoFullScreen?: boolean;
87
89
  startVideoUnmuted?: boolean;
88
90
  hideVideoMediaControls?: boolean;
91
+ };
92
+ /** Events a preloaded {@link CloudXNativeAd} reports on its own handle. */
93
+ export type CloudXNativeAdEventType = 'clicked' | 'revenuePaid' | 'expired' | 'closed';
94
+ /** Props every native-ad view accepts, whichever way the ad was loaded. */
95
+ type CloudXNativeAdViewRenderProps = ViewProps & {
96
+ template?: CloudXNativeTemplate;
89
97
  /** Selects between the SDK's bundled template layouts and manual asset binding. */
90
98
  renderMode?: 'template' | 'manual';
91
99
  /**
92
- * Called when a loaded ad subsequently fails to display or track.
100
+ * Called each time the ad is rendered into this view and registered for
101
+ * click and impression tracking. Fires again after a re-bind.
102
+ */
103
+ onAdDisplayed?: (adInfo: CloudXAdInfo) => void;
104
+ /**
105
+ * Called when an ad fails to display or track in this view.
93
106
  *
94
107
  * Emitted on both platforms. Android fires it for post-load
95
108
  * adapter/render errors and when click/impression registration fails in
96
- * manual mode. iOS fires it on the three manual-mode failure paths:
97
- * render requested before load, expired ad, and registration refused.
109
+ * manual mode. iOS fires it on the manual-mode failure paths: render
110
+ * requested before load, expired ad, and registration refused. With
111
+ * `nativeAd`, it also fires when the handle is destroyed or expired.
98
112
  */
99
113
  onAdDisplayFailed?: (errorInfo: CloudXAdDisplayFailedInfo) => void;
114
+ };
115
+ /**
116
+ * Props for a native-ad view that loads its own ad when it attaches and
117
+ * destroys it on unmount. This is the shape `CloudXNativeAdView` has always
118
+ * taken, so wrappers that extend, `Omit` or `Pick` it keep compiling.
119
+ *
120
+ * Callbacks inherited from {@link CloudXAdProps} (`onAdLoaded`, `onAdLoadFailed`,
121
+ * `onAdClicked`, `onAdRevenuePaid`) receive unwrapped payloads, not synthetic events.
122
+ */
123
+ export type CloudXNativeAdViewProps = CloudXNativeAdViewRenderProps & CloudXAdProps & {
124
+ localExtraParameters?: CloudXLocalExtraParameters;
125
+ disableVideoFullScreen?: boolean;
126
+ startVideoUnmuted?: boolean;
127
+ hideVideoMediaControls?: boolean;
100
128
  onAdExpired?: (adInfo: CloudXAdInfo) => void;
101
129
  onAdClosed?: (adInfo: CloudXAdInfo) => void;
130
+ nativeAd?: never;
102
131
  };
132
+ /**
133
+ * The view renders an ad loaded earlier with {@link CloudXNativeAd.load}. It
134
+ * never loads and never destroys the ad. Clicks, revenue, expiry and close
135
+ * are reported once, on the handle (`nativeAd.addListener`), never on the
136
+ * view, so revenue cannot be counted twice.
137
+ */
138
+ export type CloudXNativeAdViewPreloadedProps = CloudXNativeAdViewRenderProps & {
139
+ nativeAd: CloudXNativeAd;
140
+ adUnitId?: never;
141
+ placement?: never;
142
+ customData?: never;
143
+ extraParameters?: never;
144
+ localExtraParameters?: never;
145
+ disableVideoFullScreen?: never;
146
+ startVideoUnmuted?: never;
147
+ hideVideoMediaControls?: never;
148
+ onAdLoaded?: never;
149
+ onAdLoadFailed?: never;
150
+ onAdClicked?: never;
151
+ onAdRevenuePaid?: never;
152
+ onAdExpired?: never;
153
+ onAdClosed?: never;
154
+ };
155
+ /**
156
+ * Everything `CloudXNativeAdView` accepts: either it loads its own ad
157
+ * ({@link CloudXNativeAdViewProps}) or it renders one loaded earlier
158
+ * ({@link CloudXNativeAdViewPreloadedProps}). Mixing the two is a type error.
159
+ */
160
+ export type CloudXNativeAdViewComponentProps = CloudXNativeAdViewProps | CloudXNativeAdViewPreloadedProps;
103
161
  export type CloudXNativeAdViewHandle = {
104
162
  /**
105
- * Requests a load. This does NOT force a new auction: both native SDKs
163
+ * Requests a load. No-op when the view renders a preloaded `nativeAd`.
164
+ * This does NOT force a new auction: both native SDKs
106
165
  * re-serve the ad they already hold while it is neither expired nor
107
166
  * destroyed, including after its impression. Changed targeting is
108
167
  * therefore not picked up. Call `destroyAd()` first for a fresh ad.
109
168
  */
110
169
  loadAd: () => void;
111
- /** Releases the native ad and its resources. */
170
+ /**
171
+ * Releases the native ad and its resources. No-op when the view renders a
172
+ * preloaded `nativeAd`: the handle owns that ad, so call `nativeAd.destroy()`.
173
+ */
112
174
  destroyAd: () => void;
113
175
  };
176
+ export {};
114
177
  //# sourceMappingURL=NativeAd.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NativeAd.d.ts","sourceRoot":"","sources":["../../../../src/types/NativeAd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,oBAAY,oBAAoB;IAC5B,6DAA6D;IAC7D,KAAK,mBAAmB;IAExB,wBAAwB;IACxB,MAAM,oBAAoB;IAE1B,sCAAsC;IACtC,YAAY,0BAA0B;IAEtC;;;;OAIG;IACH,cAAc,4BAA4B;CAC7C;AAED;;GAEG;AACH,oBAAY,qBAAqB;IAC7B,KAAK,cAAc;IACnB,UAAU,mBAAmB;IAC7B,IAAI,aAAa;IACjB,cAAc,qBAAqB;IACnC,IAAI,aAAa;IACjB,OAAO,gBAAgB;IACvB,KAAK,cAAc;IACnB,WAAW,mBAAmB;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAIF,MAAM,MAAM,0BAA0B,GAAG;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAAC;CAC5C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAC/C,SAAS,GAAG;IACR,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAClD,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mFAAmF;IACnF,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACnC;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACnE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEN,MAAM,MAAM,wBAAwB,GAAG;IACnC;;;;;OAKG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,gDAAgD;IAChD,SAAS,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC"}
1
+ {"version":3,"file":"NativeAd.d.ts","sourceRoot":"","sources":["../../../../src/types/NativeAd.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,6 @@ export type { CloudXMRECAdType } from './MRECAd';
14
14
  export type { CloudXAdProps } from './AdProps';
15
15
  export type { CloudXAdEventObject, CloudXAdEventListener } from './AdEvent';
16
16
  export type { CloudXExtraParameterValue, CloudXExtraParameters } from './ExtraParameters';
17
- export type { CloudXNativeAdMetadata, CloudXNativeAdViewHandle, CloudXNativeAdViewProps, CloudXLocalExtraParameters, } from './NativeAd';
17
+ export type { CloudXNativeAdMetadata, CloudXNativeAdViewHandle, CloudXNativeAdViewProps, CloudXNativeAdViewComponentProps, CloudXNativeAdViewPreloadedProps, CloudXNativeAdLoadOptions, CloudXNativeAdEventType, CloudXLocalExtraParameters, } from './NativeAd';
18
18
  export { CloudXNativeTemplate, CloudXNativeAssetType } from './NativeAd';
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpH,YAAY,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvF,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,YAAY,EACR,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAChH,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,YAAY,EACR,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpH,YAAY,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvF,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,YAAY,EACR,gBAAgB,EAChB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAChH,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,YAAY,EACR,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,gCAAgC,EAChC,gCAAgC,EAChC,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const PLUGIN_VERSION = "3.11.0";
1
+ export declare const PLUGIN_VERSION = "3.11.1";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudx-react-native",
3
- "version": "3.11.0",
3
+ "version": "3.11.1",
4
4
  "description": "React Native wrapper for CloudX SDK (iOS & Android)",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -0,0 +1,177 @@
1
+ import type { EventSubscription } from 'react-native';
2
+ import { emitter } from './EventEmitter';
3
+ import { toNativeExtraParameterEntries } from './extraParameters';
4
+ import NativeCloudX from './specs/NativeCloudX';
5
+ import type { CloudXErrorCode } from './CloudXErrorCode';
6
+ import type { CloudXAdInfo, CloudXAdLoadFailedInfo } from './types/AdInfo';
7
+ import type { CloudXNativeAdEventType, CloudXNativeAdLoadOptions, CloudXNativeAdMetadata } from './types/NativeAd';
8
+
9
+ const {
10
+ ON_NATIVE_AD_CLICKED_EVENT,
11
+ ON_NATIVE_AD_EXPIRED_EVENT,
12
+ ON_NATIVE_AD_CLOSED_EVENT,
13
+ ON_NATIVE_AD_REVENUE_PAID,
14
+ } = NativeCloudX.getConstants();
15
+
16
+ type NativeAdEventPayload = Partial<CloudXAdInfo> & { nativeAdId?: string };
17
+ type NativeAdListener = (adInfo: CloudXAdInfo) => void;
18
+
19
+ const toAdInfo = (payload: NativeAdEventPayload, adUnitId: string): CloudXAdInfo => ({
20
+ adUnitId: payload.adUnitId ?? adUnitId,
21
+ adFormat: payload.adFormat ?? 'NATIVE',
22
+ networkName: payload.networkName ?? '',
23
+ networkPlacement: payload.networkPlacement ?? null,
24
+ placement: payload.placement ?? null,
25
+ creativeId: payload.creativeId ?? null,
26
+ revenue: payload.revenue ?? 0,
27
+ adValues: payload.adValues ?? {},
28
+ nativeAd: payload.nativeAd ?? null,
29
+ });
30
+
31
+ // Live handles by native id. Native events arrive on the module-wide emitter
32
+ // and are routed here, so a handle never hears another ad's events.
33
+ const liveAds = new Map<string, CloudXNativeAd>();
34
+ let routingSubscriptions: EventSubscription[] | null = null;
35
+
36
+ const ensureEventRouting = (): void => {
37
+ if (routingSubscriptions) return;
38
+ const route = (type: CloudXNativeAdEventType) => (payload: NativeAdEventPayload) => {
39
+ const ad = payload.nativeAdId ? liveAds.get(payload.nativeAdId) : undefined;
40
+ ad?._handleNativeEvent(type, payload);
41
+ };
42
+ // Subscribe on the shared emitter directly: the module-level
43
+ // addEventListener helper keeps one listener per event name and would
44
+ // replace a publisher's own subscription.
45
+ routingSubscriptions = [
46
+ emitter.addListener(ON_NATIVE_AD_CLICKED_EVENT, route('clicked')),
47
+ emitter.addListener(ON_NATIVE_AD_REVENUE_PAID, route('revenuePaid')),
48
+ emitter.addListener(ON_NATIVE_AD_EXPIRED_EVENT, route('expired')),
49
+ emitter.addListener(ON_NATIVE_AD_CLOSED_EVENT, route('closed')),
50
+ ];
51
+ };
52
+
53
+ const toLoadFailedInfo = (adUnitId: string, error: unknown): CloudXAdLoadFailedInfo => {
54
+ const { code, message } = (error ?? {}) as { code?: unknown; message?: unknown };
55
+ const numeric = Number(code);
56
+ return {
57
+ adUnitId,
58
+ code: (Number.isFinite(numeric) ? numeric : 0) as CloudXErrorCode,
59
+ message: typeof message === 'string' ? message : null,
60
+ };
61
+ };
62
+
63
+ /**
64
+ * A native ad loaded ahead of its view.
65
+ *
66
+ * Load it whenever it suits the app, then render it with
67
+ * `<CloudXNativeAdView nativeAd={ad} />`. The handle owns the ad: unmounting a
68
+ * view never destroys it, and its impression is counted once. Clicks, revenue,
69
+ * expiry and close are reported here, not on the view.
70
+ *
71
+ * Moving an ad to another view differs by platform:
72
+ * - iOS: mount another view with the same ad and it shows there; the latest
73
+ * view wins.
74
+ * - Android: once the ad has been shown in a view, it stays with that view.
75
+ * Any other view, including a remounted list cell or a reopened screen,
76
+ * reports `onAdDisplayFailed` with `AD_ALREADY_SHOWING`. Load a fresh ad
77
+ * for each new view.
78
+ *
79
+ * An ad that expires before its impression (its `revenuePaid` event) reports
80
+ * `expired` on both platforms, even if it was already shown in a view.
81
+ *
82
+ * Call `destroy()` when the ad is no longer needed.
83
+ */
84
+ export class CloudXNativeAd {
85
+ readonly id: string;
86
+ readonly adUnitId: string;
87
+ /** Ad info as of load. Revenue callbacks carry the impression-time values. */
88
+ readonly info: CloudXAdInfo;
89
+ /** Asset metadata for manual layouts; `null` if the network reported none. */
90
+ readonly metadata: CloudXNativeAdMetadata | null;
91
+
92
+ private expired = false;
93
+ private destroyed = false;
94
+ private readonly listeners = new Map<CloudXNativeAdEventType, Set<NativeAdListener>>();
95
+
96
+ /**
97
+ * Loads a native ad without a view. Resolves once the ad is held natively;
98
+ * rejects with a `CloudXAdLoadFailedInfo`.
99
+ *
100
+ * Loads per ad unit are limited, so preload several ads one after another
101
+ * rather than all at once.
102
+ */
103
+ static async load(adUnitId: string, options: CloudXNativeAdLoadOptions = {}): Promise<CloudXNativeAd> {
104
+ ensureEventRouting();
105
+ // Extra parameters cross the bridge as {key, value} entries, the same
106
+ // wire format CloudXNativeAdView sends, so both native load paths
107
+ // configure the loader through one helper.
108
+ const wireOptions = {
109
+ ...options,
110
+ extraParameters: toNativeExtraParameterEntries(options.extraParameters),
111
+ localExtraParameters: toNativeExtraParameterEntries(options.localExtraParameters),
112
+ };
113
+ let result: { nativeAdId?: string; adInfo?: NativeAdEventPayload };
114
+ try {
115
+ result = (await NativeCloudX.loadNativeAd(adUnitId, wireOptions)) as typeof result;
116
+ } catch (error) {
117
+ throw toLoadFailedInfo(adUnitId, error);
118
+ }
119
+ if (!result?.nativeAdId) {
120
+ throw toLoadFailedInfo(adUnitId, { code: 0, message: 'Native module returned no native ad id' });
121
+ }
122
+ return new CloudXNativeAd(result.nativeAdId, adUnitId, result.adInfo ?? {});
123
+ }
124
+
125
+ private constructor(id: string, adUnitId: string, payload: NativeAdEventPayload) {
126
+ this.id = id;
127
+ this.adUnitId = adUnitId;
128
+ this.info = toAdInfo(payload, adUnitId);
129
+ this.metadata = this.info.nativeAd ?? null;
130
+ liveAds.set(id, this);
131
+ }
132
+
133
+ get isExpired(): boolean {
134
+ return this.expired;
135
+ }
136
+
137
+ get isDestroyed(): boolean {
138
+ return this.destroyed;
139
+ }
140
+
141
+ addListener(type: CloudXNativeAdEventType, listener: NativeAdListener): { remove: () => void } {
142
+ if (this.destroyed) {
143
+ console.warn(`CloudXNativeAd(${this.id}): addListener('${type}') after destroy() never fires.`);
144
+ return { remove: () => undefined };
145
+ }
146
+ let set = this.listeners.get(type);
147
+ if (!set) {
148
+ set = new Set();
149
+ this.listeners.set(type, set);
150
+ }
151
+ set.add(listener);
152
+ return { remove: () => this.listeners.get(type)?.delete(listener) };
153
+ }
154
+
155
+ /** Releases the native ad. Safe to call more than once. */
156
+ destroy(): void {
157
+ if (this.destroyed) return;
158
+ this.destroyed = true;
159
+ liveAds.delete(this.id);
160
+ this.listeners.clear();
161
+ NativeCloudX.destroyNativeAd(this.id);
162
+ }
163
+
164
+ /** @internal Routed from the module emitter; not part of the public API. */
165
+ _handleNativeEvent(type: CloudXNativeAdEventType, payload: NativeAdEventPayload): void {
166
+ if (this.destroyed) return;
167
+ if (type === 'expired') this.expired = true;
168
+ const adInfo = toAdInfo(payload, this.adUnitId);
169
+ this.listeners.get(type)?.forEach((listener) => {
170
+ try {
171
+ listener(adInfo);
172
+ } catch (error) {
173
+ console.error(`CloudXNativeAd(${this.id}): '${type}' listener threw`, error);
174
+ }
175
+ });
176
+ }
177
+ }
@@ -6,7 +6,7 @@ import NativeCloudXNativeAdView, { Commands } from './specs/CloudXNativeAdViewNa
6
6
  import type { CloudXNativeAdInfoEvent, CloudXNativeAdLoadFailedEvent } from './specs/CloudXNativeAdViewNativeComponent';
7
7
  import { toNativeExtraParameterEntries } from './extraParameters';
8
8
  import { CloudXNativeAssetType } from './types/NativeAd';
9
- import type { CloudXNativeAdMetadata, CloudXNativeAdViewHandle, CloudXNativeAdViewProps } from './types/NativeAd';
9
+ import type { CloudXNativeAdMetadata, CloudXNativeAdViewHandle, CloudXNativeAdViewComponentProps } from './types/NativeAd';
10
10
  import type { CloudXAdDisplayFailedInfo, CloudXAdInfo, CloudXAdLoadFailedInfo } from './types/AdInfo';
11
11
  import type { CloudXErrorCode } from './CloudXErrorCode';
12
12
  import { CloudXNativeAdViewContext, CloudXNativeAdViewProvider } from './CloudXNativeAdViewProvider';
@@ -59,18 +59,54 @@ const toLoadFailedInfo = (event: CloudXNativeAdLoadFailedEvent): CloudXAdLoadFai
59
59
  message: event.message || null,
60
60
  });
61
61
 
62
+ // Props that only mean something when the view loads its own ad. Passing one
63
+ // next to `nativeAd` is a type error, but plain-JS callers can still do it.
64
+ const AUTO_LOAD_ONLY_PROPS = [
65
+ 'adUnitId',
66
+ 'placement',
67
+ 'customData',
68
+ 'extraParameters',
69
+ 'localExtraParameters',
70
+ 'disableVideoFullScreen',
71
+ 'startVideoUnmuted',
72
+ 'hideVideoMediaControls',
73
+ 'onAdLoaded',
74
+ 'onAdLoadFailed',
75
+ 'onAdClicked',
76
+ 'onAdRevenuePaid',
77
+ 'onAdExpired',
78
+ 'onAdClosed',
79
+ ] as const;
80
+
62
81
  /**
63
82
  * Renders a native ad. Defaults to the SDK's bundled template layouts;
64
83
  * set `renderMode="manual"` to drive layout through the pre-built asset
65
84
  * components (`CloudXTitleView`, `CloudXMediaView`, etc.) instead.
66
85
  *
86
+ * Pass `adUnitId` and the view loads its own ad on attach. Pass `nativeAd`
87
+ * (from `CloudXNativeAd.load`) and it renders that ad instead, without
88
+ * loading or destroying it.
89
+ *
67
90
  * Manual mode is never inferred from the presence of children — `renderMode`
68
91
  * is always explicit so a publisher's intent is visible at the call site.
69
92
  */
70
- export const CloudXNativeAdView = forwardRef<CloudXNativeAdViewHandle, CloudXNativeAdViewProps>(
93
+ export const CloudXNativeAdView = forwardRef<CloudXNativeAdViewHandle, CloudXNativeAdViewComponentProps>(
71
94
  function CloudXNativeAdView(props, ref) {
72
95
  const { renderMode = 'template', style, testID, children } = props;
73
96
 
97
+ const warnedMixedProps = useRef(false);
98
+ if (__DEV__ && props.nativeAd && !warnedMixedProps.current) {
99
+ const ignored = AUTO_LOAD_ONLY_PROPS.filter((name) => Reflect.get(props, name) != null);
100
+ if (ignored.length > 0) {
101
+ warnedMixedProps.current = true;
102
+ console.warn(
103
+ `CloudXNativeAdView: ${ignored.join(', ')} ignored because nativeAd is set. ` +
104
+ 'Pass load options to CloudXNativeAd.load() and subscribe to clicks, revenue, ' +
105
+ 'expiry and close with nativeAd.addListener().'
106
+ );
107
+ }
108
+ }
109
+
74
110
  /*
75
111
  * Gate native ad-view creation on SDK initialization; shared with
76
112
  * CloudXAdViewBase (banner/MREC) via useCloudXSdkInitializationGate.
@@ -114,8 +150,11 @@ export const CloudXNativeAdView = forwardRef<CloudXNativeAdViewHandle, CloudXNat
114
150
  );
115
151
  }
116
152
 
153
+ // Keyed by the bound handle: swapping `nativeAd` remounts the provider
154
+ // and native view, so the previous ad's metadata and asset bindings
155
+ // can never be shown under the new ad's click and impression tracking.
117
156
  return (
118
- <CloudXNativeAdViewProvider onAssetRoleRegistered={handleAssetRoleRegistered}>
157
+ <CloudXNativeAdViewProvider key={props.nativeAd?.id} onAssetRoleRegistered={handleAssetRoleRegistered}>
119
158
  <CloudXNativeAdViewImpl {...props} ref={ref} />
120
159
  </CloudXNativeAdViewProvider>
121
160
  );
@@ -124,7 +163,7 @@ export const CloudXNativeAdView = forwardRef<CloudXNativeAdViewHandle, CloudXNat
124
163
 
125
164
  export default CloudXNativeAdView;
126
165
 
127
- const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNativeAdViewProps>(
166
+ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNativeAdViewComponentProps>(
128
167
  function CloudXNativeAdViewImpl(props, ref) {
129
168
  const {
130
169
  adUnitId,
@@ -137,8 +176,10 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
137
176
  extraParameters,
138
177
  localExtraParameters,
139
178
  renderMode = 'template',
179
+ nativeAd,
140
180
  onAdLoaded,
141
181
  onAdLoadFailed,
182
+ onAdDisplayed,
142
183
  onAdDisplayFailed,
143
184
  onAdClicked,
144
185
  onAdExpired,
@@ -151,6 +192,7 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
151
192
  } = props;
152
193
 
153
194
  const isManual = renderMode === 'manual';
195
+ const isPreloaded = nativeAd != null;
154
196
 
155
197
  const {
156
198
  setNativeAd,
@@ -175,12 +217,14 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
175
217
  const [bindTick, setBindTick] = useState(0);
176
218
 
177
219
  const loadAd = useCallback(() => {
178
- if (nativeRef.current) {
220
+ if (nativeRef.current && !isPreloaded) {
179
221
  Commands.loadAd(nativeRef.current);
180
222
  }
181
- }, []);
223
+ }, [isPreloaded]);
182
224
 
183
225
  const destroyAd = useCallback(() => {
226
+ // A preloaded ad belongs to its handle, not to this view.
227
+ if (isPreloaded) return;
184
228
  if (nativeRef.current) {
185
229
  Commands.destroyAd(nativeRef.current);
186
230
  }
@@ -189,7 +233,7 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
189
233
  pendingMetadata.current = null;
190
234
  lastAdInfoRef.current = null;
191
235
  setNativeAd(null);
192
- }, [setNativeAd]);
236
+ }, [isPreloaded, setNativeAd]);
193
237
 
194
238
  /**
195
239
  * Escape hatch for imperative control. The native view auto-loads on
@@ -222,15 +266,33 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
222
266
  const adInfo = toAdInfo(event.nativeEvent);
223
267
  lastAdInfoRef.current = adInfo;
224
268
 
225
- if (isManual && adInfo.nativeAd) {
226
- pendingMetadata.current = adInfo.nativeAd;
227
- setNativeAd(adInfo.nativeAd);
269
+ // A preloaded ad's metadata travelled with the handle, so a
270
+ // bind event that omits it still has assets to lay out.
271
+ const metadata = adInfo.nativeAd ?? nativeAd?.metadata ?? null;
272
+ if (isManual && metadata) {
273
+ pendingMetadata.current = metadata;
274
+ setNativeAd(metadata);
228
275
  setBindTick((n) => n + 1);
229
276
  }
230
277
 
231
278
  onAdLoaded?.(adInfo);
232
279
  },
233
- [isManual, setNativeAd, onAdLoaded]
280
+ [isManual, nativeAd, setNativeAd, onAdLoaded]
281
+ );
282
+
283
+ // Native released the preloaded ad this view showed (destroy, expiry,
284
+ // or a newer view took it). Its React-rendered text and images must
285
+ // go with it, and any asset binds still pending must stop. Silent:
286
+ // a transfer to another view is not a publisher lifecycle event.
287
+ const handleBindingCleared = useCallback(() => {
288
+ pendingMetadata.current = null;
289
+ lastAdInfoRef.current = null;
290
+ setNativeAd(null);
291
+ }, [setNativeAd]);
292
+
293
+ const handleAdDisplayed = useCallback(
294
+ (event: NativeSyntheticEvent<CloudXNativeAdInfoEvent>) => onAdDisplayed?.(toAdInfo(event.nativeEvent)),
295
+ [onAdDisplayed]
234
296
  );
235
297
 
236
298
  const handleAdLoadFailed = useCallback(
@@ -248,8 +310,10 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
248
310
  // failure if it describes the ad unit that actually failed. A
249
311
  // display failure arriving after a re-target would otherwise
250
312
  // report the previous unit's network, placement and revenue.
251
- const cached = lastAdInfoRef.current;
252
- const base = cached && cached.adUnitId === failedAdUnitId ? cached : null;
313
+ // A preloaded ad can fail before it ever rendered here (e.g. the
314
+ // handle was destroyed), so fall back to its load-time info.
315
+ const cached = lastAdInfoRef.current ?? nativeAd?.info ?? null;
316
+ const base = cached && (!failedAdUnitId || cached.adUnitId === failedAdUnitId) ? cached : null;
253
317
  const displayFailedInfo: CloudXAdDisplayFailedInfo = {
254
318
  // The event's own adUnitId is authoritative.
255
319
  adUnitId: failedAdUnitId || base?.adUnitId || '',
@@ -265,7 +329,7 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
265
329
  };
266
330
  onAdDisplayFailed(displayFailedInfo);
267
331
  },
268
- [onAdDisplayFailed]
332
+ [nativeAd, onAdDisplayFailed]
269
333
  );
270
334
 
271
335
  const handleAdClicked = useCallback(
@@ -392,7 +456,8 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
392
456
  ref={(r) => {
393
457
  nativeRef.current = r;
394
458
  }}
395
- adUnitId={adUnitId}
459
+ adUnitId={isPreloaded ? null : adUnitId}
460
+ nativeAdId={nativeAd?.id ?? null}
396
461
  templateName={template}
397
462
  placement={placement ?? null}
398
463
  customData={customData ?? null}
@@ -404,7 +469,9 @@ const CloudXNativeAdViewImpl = forwardRef<CloudXNativeAdViewHandle, CloudXNative
404
469
  manualRender={isManual}
405
470
  onAdLoadedEvent={handleAdLoaded}
406
471
  onAdLoadFailedEvent={handleAdLoadFailed}
472
+ onAdDisplayedEvent={handleAdDisplayed}
407
473
  onAdDisplayFailedEvent={handleAdDisplayFailed}
474
+ onAdBindingClearedEvent={handleBindingCleared}
408
475
  onAdClickedEvent={handleAdClicked}
409
476
  onAdExpiredEvent={handleAdExpired}
410
477
  onAdClosedEvent={handleAdClosed}