@thealteroffice/react-native-adgeist 0.0.20 → 0.0.22

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 (136) hide show
  1. package/Adgeist.podspec +1 -1
  2. package/README.md +70 -521
  3. package/android/build.gradle +6 -3
  4. package/android/generated/java/com/adgeist/NativeAdgeistSpec.java +11 -11
  5. package/android/generated/java/com/facebook/react/viewmanagers/HTML5AdNativeComponentManagerDelegate.java +55 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/HTML5AdNativeComponentManagerInterface.java +24 -0
  7. package/android/generated/jni/RNAdgeistSpec-generated.cpp +12 -12
  8. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/ComponentDescriptors.cpp +22 -0
  9. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/ComponentDescriptors.h +24 -0
  10. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/EventEmitters.cpp +60 -0
  11. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/EventEmitters.h +49 -0
  12. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/Props.cpp +28 -0
  13. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/Props.h +52 -0
  14. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/RNAdgeistSpecJSI-generated.cpp +14 -22
  15. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/RNAdgeistSpecJSI.h +36 -36
  16. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/ShadowNodes.cpp +17 -0
  17. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/ShadowNodes.h +32 -0
  18. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/States.cpp +16 -0
  19. package/android/generated/jni/react/renderer/components/RNAdgeistSpec/States.h +29 -0
  20. package/android/src/main/java/com/adgeist/AdgeistPackage.kt +8 -7
  21. package/android/src/main/java/com/adgeist/components/HTML5AdViewManagerImpl.kt +125 -0
  22. package/android/src/main/java/com/adgeist/modules/AdgeistImpl.kt +114 -0
  23. package/android/src/main/java/com/adgeist/utils/CreativeExtensions.kt +151 -0
  24. package/android/src/newarch/java/com/Adgeist.kt +119 -0
  25. package/android/src/newarch/java/com/HTML5AdViewManager.kt +77 -0
  26. package/android/src/oldarch/java/com/Adgeist.kt +132 -0
  27. package/android/src/oldarch/java/com/HTML5AdViewManager.kt +63 -0
  28. package/ios/Adgeist-Bridging-Header.h +3 -0
  29. package/ios/Adgeist.h +1 -1
  30. package/ios/Adgeist.mm +71 -65
  31. package/ios/AdgeistImpl.swift +127 -132
  32. package/ios/NativeHTML5AdManager.h +9 -0
  33. package/ios/NativeHTML5AdManager.mm +178 -0
  34. package/ios/NativeHTML5AdView.swift +136 -0
  35. package/ios/generated/RNAdgeistSpec/ComponentDescriptors.cpp +22 -0
  36. package/ios/generated/RNAdgeistSpec/ComponentDescriptors.h +24 -0
  37. package/ios/generated/RNAdgeistSpec/EventEmitters.cpp +60 -0
  38. package/ios/generated/RNAdgeistSpec/EventEmitters.h +49 -0
  39. package/ios/generated/RNAdgeistSpec/Props.cpp +28 -0
  40. package/ios/generated/RNAdgeistSpec/Props.h +52 -0
  41. package/ios/generated/RNAdgeistSpec/RCTComponentViewHelpers.h +65 -0
  42. package/ios/generated/RNAdgeistSpec/RNAdgeistSpec-generated.mm +17 -17
  43. package/ios/generated/RNAdgeistSpec/RNAdgeistSpec.h +17 -25
  44. package/ios/generated/RNAdgeistSpec/ShadowNodes.cpp +17 -0
  45. package/ios/generated/RNAdgeistSpec/ShadowNodes.h +32 -0
  46. package/ios/generated/RNAdgeistSpec/States.cpp +16 -0
  47. package/ios/generated/RNAdgeistSpec/States.h +29 -0
  48. package/ios/generated/RNAdgeistSpecJSI-generated.cpp +14 -22
  49. package/ios/generated/RNAdgeistSpecJSI.h +36 -36
  50. package/lib/module/cdpclient/index.js +1 -25
  51. package/lib/module/cdpclient/index.js.map +1 -1
  52. package/lib/module/components/HTML5AdView.js +128 -0
  53. package/lib/module/components/HTML5AdView.js.map +1 -0
  54. package/lib/module/components/{BannerAd.js → deprecated/BannerAdView.js} +50 -79
  55. package/lib/module/components/deprecated/BannerAdView.js.map +1 -0
  56. package/lib/module/components/{ConsentModal.js → deprecated/ConsentModal.js} +2 -2
  57. package/lib/module/components/deprecated/ConsentModal.js.map +1 -0
  58. package/lib/module/constants.js +14 -0
  59. package/lib/module/constants.js.map +1 -0
  60. package/lib/module/index.js +3 -2
  61. package/lib/module/index.js.map +1 -1
  62. package/lib/module/{components → providers}/AdgeistProvider.js +10 -35
  63. package/lib/module/providers/AdgeistProvider.js.map +1 -0
  64. package/lib/module/specs/HTML5AdNativeComponent.ts +46 -0
  65. package/lib/module/specs/NativeAdgeist.js.map +1 -0
  66. package/lib/module/types/AdSize.js +2 -0
  67. package/lib/module/types/AdSize.js.map +1 -0
  68. package/lib/module/types/CPMAdResponse.js +2 -0
  69. package/lib/module/types/CPMAdResponse.js.map +1 -0
  70. package/lib/module/types/FixedAdResponse.js +2 -0
  71. package/lib/module/types/FixedAdResponse.js.map +1 -0
  72. package/lib/module/types/HTML5AdNativeComponentProps.js +4 -0
  73. package/lib/module/types/HTML5AdNativeComponentProps.js.map +1 -0
  74. package/lib/module/types/Provider.js +2 -0
  75. package/lib/module/types/Provider.js.map +1 -0
  76. package/lib/typescript/src/cdpclient/index.d.ts +1 -21
  77. package/lib/typescript/src/cdpclient/index.d.ts.map +1 -1
  78. package/lib/typescript/src/components/HTML5AdView.d.ts +3 -0
  79. package/lib/typescript/src/components/HTML5AdView.d.ts.map +1 -0
  80. package/lib/typescript/src/components/deprecated/BannerAdView.d.ts +17 -0
  81. package/lib/typescript/src/components/deprecated/BannerAdView.d.ts.map +1 -0
  82. package/lib/typescript/src/components/deprecated/ConsentModal.d.ts.map +1 -0
  83. package/lib/typescript/src/constants.d.ts +10 -0
  84. package/lib/typescript/src/constants.d.ts.map +1 -0
  85. package/lib/typescript/src/index.d.ts +3 -2
  86. package/lib/typescript/src/index.d.ts.map +1 -1
  87. package/lib/typescript/src/providers/AdgeistProvider.d.ts +9 -0
  88. package/lib/typescript/src/providers/AdgeistProvider.d.ts.map +1 -0
  89. package/lib/typescript/src/specs/HTML5AdNativeComponent.d.ts +29 -0
  90. package/lib/typescript/src/specs/HTML5AdNativeComponent.d.ts.map +1 -0
  91. package/lib/typescript/src/specs/NativeAdgeist.d.ts +28 -0
  92. package/lib/typescript/src/specs/NativeAdgeist.d.ts.map +1 -0
  93. package/lib/typescript/src/types/AdSize.d.ts +5 -0
  94. package/lib/typescript/src/types/AdSize.d.ts.map +1 -0
  95. package/lib/typescript/src/types/CPMAdResponse.d.ts +25 -0
  96. package/lib/typescript/src/types/CPMAdResponse.d.ts.map +1 -0
  97. package/lib/typescript/src/types/FixedAdResponse.d.ts +50 -0
  98. package/lib/typescript/src/types/FixedAdResponse.d.ts.map +1 -0
  99. package/lib/typescript/src/types/HTML5AdNativeComponentProps.d.ts +24 -0
  100. package/lib/typescript/src/types/HTML5AdNativeComponentProps.d.ts.map +1 -0
  101. package/lib/typescript/src/types/Provider.d.ts +16 -0
  102. package/lib/typescript/src/types/Provider.d.ts.map +1 -0
  103. package/package.json +8 -3
  104. package/react-native.config.js +1 -1
  105. package/src/cdpclient/index.ts +1 -21
  106. package/src/components/HTML5AdView.tsx +161 -0
  107. package/src/components/{BannerAd.tsx → deprecated/BannerAdView.tsx} +80 -115
  108. package/src/components/{ConsentModal.tsx → deprecated/ConsentModal.tsx} +2 -2
  109. package/src/constants.ts +8 -0
  110. package/src/index.tsx +4 -2
  111. package/src/{components → providers}/AdgeistProvider.tsx +26 -60
  112. package/src/specs/HTML5AdNativeComponent.ts +46 -0
  113. package/src/{NativeAdgeist.ts → specs/NativeAdgeist.ts} +26 -25
  114. package/src/types/AdSize.ts +4 -0
  115. package/src/types/CPMAdResponse.ts +26 -0
  116. package/src/types/FixedAdResponse.ts +51 -0
  117. package/src/types/HTML5AdNativeComponentProps.ts +28 -0
  118. package/src/types/Provider.ts +16 -0
  119. package/android/src/main/AndroidManifestNew.xml +0 -2
  120. package/android/src/main/java/com/adgeist/implementation/AdgeistModuleImpl.kt +0 -252
  121. package/android/src/newarch/java/com/AdgeistModule.kt +0 -135
  122. package/android/src/oldarch/java/com/AdgeistModule.kt +0 -148
  123. package/ios/adgeist-Bridging-Header.h +0 -1
  124. package/lib/module/NativeAdgeist.js.map +0 -1
  125. package/lib/module/components/AdgeistProvider.js.map +0 -1
  126. package/lib/module/components/BannerAd.js.map +0 -1
  127. package/lib/module/components/ConsentModal.js.map +0 -1
  128. package/lib/typescript/src/NativeAdgeist.d.ts +0 -28
  129. package/lib/typescript/src/NativeAdgeist.d.ts.map +0 -1
  130. package/lib/typescript/src/components/AdgeistProvider.d.ts +0 -50
  131. package/lib/typescript/src/components/AdgeistProvider.d.ts.map +0 -1
  132. package/lib/typescript/src/components/BannerAd.d.ts +0 -64
  133. package/lib/typescript/src/components/BannerAd.d.ts.map +0 -1
  134. package/lib/typescript/src/components/ConsentModal.d.ts.map +0 -1
  135. /package/lib/module/{NativeAdgeist.js → specs/NativeAdgeist.js} +0 -0
  136. /package/lib/typescript/src/components/{ConsentModal.d.ts → deprecated/ConsentModal.d.ts} +0 -0
