@bigcrunch/react-native-ads 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +417 -0
  2. package/android/build.gradle +70 -0
  3. package/android/settings.gradle +6 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchAdsModule.kt +653 -0
  6. package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchAdsPackage.kt +20 -0
  7. package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchBannerViewManager.kt +296 -0
  8. package/ios/BigCrunchAdsModule.swift +588 -0
  9. package/ios/BigCrunchBannerViewManager.swift +270 -0
  10. package/ios/react-native-bigcrunch-ads-Bridging-Header.h +8 -0
  11. package/lib/BigCrunchAds.d.ts +168 -0
  12. package/lib/BigCrunchAds.d.ts.map +1 -0
  13. package/lib/BigCrunchAds.js +241 -0
  14. package/lib/BigCrunchBannerView.d.ts +21 -0
  15. package/lib/BigCrunchBannerView.d.ts.map +1 -0
  16. package/lib/BigCrunchBannerView.js +176 -0
  17. package/lib/BigCrunchInterstitial.d.ts +66 -0
  18. package/lib/BigCrunchInterstitial.d.ts.map +1 -0
  19. package/lib/BigCrunchInterstitial.js +222 -0
  20. package/lib/BigCrunchRewarded.d.ts +85 -0
  21. package/lib/BigCrunchRewarded.d.ts.map +1 -0
  22. package/lib/BigCrunchRewarded.js +257 -0
  23. package/lib/NativeBigCrunchAds.d.ts +71 -0
  24. package/lib/NativeBigCrunchAds.d.ts.map +1 -0
  25. package/lib/NativeBigCrunchAds.js +54 -0
  26. package/lib/index.d.ts +28 -0
  27. package/lib/index.d.ts.map +1 -0
  28. package/lib/index.js +32 -0
  29. package/lib/types/ads.d.ts +101 -0
  30. package/lib/types/ads.d.ts.map +1 -0
  31. package/lib/types/ads.js +4 -0
  32. package/lib/types/config.d.ts +137 -0
  33. package/lib/types/config.d.ts.map +1 -0
  34. package/lib/types/config.js +4 -0
  35. package/lib/types/events.d.ts +306 -0
  36. package/lib/types/events.d.ts.map +1 -0
  37. package/lib/types/events.js +4 -0
  38. package/lib/types/index.d.ts +175 -0
  39. package/lib/types/index.d.ts.map +1 -0
  40. package/lib/types/index.js +23 -0
  41. package/package.json +88 -0
  42. package/react-native-bigcrunch-ads.podspec +27 -0
  43. package/src/BigCrunchAds.ts +298 -0
  44. package/src/BigCrunchBannerView.tsx +262 -0
  45. package/src/BigCrunchInterstitial.ts +266 -0
  46. package/src/BigCrunchRewarded.ts +307 -0
  47. package/src/NativeBigCrunchAds.ts +120 -0
  48. package/src/index.ts +71 -0
  49. package/src/types/ads.ts +112 -0
  50. package/src/types/config.ts +145 -0
  51. package/src/types/events.ts +337 -0
  52. package/src/types/index.ts +193 -0