@@ -8,25 +8,35 @@ import React
8
8
  private var postCreativeAnalytic: CreativeAnalytics?
9
9
 
10
10
  @objc public func initializeSdk(
11
- customDomain: String?,
11
+ customBidRequestBackendDomain: String?,
12
+ customPackageOrBundleID: String?,
13
+ customAdgeistAppID: String?,
12
14
  resolver: @escaping RCTPromiseResolveBlock,
13
15
  rejecter: @escaping RCTPromiseRejectBlock
14
16
  ) {
15
17
  do {
16
- adgeistInstance = AdgeistCore.initialize(customDomain: customDomain ?? "bg-services-api.adgeist.ai")
18
+ adgeistInstance = AdgeistCore.initialize(customBidRequestBackendDomain: customBidRequestBackendDomain,
19
+ customPackageOrBundleID: customPackageOrBundleID,
20
+ customAdgeistAppID: customAdgeistAppID)
17
21
  getAd = adgeistInstance?.getCreative()
18
22
  postCreativeAnalytic = adgeistInstance?.postCreativeAnalytics()
19
- resolver("SDK initialized with domain: \(customDomain ?? "default")")
23
+ resolver("SDK initialized with domain: \(customBidRequestBackendDomain ?? "default")")
20
24
  } catch {
21
25
  rejecter("INIT_FAILED", "SDK initialization failed", error)
22
26
  }
23
27
  }