@@ -0,0 +1,296 @@
1
+ package com.bigcrunch.ads.react
2
+
3
+ import android.view.View
4
+ import com.facebook.react.bridge.*
5
+ import com.facebook.react.modules.core.DeviceEventManagerModule
6
+ import com.facebook.react.uimanager.SimpleViewManager
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.annotations.ReactProp
9
+ import com.bigcrunch.ads.BigCrunchAds
10
+ import com.bigcrunch.ads.BigCrunchBannerView
11
+ import com.bigcrunch.ads.listeners.BannerAdListener
12
+ import com.bigcrunch.ads.models.AdSize
13
+ import kotlinx.coroutines.*
14
+
15
+ /**
16
+ * View manager for BigCrunchBannerView React Native component
17
+ */
18
+ class BigCrunchBannerViewManager : SimpleViewManager<BigCrunchBannerView>() {
19
+
20
+ companion object {
21
+ const val REACT_CLASS = "BigCrunchBannerView"
22
+
23
+ // Commands
24
+ const val COMMAND_LOAD_AD = 1
25
+ const val COMMAND_PAUSE_AD = 2
26
+ const val COMMAND_RESUME_AD = 3
27
+ const val COMMAND_DESTROY = 4
28
+ }
29
+
30
+ override fun getName(): String = REACT_CLASS
31
+
32
+ override fun createViewInstance(reactContext: ThemedReactContext): BigCrunchBannerView {
33
+ android.util.Log.d("BigCrunchBannerViewManager", """
34
+ === CREATING VIEW INSTANCE ===
35
+ React Context: $reactContext
36
+ Activity: ${reactContext.currentActivity}
37
+ ==============================
38
+ """.trimIndent())
39
+
40
+ val view = BigCrunchBannerView(reactContext)
41
+ // Set default layout params to ensure view is visible
42
+ view.layoutParams = android.widget.FrameLayout.LayoutParams(
43
+ android.widget.FrameLayout.LayoutParams.MATCH_PARENT,
44
+ android.widget.FrameLayout.LayoutParams.WRAP_CONTENT
45
+ )
46
+
47
+ android.util.Log.d("BigCrunchBannerViewManager", """
48
+ === VIEW CREATED ===
49
+ View: $view
50
+ Layout params: ${view.layoutParams?.width}x${view.layoutParams?.height}
51
+ ====================
52
+ """.trimIndent())
53
+
54
+ return view
55
+ }
56
+
57
+ private val autoLoadMap = mutableMapOf<BigCrunchBannerView, Boolean>()
58
+
59
+ @ReactProp(name = "placementId")
60
+ fun setPlacementId(view: BigCrunchBannerView, placementId: String) {
61
+ view.setPlacementId(placementId)
62
+
63
+ // Check if autoLoad was set to true before placementId
64
+ if (autoLoadMap[view] == true) {
65
+ view.loadAd()
66
+ autoLoadMap.remove(view)
67
+ }
68
+ }
69
+
70
+ @ReactProp(name = "size")
71
+ fun setSize(view: BigCrunchBannerView, size: String) {
72
+ android.util.Log.d("BigCrunchBannerViewManager", """
73
+ === SET SIZE CALLED ===
74
+ Size string: $size
75
+ Current view dimensions: ${view.width}x${view.height}
76
+ Current minimums: ${view.minimumWidth}x${view.minimumHeight}
77
+ =======================
78
+ """.trimIndent())
79
+
80
+ val adSize = when (size) {
81
+ "BANNER" -> AdSize(320, 50)
82
+ "LARGE_BANNER" -> AdSize(320, 100)
83
+ "MEDIUM_RECTANGLE" -> AdSize(300, 250)
84
+ "FULL_BANNER" -> AdSize(468, 60)
85
+ "LEADERBOARD" -> AdSize(728, 90)
86
+ "ADAPTIVE" -> AdSize(320, 50) // Default for now
87
+ "SMART" -> AdSize(320, 50) // Default banner size
88
+ else -> AdSize(320, 50)
89
+ }
90
+ view.setAdSize(adSize)
91
+
92
+ // Set minimum height based on ad size to ensure visibility
93
+ val density = view.resources.displayMetrics.density
94
+ val minHeightPx = (adSize.height * density).toInt()
95
+ val minWidthPx = (adSize.width * density).toInt()
96
+ view.minimumHeight = minHeightPx
97
+ view.minimumWidth = minWidthPx
98
+
99
+ android.util.Log.d("BigCrunchBannerViewManager", """
100
+ === SIZE SET ===
101
+ Ad size: ${adSize.width}x${adSize.height} dp
102
+ Density: $density
103
+ Minimum pixels: ${minWidthPx}x${minHeightPx}
104
+ View parent: ${view.parent?.javaClass?.simpleName}
105
+ ================
106
+ """.trimIndent())
107
+
108
+ // Request layout to apply the new dimensions
109
+ view.requestLayout()
110
+ }
111
+
112
+ @ReactProp(name = "customWidth")
113
+ fun setCustomWidth(view: BigCrunchBannerView, width: Int?) {
114
+ width?.let {
115
+ val currentHeight = view.getAdSize()?.height ?: 50
116
+ view.setAdSize(AdSize(it, currentHeight))
117
+
118
+ // Apply minimum width in pixels
119
+ val density = view.resources.displayMetrics.density
120
+ val minWidthPx = (it * density).toInt()
121
+ view.minimumWidth = minWidthPx
122
+ view.requestLayout()
123
+ }
124
+ }
125
+
126
+ @ReactProp(name = "customHeight")
127
+ fun setCustomHeight(view: BigCrunchBannerView, height: Int?) {
128
+ height?.let {
129
+ val currentWidth = view.getAdSize()?.width ?: 320
130
+ view.setAdSize(AdSize(currentWidth, it))
131
+
132
+ // Apply minimum height in pixels
133
+ val density = view.resources.displayMetrics.density
134
+ val minHeightPx = (it * density).toInt()
135
+ view.minimumHeight = minHeightPx
136
+ view.requestLayout()
137
+ }
138
+ }
139
+
140
+ @ReactProp(name = "autoLoad")
141
+ fun setAutoLoad(view: BigCrunchBannerView, autoLoad: Boolean) {
142
+ android.util.Log.d("BigCrunchBannerViewManager", """
143
+ === SET AUTO LOAD ===
144
+ AutoLoad: $autoLoad
145
+ PlacementId: ${view.getPlacementId()}
146
+ View dimensions: ${view.width}x${view.height}
147
+ View parent: ${view.parent?.javaClass?.simpleName}
148
+ =====================
149
+ """.trimIndent())
150
+
151
+ if (autoLoad) {
152
+ // Check if placementId is already set
153
+ if (view.getPlacementId() != null) {
154
+ android.util.Log.d("BigCrunchBannerViewManager", "AutoLoad triggered immediately - placementId already set")
155
+
156
+ // Add debug about view state before loading
157
+ view.post {
158
+ android.util.Log.d("BigCrunchBannerViewManager", """
159
+ === BEFORE LOAD AD (autoLoad) ===
160
+ View dimensions: ${view.width}x${view.height}
161
+ Measured dimensions: ${view.measuredWidth}x${view.measuredHeight}
162
+ Minimum dimensions: ${view.minimumWidth}x${view.minimumHeight}
163
+ Parent: ${view.parent?.javaClass?.simpleName}
164
+ Parent dimensions: ${(view.parent as? android.view.View)?.let { "${it.width}x${it.height}" }}
165
+ ==================================
166
+ """.trimIndent())
167
+ }
168
+
169
+ view.loadAd()
170
+ } else {
171
+ // Store for later when placementId is set
172
+ android.util.Log.d("BigCrunchBannerViewManager", "AutoLoad deferred - waiting for placementId")
173
+ autoLoadMap[view] = true
174
+ }
175
+ } else {
176
+ autoLoadMap.remove(view)
177
+ }
178
+ }
179
+
180
+ @ReactProp(name = "refreshInterval")
181
+ fun setRefreshInterval(view: BigCrunchBannerView, interval: Int) {
182
+ view.setRefreshInterval(interval)
183
+ }
184
+
185
+ @ReactProp(name = "customTargeting")
186
+ fun setCustomTargeting(view: BigCrunchBannerView, customTargeting: ReadableMap?) {
187
+ customTargeting?.let {
188
+ val targeting = mutableMapOf<String, String>()
189
+ val iterator = it.keySetIterator()
190
+ while (iterator.hasNextKey()) {
191
+ val key = iterator.nextKey()
192
+ it.getString(key)?.let { value ->
193
+ targeting[key] = value
194
+ }
195
+ }
196
+ view.setCustomTargeting(targeting)
197
+ }
198
+ }
199
+
200
+ @ReactProp(name = "viewId")
201
+ fun setViewId(view: BigCrunchBannerView, viewId: String) {
202
+ view.tag = viewId
203
+ setupEventListeners(view, viewId)
204
+ }
205
+
206
+ override fun getCommandsMap(): Map<String, Int> {
207
+ return mapOf(
208
+ "loadAd" to COMMAND_LOAD_AD,
209
+ "pauseAd" to COMMAND_PAUSE_AD,
210
+ "resumeAd" to COMMAND_RESUME_AD,
211
+ "destroy" to COMMAND_DESTROY
212
+ )
213
+ }
214
+
215
+ override fun receiveCommand(root: BigCrunchBannerView, commandId: Int, args: ReadableArray?) {
216
+ when (commandId) {
217
+ COMMAND_LOAD_AD -> root.loadAd()
218
+ COMMAND_PAUSE_AD -> root.pause()
219
+ COMMAND_RESUME_AD -> root.resume()
220
+ COMMAND_DESTROY -> root.destroy()
221
+ }
222
+ }
223
+
224
+ override fun onDropViewInstance(view: BigCrunchBannerView) {
225
+ super.onDropViewInstance(view)
226
+ autoLoadMap.remove(view)
227
+ view.destroy()
228
+ }
229
+
230
+ private fun setupEventListeners(view: BigCrunchBannerView, viewId: String) {
231
+ val reactContext = view.context as ThemedReactContext
232
+
233
+ view.setBannerAdListener(object : BannerAdListener {
234
+ override fun onAdLoaded() {
235
+ sendEvent(reactContext, "BigCrunchBannerAdLoaded", Arguments.createMap().apply {
236
+ putString("viewId", viewId)
237
+ putString("placementId", view.getPlacementId())
238
+ })
239
+ }
240
+
241
+ override fun onAdFailedToLoad(errorCode: String, errorMessage: String) {
242
+ sendEvent(reactContext, "BigCrunchBannerAdFailedToLoad", Arguments.createMap().apply {
243
+ putString("viewId", viewId)
244
+ putString("placementId", view.getPlacementId())
245
+ putString("errorCode", errorCode)
246
+ putString("errorMessage", errorMessage)
247
+ })
248
+ }
249
+
250
+ override fun onAdImpression() {
251
+ sendEvent(reactContext, "BigCrunchBannerAdImpression", Arguments.createMap().apply {
252
+ putString("viewId", viewId)
253
+ putString("placementId", view.getPlacementId())
254
+ })
255
+ }
256
+
257
+ override fun onAdClicked() {
258
+ sendEvent(reactContext, "BigCrunchBannerAdClicked", Arguments.createMap().apply {
259
+ putString("viewId", viewId)
260
+ putString("placementId", view.getPlacementId())
261
+ })
262
+ }
263
+
264
+ override fun onAdOpened() {
265
+ sendEvent(reactContext, "BigCrunchBannerAdOpened", Arguments.createMap().apply {
266
+ putString("viewId", viewId)
267
+ putString("placementId", view.getPlacementId())
268
+ })
269
+ }
270
+
271
+ override fun onAdClosed() {
272
+ sendEvent(reactContext, "BigCrunchBannerAdClosed", Arguments.createMap().apply {
273
+ putString("viewId", viewId)
274
+ putString("placementId", view.getPlacementId())
275
+ })
276
+ }
277
+
278
+ override fun onAdRevenue(valueMicros: Long, currencyCode: String, adUnitId: String?, precision: String?) {
279
+ sendEvent(reactContext, "BigCrunchBannerAdRevenue", Arguments.createMap().apply {
280
+ putString("viewId", viewId)
281
+ putString("placementId", view.getPlacementId())
282
+ putDouble("valueMicros", valueMicros.toDouble())
283
+ putString("currencyCode", currencyCode)
284
+ adUnitId?.let { putString("adUnitId", it) }
285
+ precision?.let { putString("precision", it) }
286
+ })
287
+ }
288
+ })
289
+ }
290
+
291
+ private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap) {
292
+ reactContext
293
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
294
+ .emit(eventName, params)
295
+ }
296
+ }