24
28
 
29
+ @objc public func destroySdk(
30
+ resolver: @escaping RCTPromiseResolveBlock,
31
+ rejecter: @escaping RCTPromiseRejectBlock
32
+ ) {
33
+ AdgeistCore.destroy()
34
+ resolver("SDK destroyed")
35
+ }
36
+
25
37
  @objc public func fetchCreative(
26
- apiKey: String,
27
- origin: String,
28
38
  adSpaceId: String,
29
- publisherId: String,
39
+ buyType: String,
30
40
  isTestEnvironment: Bool,
31
41
  resolver: @escaping RCTPromiseResolveBlock,
32
42
  rejecter: @escaping RCTPromiseRejectBlock
@@ -37,24 +47,22 @@ import React
37
47
  }
38
48
 
39
49
  getAd.fetchCreative(
40
- apiKey: apiKey,
41
- origin: origin,
42
- adSpaceId: adSpaceId,
43
- companyId: publisherId,
50
+ adUnitID: adSpaceId,
51
+ buyType: buyType,
44
52
  isTestEnvironment: isTestEnvironment
45
53
  ) { creativeData in
46
54
  if let creativeData = creativeData {
47
- do {
48
- let encoder = JSONEncoder()
49
- let data = try encoder.encode(creativeData)
50
- if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
51
- resolver(json)
52
- } else {
53
- rejecter("JSON_ERROR", "Failed to convert ad data to JSON", nil)
55
+ var result: [String: Any] = [:]
56
+
57
+ // Use Mirror to reflect the object's properties
58
+ let mirror = Mirror(reflecting: creativeData)
59
+ for child in mirror.children {
60
+ if let label = child.label {
61
+ result[label] = child.value
54
62
  }
55
- } catch {
56
- rejecter("JSON_ERROR", "Failed to encode ad data", error)
57
63
  }
64
+
65
+ resolver(result)
58
66
  } else {
59
67
  rejecter("NO_AD", "Ad data not available", nil)
60
68
  }
@@ -109,180 +117,167 @@ import React
109
117
  adgeistInstance?.logEvent(event)
110
118
  }
111
119
 
120
+ public func sendCreativeAnalytics(
121
+ analyticsRequest: AnalyticsRequestDEPRECATED,
122
+ resolver: @escaping RCTPromiseResolveBlock,
123
+ rejecter: @escaping RCTPromiseRejectBlock
124
+ ) {
125
+ postCreativeAnalytic?.sendTrackingData(analyticsRequestDEPRECATED: analyticsRequest)
126
+ resolver("Event sent successfully")
127
+ }
128
+
112
129
  @objc public func trackImpression(
113
130
  campaignId: String,
114
131
  adSpaceId: String,
115
- publisherId: String,
116
- apiKey: String,
117
132
  bidId: String,
133
+ bidMeta: String,
134
+ buyType: String,
118
135
  isTestEnvironment: Bool,
119
- renderTime: Double,
136
+ renderTime: Float,
120
137
  resolver: @escaping RCTPromiseResolveBlock,
121
138
  rejecter: @escaping RCTPromiseRejectBlock
122
139
  ) {
123
- guard let postCreativeAnalytic = postCreativeAnalytic else {
124
- rejecter("SDK_NOT_INITIALIZED", "SDK not initialized. Call initializeSdk() first.", nil)
125
- return
140
+ var builder = AnalyticsRequestDEPRECATED.AnalyticsRequestBuilderDEPRECATED(adUnitID: adSpaceId, isTestMode: isTestEnvironment)
141
+
142
+ let upperBuyType = buyType.uppercased()
143
+ if upperBuyType == "CPM" {
144
+ builder = builder.buildCPMRequest(campaignID: campaignId, bidID: bidId)
145
+ } else if upperBuyType == "FIXED" {
146
+ builder = builder.buildFIXEDRequest(metaData: bidMeta)
126
147
  }
127
148
 
128
- postCreativeAnalytic.trackImpression(
129
- campaignId: campaignId,
130
- adSpaceId: adSpaceId,
131
- publisherId: publisherId,
132
- apiKey: apiKey,
133
- bidId: bidId,
134
- isTestEnvironment: isTestEnvironment,
135
- renderTime: Float(renderTime)
136
- )
137
- resolver("Impression event sent")
149
+ let request = builder.trackImpression(renderTime: renderTime).build()
150
+ sendCreativeAnalytics(analyticsRequest: request, resolver: resolver, rejecter: rejecter)
138
151
  }
139
152
 
140
153
  @objc public func trackView(
141
154
  campaignId: String,
142
155
  adSpaceId: String,
143
- publisherId: String,
144
- apiKey: String,
145
156
  bidId: String,
157
+ bidMeta: String,
158
+ buyType: String,
146
159
  isTestEnvironment: Bool,
147
- viewTime: Double,
148
- visibilityRatio: Double,
149
- scrollDepth: Double,
150
- timeToVisible: Double,
160
+ viewTime: Float,
161
+ visibilityRatio: Float,
162
+ scrollDepth: Float,
163
+ timeToVisible: Float,
151
164
  resolver: @escaping RCTPromiseResolveBlock,
152
165
  rejecter: @escaping RCTPromiseRejectBlock
153
166
  ) {
154
- guard let postCreativeAnalytic = postCreativeAnalytic else {
155
- rejecter("SDK_NOT_INITIALIZED", "SDK not initialized. Call initializeSdk() first.", nil)
156
- return
167
+ var builder = AnalyticsRequestDEPRECATED.AnalyticsRequestBuilderDEPRECATED(adUnitID: adSpaceId, isTestMode: isTestEnvironment)
168
+
169
+ let upperBuyType = buyType.uppercased()
170
+ if upperBuyType == "CPM" {
171
+ builder = builder.buildCPMRequest(campaignID: campaignId, bidID: bidId)
172
+ } else if upperBuyType == "FIXED" {
173
+ builder = builder.buildFIXEDRequest(metaData: bidMeta)
157
174
  }
158
175
 
159
- postCreativeAnalytic.trackView(
160
- campaignId: campaignId,
161
- adSpaceId: adSpaceId,
162
- publisherId: publisherId,
163
- apiKey: apiKey,
164
- bidId: bidId,
165
- isTestEnvironment: isTestEnvironment,
166
- viewTime: Float(viewTime),
167
- visibilityRatio: Float(visibilityRatio),
168
- scrollDepth: Float(scrollDepth),
169
- timeToVisible: Float(timeToVisible)
170
- )
171
- resolver("View event sent")
176
+ let request = builder.trackViewableImpression(
177
+ timeToVisible: timeToVisible,
178
+ scrollDepth: scrollDepth,
179
+ visibilityRatio: visibilityRatio,
180
+ viewTime: viewTime
181
+ ).build()
182
+ sendCreativeAnalytics(analyticsRequest: request, resolver: resolver, rejecter: rejecter)
172
183
  }
173
184
 
174
185
  @objc public func trackTotalView(
175
186
  campaignId: String,
176
187
  adSpaceId: String,
177
- publisherId: String,
178
- apiKey: String,
179
188
  bidId: String,
189
+ bidMeta: String,
190
+ buyType: String,
180
191
  isTestEnvironment: Bool,
181
- totalViewTime: Double,
182
- visibilityRatio: Double,
192
+ totalViewTime: Float,
193
+ visibilityRatio: Float,
183
194
  resolver: @escaping RCTPromiseResolveBlock,
184
195
  rejecter: @escaping RCTPromiseRejectBlock
185
196
  ) {
186
- guard let postCreativeAnalytic = postCreativeAnalytic else {
187
- rejecter("SDK_NOT_INITIALIZED", "SDK not initialized. Call initializeSdk() first.", nil)
188
- return
197
+ var builder = AnalyticsRequestDEPRECATED.AnalyticsRequestBuilderDEPRECATED(adUnitID: adSpaceId, isTestMode: isTestEnvironment)
198
+
199
+ let upperBuyType = buyType.uppercased()
200
+ if upperBuyType == "CPM" {
201
+ builder = builder.buildCPMRequest(campaignID: campaignId, bidID: bidId)
202
+ } else if upperBuyType == "FIXED" {
203
+ builder = builder.buildFIXEDRequest(metaData: bidMeta)
189
204
  }
190
205
 
191
- postCreativeAnalytic.trackTotalView(
192
- campaignId: campaignId,
193
- adSpaceId: adSpaceId,
194
- publisherId: publisherId,
195
- apiKey: apiKey,
196
- bidId: bidId,
197
- isTestEnvironment: isTestEnvironment,
198
- totalViewTime: Float(totalViewTime),
199
- visibilityRatio: Float(visibilityRatio)
200
- )
201
- resolver("Total view event sent")
206
+ let request = builder.trackTotalViewTime(totalViewTime: totalViewTime).build()
207
+ sendCreativeAnalytics(analyticsRequest: request, resolver: resolver, rejecter: rejecter)
202
208
  }
203
209
 
204
210
  @objc public func trackClick(
205
211
  campaignId: String,
206
212
  adSpaceId: String,
207
- publisherId: String,
208
- apiKey: String,
209
213
  bidId: String,
214
+ bidMeta: String,
215
+ buyType: String,
210
216
  isTestEnvironment: Bool,
211
217
  resolver: @escaping RCTPromiseResolveBlock,
212
218
  rejecter: @escaping RCTPromiseRejectBlock
213
219
  ) {
214
- guard let postCreativeAnalytic = postCreativeAnalytic else {
215
- rejecter("SDK_NOT_INITIALIZED", "SDK not initialized. Call initializeSdk() first.", nil)
216
- return
220
+ var builder = AnalyticsRequestDEPRECATED.AnalyticsRequestBuilderDEPRECATED(adUnitID: adSpaceId, isTestMode: isTestEnvironment)
221
+
222
+ let upperBuyType = buyType.uppercased()
223
+ if upperBuyType == "CPM" {
224
+ builder = builder.buildCPMRequest(campaignID: campaignId, bidID: bidId)
225
+ } else if upperBuyType == "FIXED" {
226
+ builder = builder.buildFIXEDRequest(metaData: bidMeta)
217
227
  }
218
228
 
219
- postCreativeAnalytic.trackClick(
220
- campaignId: campaignId,
221
- adSpaceId: adSpaceId,
222
- publisherId: publisherId,
223
- apiKey: apiKey,
224
- bidId: bidId,
225
- isTestEnvironment: isTestEnvironment
226
- )
227
- resolver("Click event sent")
229
+ let request = builder.trackClick().build()
230
+ sendCreativeAnalytics(analyticsRequest: request, resolver: resolver, rejecter: rejecter)
228
231
  }
229
232
 
230
233
  @objc public func trackVideoPlayback(
231
234
  campaignId: String,
232
235
  adSpaceId: String,
233
- publisherId: String,
234
- apiKey: String,
235
236
  bidId: String,
237
+ bidMeta: String,
238
+ buyType: String,
236
239
  isTestEnvironment: Bool,
237
- totalPlaybackTime: Double,
240
+ totalPlaybackTime: Float,
238
241
  resolver: @escaping RCTPromiseResolveBlock,
239
242
  rejecter: @escaping RCTPromiseRejectBlock
240
243
  ) {
241
- guard let postCreativeAnalytic = postCreativeAnalytic else {
242
- rejecter("SDK_NOT_INITIALIZED", "SDK not initialized. Call initializeSdk() first.", nil)
243
- return
244
- }
244
+ var builder = AnalyticsRequestDEPRECATED.AnalyticsRequestBuilderDEPRECATED(adUnitID: adSpaceId, isTestMode: isTestEnvironment)
245
245
 
246
- postCreativeAnalytic.trackVideoPlayback(
247
- campaignId: campaignId,
248
- adSpaceId: adSpaceId,
249
- publisherId: publisherId,
250
- apiKey: apiKey,
251
- bidId: bidId,
252
- isTestEnvironment: isTestEnvironment,
253
- totalPlaybackTime: Float(totalPlaybackTime)
254
- )
255
- resolver("Video playback event sent")
256
- }
257
-
258
- @objc public func trackVideoQuartile(
259
- campaignId: String,
260
- adSpaceId: String,
261
- publisherId: String,
262
- apiKey: String,
263
- bidId: String,
264
- isTestEnvironment: Bool,
265
- quartile: String,
266
- resolver: @escaping RCTPromiseResolveBlock,
267
- rejecter: @escaping RCTPromiseRejectBlock
268
- ) {
269
- guard let postCreativeAnalytic = postCreativeAnalytic else {
270
- rejecter("SDK_NOT_INITIALIZED", "SDK not initialized. Call initializeSdk() first.", nil)
271
- return
246
+ let upperBuyType = buyType.uppercased()
247
+ if upperBuyType == "CPM" {
248
+ builder = builder.buildCPMRequest(campaignID: campaignId, bidID: bidId)
249
+ } else if upperBuyType == "FIXED" {
250
+ builder = builder.buildFIXEDRequest(metaData: bidMeta)
272
251
  }
273
252
 
274
- postCreativeAnalytic.trackVideoQuartile(
275
- campaignId: campaignId,
276
- adSpaceId: adSpaceId,
277
- publisherId: publisherId,
278
- apiKey: apiKey,
279
- bidId: bidId,
280
- isTestEnvironment: isTestEnvironment,
281
- quartile: quartile
282
- )
283
- resolver("Video quartile event sent")
253
+ let request = builder.trackTotalPlaybackTime(totalPlaybackTime: totalPlaybackTime).build()
254
+ sendCreativeAnalytics(analyticsRequest: request, resolver: resolver, rejecter: rejecter)
284
255
  }
285
256
 
257
+ // @objc public func trackVideoQuartile(
258
+ // campaignId: String,
259
+ // adSpaceId: String,
260
+ // bidId: String,
261
+ // bidMeta: String,
262
+ // buyType: String,
263
+ // isTestEnvironment: Bool,
264
+ // quartile: String,
265
+ // resolver: @escaping RCTPromiseResolveBlock,
266
+ // rejecter: @escaping RCTPromiseRejectBlock
267
+ // ) {
268
+ // var builder = AnalyticsRequestDEPRECATED.AnalyticsRequestBuilderDEPRECATED(adUnitID: adSpaceId, isTestMode: isTestEnvironment)
269
+ //
270
+ // let upperBuyType = buyType.uppercased()
271
+ // if upperBuyType == "CPM" {
272
+ // builder = builder.buildCPMRequest(campaignID: campaignId, bidID: bidId)
273
+ // } else if upperBuyType == "FIXED" {
274
+ // builder = builder.buildFIXEDRequest(metaData: bidMeta)
275
+ // }
276
+ //
277
+ // let request = builder.trackVideoQuartile(quartile: quartile).build()
278
+ // sendCreativeAnalytics(analyticsRequest: request, resolver: resolver, rejecter: rejecter)
279
+ // }
280
+
286
281
  @objc public static func requiresMainQueueSetup() -> Bool {
287
282
  return true
288
283
  }
@@ -0,0 +1,9 @@
1
+ #import <React/RCTViewComponentView.h>
2
+ #import <UIKit/UIKit.h>
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
6
+ @interface RCTNativeHTML5AdManager : RCTViewComponentView
7
+ @end
8
+
9
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,178 @@
1
+ #import "NativeHTML5AdManager.h"
2
+
3
+ #import <React/RCTFabricComponentsPlugins.h>
4
+ #import <React/RCTConversions.h>
5
+ #import <React/RCTBridgeModule.h>
6
+
7
+ // Swift → ObjC header
8
+ #if __has_include("Adgeist-Swift.h")
9
+ #import "Adgeist-Swift.h"
10
+ #elif __has_include(<adgeist/adgeist-Swift.h>)
11
+ #import <Adgeist/Adgeist-Swift.h>
12
+ #else
13
+ @import adgeist;
14
+ #endif
15
+
16
+ #import "generated/RNAdgeistSpec/ComponentDescriptors.h"
17
+ #import "generated/RNAdgeistSpec/EventEmitters.h"
18
+ #import "generated/RNAdgeistSpec/Props.h"
19
+ #import "generated/RNAdgeistSpec/RCTComponentViewHelpers.h"
20
+
21
+ using namespace facebook::react;
22
+
23
+ @interface RCTNativeHTML5AdManager () <RCTHTML5AdNativeComponentViewProtocol, NativeHTML5AdDelegate>
24
+ @end
25
+
26
+ @implementation RCTNativeHTML5AdManager {
27
+ NativeHTML5AdView *_swiftView;
28
+ }
29
+
30
+ - (instancetype)init
31
+ {
32
+ if (self = [super init]) {
33
+ _swiftView = [[NativeHTML5AdView alloc] initWithFrame:CGRectZero];
34
+ _swiftView.delegate = self;
35
+ [self addSubview:_swiftView];
36
+ }
37
+ return self;
38
+ }
39
+
40
+ - (void)dealloc
41
+ {
42
+ _swiftView.delegate = nil;
43
+ [_swiftView destroy];
44
+ }
45
+
46
+ - (void)prepareForRecycle
47
+ {
48
+ [super prepareForRecycle];
49
+ [_swiftView destroy];
50
+ }
51
+
52
+ - (void)layoutSubviews
53
+ {
54
+ [super layoutSubviews];
55
+ _swiftView.frame = self.bounds;
56
+ }
57
+
58
+ - (void)didMoveToSuperview
59
+ {
60
+ [super didMoveToSuperview];
61
+ if (self.superview) {
62
+ [_swiftView triggerViewWillAppear];
63
+ }
64
+ }
65
+
66
+ - (void)updateProps:(const facebook::react::Props::Shared &)props
67
+ oldProps:(const facebook::react::Props::Shared &)oldProps
68
+ {
69
+ const auto &newProps = *std::static_pointer_cast<const HTML5AdNativeComponentProps>(props);
70
+
71
+ // Create a default old props if null (without parsing)
72
+ HTML5AdNativeComponentProps defaultOldProps;
73
+ const HTML5AdNativeComponentProps &oldPropsStruct = oldProps
74
+ ? *std::static_pointer_cast<const HTML5AdNativeComponentProps>(oldProps)
75
+ : defaultOldProps;
76
+
77
+ if (oldPropsStruct.adUnitID != newProps.adUnitID) {
78
+ _swiftView.adUnitID = newProps.adUnitID.empty()
79
+ ? nil
80
+ : [NSString stringWithUTF8String:newProps.adUnitID.c_str()];
81
+ }
82
+
83
+ if (oldPropsStruct.adIsResponsive != newProps.adIsResponsive) {
84
+ _swiftView.adIsResponsive = newProps.adIsResponsive;
85
+ }
86
+
87
+ if (oldPropsStruct.adSize.width != newProps.adSize.width ||
88
+ oldPropsStruct.adSize.height != newProps.adSize.height) {
89
+
90
+ NSMutableDictionary *dict = [NSMutableDictionary dictionary];
91
+ if (newProps.adSize.width != 0.0) {
92
+ dict[@"width"] = @(newProps.adSize.width);
93
+ }
94
+ if (newProps.adSize.height != 0.0) {
95
+ dict[@"height"] = @(newProps.adSize.height);
96
+ }
97
+ _swiftView.adSize = dict.count > 0 ? dict : nil;
98
+
99
+ if (_swiftView.adUnitID != nil) {
100
+ [_swiftView reloadAd];
101
+ }
102
+ }
103
+
104
+ if (oldPropsStruct.adType != newProps.adType) {
105
+ _swiftView.adType = newProps.adType.empty()
106
+ ? nil
107
+ : [NSString stringWithUTF8String:newProps.adType.c_str()];
108
+ }
109
+
110
+ [super updateProps:props oldProps:oldProps];
111
+ }
112
+
113
+ - (void)onAdLoaded
114
+ {
115
+ if (_eventEmitter) {
116
+ std::static_pointer_cast<const HTML5AdNativeComponentEventEmitter>(_eventEmitter)
117
+ ->onAdLoaded(HTML5AdNativeComponentEventEmitter::OnAdLoaded{});
118
+ }
119
+ }
120
+
121
+ - (void)onAdFailedToLoad:(NSString *)error
122
+ {
123
+ if (_eventEmitter) {
124
+ HTML5AdNativeComponentEventEmitter::OnAdFailedToLoad event{};
125
+ event.error = error ? std::string([error UTF8String]) : "";
126
+ std::static_pointer_cast<const HTML5AdNativeComponentEventEmitter>(_eventEmitter)
127
+ ->onAdFailedToLoad(event);
128
+ }
129
+ }
130
+
131
+ - (void)onAdOpened
132
+ {
133
+ if (_eventEmitter) {
134
+ std::static_pointer_cast<const HTML5AdNativeComponentEventEmitter>(_eventEmitter)
135
+ ->onAdOpened(HTML5AdNativeComponentEventEmitter::OnAdOpened{});
136
+ }
137
+ }
138
+
139
+ - (void)onAdClosed
140
+ {
141
+ if (_eventEmitter) {
142
+ std::static_pointer_cast<const HTML5AdNativeComponentEventEmitter>(_eventEmitter)
143
+ ->onAdClosed(HTML5AdNativeComponentEventEmitter::OnAdClosed{});
144
+ }
145
+ }
146
+
147
+ - (void)onAdClicked
148
+ {
149
+ if (_eventEmitter) {
150
+ std::static_pointer_cast<const HTML5AdNativeComponentEventEmitter>(_eventEmitter)
151
+ ->onAdClicked(HTML5AdNativeComponentEventEmitter::OnAdClicked{});
152
+ }
153
+ }
154
+
155
+
156
+ - (void)handleCommand:(NSString const *)commandName args:(NSArray const *)args
157
+ {
158
+ RCTHTML5AdNativeComponentHandleCommand(self, commandName, args);
159
+ }
160
+
161
+ - (void)loadAd:(BOOL)isTestMode
162
+ {
163
+ NSMutableDictionary *dict = [NSMutableDictionary dictionary];
164
+ dict[@"isTestMode"] = @(isTestMode);
165
+ [_swiftView loadAd:dict];
166
+ }
167
+
168
+ - (void)destroy
169
+ {
170
+ [_swiftView destroy];
171
+ }
172
+
173
+ + (ComponentDescriptorProvider)componentDescriptorProvider
174
+ {
175
+ return concreteComponentDescriptorProvider<HTML5AdNativeComponentComponentDescriptor>();
176
+ }
177
+
178
+ @end
@@ -0,0 +1,136 @@
1
+ import UIKit
2
+ import AdgeistKit
3
+ import React
4
+
5
+ // MARK: - Delegate Protocol (Objective-C compatible)
6
+ @objc public protocol NativeHTML5AdDelegate: NSObjectProtocol {
7
+ @objc func onAdLoaded()
8
+ @objc(onAdFailedToLoad:) func onAdFailedToLoad(error: String)
9
+ @objc func onAdOpened()
10
+ @objc func onAdClosed()
11
+ @objc func onAdClicked()
12
+ }
13
+
14
+ // MARK: - Main Swift View (Exposed to Objective-C++)
15
+ @objc(NativeHTML5AdView)
16
+ @objcMembers
17
+ public class NativeHTML5AdView: UIView {
18
+
19
+ // MARK: Public Props (accessible from .mm)
20
+ @objc public var adUnitID: String?
21
+ @objc public var adSize: NSDictionary?
22
+ @objc public var adType: String?
23
+ @objc public var adIsResponsive: Bool = false
24
+
25
+ // MARK: Delegate (used to send events back to Fabric manager)
26
+ @objc public weak var delegate: NativeHTML5AdDelegate?
27
+
28
+ // MARK: Private Ad View & Listener
29
+ private var adView: AdView?
30
+ private var adListener: NativeHTML5AdListener?
31
+ private var isTestMode: Bool = false
32
+
33
+ public override init(frame: CGRect) {
34
+ super.init(frame: frame)
35
+ backgroundColor = .clear
36
+ }
37
+
38
+ @available(*, unavailable)
39
+ required init?(coder: NSCoder) {
40
+ fatalError("init(coder:) has not been implemented")
41
+ }
42
+
43
+ public override func layoutSubviews() {
44
+ super.layoutSubviews()
45
+ }
46
+
47
+ @objc public func triggerViewWillAppear() {
48
+ // adView?.resume()
49
+ }
50
+
51
+ @objc public func reloadAd() {
52
+ cleanupAdView()
53
+ embedAdView()
54
+ setNeedsLayout()
55
+ }
56
+
57
+ @objc public func loadAd(_ options: NSDictionary) {
58
+ if let testMode = options["isTestMode"] as? Bool {
59
+ self.isTestMode = testMode
60
+ }
61
+ reloadAd()
62
+ }
63
+
64
+ @objc public func destroy() {
65
+ cleanupAdView()
66
+ }
67
+
68
+ private func cleanupAdView() {
69
+ adView?.destroy()
70
+ adView?.removeFromSuperview()
71
+ adView = nil
72
+ adListener = nil
73
+ }
74
+
75
+ private func embedAdView() {
76
+ guard let adUnitID = adUnitID else {
77
+ delegate?.onAdFailedToLoad(error: "Ad unit ID is required")
78
+ return
79
+ }
80
+
81
+ let adView = AdView()
82
+ adView.frame = bounds
83
+ adView.adUnitId = adUnitID
84
+ adView.adIsResposive = adIsResponsive
85
+
86
+ if let dict = adSize as? [String: Any] {
87
+ if let w = dict["width"] as? Int, let h = dict["height"] as? Int {
88
+ adView.setAdDimension(AdSize(width: w, height: h))
89
+ }
90
+ }
91
+
92
+ if let adType = adType { adView.adType = adType }
93
+
94
+ let listener = NativeHTML5AdListener(view: self)
95
+ self.adListener = listener
96
+ adView.setAdListener(listener)
97
+
98
+ self.adView = adView
99
+ addSubview(adView)
100
+
101
+ let request = AdRequest.AdRequestBuilder()
102
+ .setTestMode(self.isTestMode)
103
+ .build()
104
+ adView.loadAd(request)
105
+ }
106
+ }
107
+
108
+ // MARK: - Ad Listener (Bridge to delegate)
109
+ private class NativeHTML5AdListener: AdListener {
110
+ private weak var view: NativeHTML5AdView?
111
+
112
+ init(view: NativeHTML5AdView) {
113
+ self.view = view
114
+ super.init()
115
+ }
116
+
117
+ override func onAdLoaded() {
118
+ view?.delegate?.onAdLoaded()
119
+ }
120
+
121
+ override func onAdFailedToLoad(_ errorMessage: String) {
122
+ view?.delegate?.onAdFailedToLoad(error: errorMessage)
123
+ }
124
+
125
+ override func onAdClicked() {
126
+ view?.delegate?.onAdClicked()
127
+ }
128
+
129
+ override func onAdImpression() {
130
+ view?.delegate?.onAdOpened()
131
+ }
132
+
133
+ override func onAdClosed() {
134
+ view?.delegate?.onAdClosed()
135
+ }
136
+ }