@usercentrics/react-native-sdk 2.23.0 → 2.23.3

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 (56) hide show
  1. package/README.md +103 -22
  2. package/android/{build.gradle → build-legacy.gradle} +19 -2
  3. package/android/build.gradle.kts +76 -0
  4. package/android/gradle.properties +6 -2
  5. package/android/settings.gradle.kts +21 -0
  6. package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/RNUsercentricsModuleTest.kt +5 -5
  7. package/android/src/androidTest/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
  8. package/android/src/main/AndroidManifest.xml +1 -2
  9. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModule.kt +34 -30
  10. package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsModuleSpec.kt +99 -0
  11. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsPackage.kt +3 -2
  12. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProvider.kt +1 -1
  13. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProviderImpl.kt +1 -1
  14. package/android/src/main/java/com/usercentrics/reactnative/UCRNFlag.kt +4 -0
  15. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/api/UsercentricsProxy.kt +2 -2
  16. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerFontExtensions.kt +1 -1
  17. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerSettingsExtensions.kt +5 -4
  18. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/CCPADataExtensions.kt +1 -1
  19. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ConsentDisclosureSerializer.kt +1 -1
  20. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ReadableMapExtensions.kt +1 -1
  21. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/TCFDataExtensions.kt +1 -1
  22. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserDecisionExtensions.kt +20 -18
  23. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserOptionsExtensions.kt +1 -1
  24. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsCMPDataExtensions.kt +1 -1
  25. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsConsentUserResponseExtensions.kt +1 -1
  26. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsReadyStatusExtensions.kt +1 -1
  27. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsServiceConsentExtensions.kt +1 -1
  28. package/android/src/test/java/com/usercentrics/reactnative/RNUsercentricsModuleTest.kt +159 -0
  29. package/android/src/test/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
  30. package/ios/Extensions/BannerSettings+Dict.swift +1 -0
  31. package/ios/Extensions/UIColor+Extensions.swift +1 -1
  32. package/ios/Extensions/UIImage+UsercentricsLogoDict.swift +1 -0
  33. package/ios/RNUsercentricsModule.swift +25 -1
  34. package/ios/RNUsercentricsModuleSpec.h +103 -0
  35. package/lib/NativeUsercentrics.d.ts +30 -0
  36. package/lib/NativeUsercentrics.js +10 -0
  37. package/lib/NativeUsercentrics.js.map +1 -0
  38. package/lib/Usercentrics.d.ts +8 -8
  39. package/lib/Usercentrics.js +3 -1
  40. package/lib/Usercentrics.js.map +1 -1
  41. package/package.json +98 -79
  42. package/react-native-usercentrics.podspec +26 -3
  43. package/CHANGELOG.md +0 -822
  44. package/android/settings.gradle +0 -1
  45. package/android/src/androidTest/java/com/usercentrics/reactnativemodule/fake/FakePromise.kt +0 -67
  46. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/UCRNFlag.kt +0 -4
  47. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/api/FakeUsercentricsProxy.kt +0 -0
  48. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetCMPDataMock.kt +0 -0
  49. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetConsentsMock.kt +0 -0
  50. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetTCFDataMock.kt +0 -0
  51. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUSPDataMock.kt +0 -0
  52. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUserSessionDataMock.kt +0 -0
  53. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/ReactContextProviderMock.kt +0 -0
  54. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsForTCFMock.kt +0 -0
  55. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsMock.kt +0 -0
  56. /package/ios/{RNUsercentricsModule.m → RNUsercentricsModule.mm} +0 -0
@@ -0,0 +1,99 @@
1
+ package com.usercentrics.reactnative
2
+
3
+ import com.facebook.react.bridge.Promise
4
+ import com.facebook.react.bridge.ReactApplicationContext
5
+ import com.facebook.react.bridge.ReactMethod
6
+ import com.facebook.react.bridge.ReadableArray
7
+ import com.facebook.react.bridge.ReadableMap
8
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule
9
+ import com.facebook.react.module.annotations.ReactModule
10
+
11
+ @ReactModule(name = RNUsercentricsModuleSpec.NAME)
12
+ abstract class RNUsercentricsModuleSpec internal constructor(context: ReactApplicationContext) :
13
+ com.facebook.react.bridge.ReactContextBaseJavaModule(context), TurboModule {
14
+
15
+ @ReactMethod
16
+ abstract fun configure(options: ReadableMap)
17
+
18
+ @ReactMethod
19
+ abstract fun isReady(promise: Promise)
20
+
21
+ @ReactMethod
22
+ abstract fun showFirstLayer(options: ReadableMap?, promise: Promise)
23
+
24
+ @ReactMethod
25
+ abstract fun showSecondLayer(options: ReadableMap?, promise: Promise)
26
+
27
+ @ReactMethod
28
+ abstract fun restoreUserSession(controllerId: String, promise: Promise)
29
+
30
+ @ReactMethod
31
+ abstract fun getControllerId(promise: Promise)
32
+
33
+ @ReactMethod
34
+ abstract fun clearUserSession(promise: Promise)
35
+
36
+ @ReactMethod
37
+ abstract fun getConsents(promise: Promise)
38
+
39
+ @ReactMethod
40
+ abstract fun getCMPData(promise: Promise)
41
+
42
+ @ReactMethod
43
+ abstract fun getAdditionalConsentModeData(promise: Promise)
44
+
45
+ @ReactMethod
46
+ abstract fun getTCFData(promise: Promise)
47
+
48
+ @ReactMethod
49
+ abstract fun getUserSessionData(promise: Promise)
50
+
51
+ @ReactMethod
52
+ abstract fun getUSPData(promise: Promise)
53
+
54
+ @ReactMethod
55
+ abstract fun getABTestingVariant(promise: Promise)
56
+
57
+ @ReactMethod
58
+ abstract fun setCMPId(id: Int)
59
+
60
+ @ReactMethod
61
+ abstract fun setABTestingVariant(variant: String)
62
+
63
+ @ReactMethod
64
+ abstract fun changeLanguage(language: String, promise: Promise)
65
+
66
+ @ReactMethod
67
+ abstract fun acceptAll(consentType: Int, promise: Promise)
68
+
69
+ @ReactMethod
70
+ abstract fun acceptAllForTCF(fromLayer: Int, consentType: Int, promise: Promise)
71
+
72
+ @ReactMethod
73
+ abstract fun denyAll(consentType: Int, promise: Promise)
74
+
75
+ @ReactMethod
76
+ abstract fun denyAllForTCF(fromLayer: Int, consentType: Int, promise: Promise)
77
+
78
+ @ReactMethod
79
+ abstract fun saveDecisions(decisions: ReadableArray, consentType: Int, promise: Promise)
80
+
81
+ @ReactMethod
82
+ abstract fun saveDecisionsForTCF(
83
+ tcfDecisions: ReadableMap,
84
+ fromLayer: Int,
85
+ saveDecisions: ReadableArray,
86
+ consentType: Int,
87
+ promise: Promise
88
+ )
89
+
90
+ @ReactMethod
91
+ abstract fun saveOptOutForCCPA(isOptedOut: Boolean, consentType: Int, promise: Promise)
92
+
93
+ @ReactMethod
94
+ abstract fun track(event: Int)
95
+
96
+ companion object {
97
+ const val NAME = "RNUsercentricsModule"
98
+ }
99
+ }
@@ -1,10 +1,11 @@
1
- package com.usercentrics.reactnativeusercentrics
1
+ package com.usercentrics.reactnative
2
2
 
3
3
  import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.uimanager.ViewManager
7
- import com.usercentrics.reactnativeusercentrics.api.UsercentricsProxyImpl
7
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule
8
+ import com.usercentrics.reactnative.api.UsercentricsProxyImpl
8
9
 
9
10
  class RNUsercentricsPackage : ReactPackage {
10
11
 
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics
1
+ package com.usercentrics.reactnative
2
2
 
3
3
  import android.app.Activity
4
4
  import android.content.Context
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics
1
+ package com.usercentrics.reactnative
2
2
 
3
3
  import android.app.Activity
4
4
  import android.content.Context
@@ -0,0 +1,4 @@
1
+ package com.usercentrics.reactnative
2
+
3
+ @Suppress("unused")
4
+ class UCRNFlag
@@ -1,9 +1,9 @@
1
- package com.usercentrics.reactnativeusercentrics.api
1
+ package com.usercentrics.reactnative.api
2
2
 
3
3
  import android.app.Activity
4
4
  import android.content.Context
5
5
  import com.facebook.react.bridge.Promise
6
- import com.usercentrics.reactnativeusercentrics.extensions.toWritableMap
6
+ import com.usercentrics.reactnative.extensions.toWritableMap
7
7
  import com.usercentrics.sdk.*
8
8
  import com.usercentrics.sdk.errors.UsercentricsError
9
9
 
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import android.content.Context
4
4
  import android.content.res.AssetManager
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import android.content.Context
4
4
  import android.graphics.Color
@@ -110,9 +110,10 @@ internal fun ReadableMap.buttonLayoutFromMap(context: Context): ButtonLayout? {
110
110
  val listRow = mutableListOf<ButtonSettings>()
111
111
  val row = buttonsArray.getArray(rowIndex)
112
112
 
113
- for (rowElement in 0 until row.size()) {
114
- val element = row.getMap(rowElement)
115
- listRow.add(element.buttonSettingsFromMap(context))
113
+ val rowSize = row?.size() ?: 0
114
+ for (rowElement in 0 until rowSize) {
115
+ val element = row?.getMap(rowElement)
116
+ element?.let { listRow.add(it.buttonSettingsFromMap(context)) }
116
117
  }
117
118
  buttonsList.add(listRow)
118
119
  }
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.WritableMap
4
4
  import com.usercentrics.ccpa.CCPAData
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.usercentrics.sdk.v2.settings.data.ConsentDisclosure
4
4
  import com.usercentrics.sdk.v2.settings.data.ConsentDisclosureObject
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.ReadableMap
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.WritableMap
4
4
  import com.usercentrics.sdk.services.tcf.interfaces.TCFData
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.ReadableArray
4
4
  import com.facebook.react.bridge.ReadableMap
@@ -13,45 +13,47 @@ internal fun ReadableArray.deserializeUserDecision(): List<UserDecision> {
13
13
  val decisionList = mutableListOf<UserDecision>()
14
14
  for (i in 0 until size()) {
15
15
  val map = getMap(i)
16
- decisionList.add(
17
- UserDecision(
18
- map.getString("serviceId")!!,
19
- map.getBoolean("consent")
16
+ map?.let {
17
+ decisionList.add(
18
+ UserDecision(
19
+ it.getString("serviceId")!!,
20
+ it.getBoolean("consent")
21
+ )
20
22
  )
21
- )
23
+ }
22
24
  }
23
25
  return decisionList
24
26
  }
25
27
 
26
28
  internal fun ReadableMap.deserializeTCFUserDecisions(): TCFUserDecisions {
27
- val purposes = getArray("purposes")?.let {
29
+ val purposes = getArray("purposes")?.let { purpose ->
28
30
  val list = mutableListOf<TCFUserDecisionOnPurpose>()
29
- for (i in 0 until it.size()) {
30
- list.add(it.getMap(i).deserializeTCFUserDecisionOnPurpose())
31
+ for (i in 0 until purpose.size()) {
32
+ purpose.getMap(i)?.let { map -> list.add(map.deserializeTCFUserDecisionOnPurpose()) }
31
33
  }
32
34
  list
33
35
  }
34
36
 
35
- val specialFeature = getArray("specialFeatures")?.let {
37
+ val specialFeature = getArray("specialFeatures")?.let { feature ->
36
38
  val list = mutableListOf<TCFUserDecisionOnSpecialFeature>()
37
- for (i in 0 until it.size()) {
38
- list.add(it.getMap(i).deserializeTCFUserDecisionOnSpecialFeature())
39
+ for (i in 0 until feature.size()) {
40
+ feature.getMap(i)?.let { map -> list.add(map.deserializeTCFUserDecisionOnSpecialFeature()) }
39
41
  }
40
42
  list
41
43
  }
42
44
 
43
- val vendors = getArray("vendors")?.let {
45
+ val vendors = getArray("vendors")?.let { vendor ->
44
46
  val list = mutableListOf<TCFUserDecisionOnVendor>()
45
- for (i in 0 until it.size()) {
46
- list.add(it.getMap(i).deserializeTCFUserDecisionOnVendor())
47
+ for (i in 0 until vendor.size()) {
48
+ vendor.getMap(i)?.let { map -> list.add(map.deserializeTCFUserDecisionOnVendor()) }
47
49
  }
48
50
  list
49
51
  }
50
52
 
51
- val adTechProviderDecisions = getArray("adTechProviders")?.let {
53
+ val adTechProviderDecisions = getArray("adTechProviders")?.let { decision ->
52
54
  val list = mutableListOf<AdTechProviderDecision>()
53
- for (i in 0 until it.size()) {
54
- list.add(it.getMap(i).deserializeAdTechProviderDecision())
55
+ for (i in 0 until decision.size()) {
56
+ decision.getMap(i)?.let { map -> list.add(map.deserializeAdTechProviderDecision()) }
55
57
  }
56
58
  list
57
59
  }
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.ReadableMap
4
4
  import com.usercentrics.sdk.UsercentricsOptions
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.usercentrics.reactnativeusercentrics.extensions
1
+ package com.usercentrics.reactnative.extensions
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.ReadableArray
@@ -0,0 +1,159 @@
1
+ package com.usercentrics.reactnativemodule
2
+
3
+ import com.usercentrics.reactnativemodule.fake.FakePromise
4
+ import org.junit.Test
5
+ import org.junit.Assert.assertEquals
6
+ import org.junit.Assert.assertNotNull
7
+
8
+ class RNUsercentricsModuleTest {
9
+
10
+ @Test
11
+ fun `FakePromise should resolve correctly`() {
12
+ val promise = FakePromise()
13
+ val testValue = "test_result"
14
+
15
+ promise.resolve(testValue)
16
+
17
+ assertEquals(testValue, promise.resolveValue)
18
+ }
19
+
20
+ @Test
21
+ fun `FakePromise should reject with code and message`() {
22
+ val promise = FakePromise()
23
+ val errorMessage = "test_error"
24
+
25
+ promise.reject("ERROR_CODE", errorMessage)
26
+
27
+ assertNotNull(promise.rejectThrowable)
28
+ assertEquals("ERROR_CODE: $errorMessage", promise.rejectThrowable?.message)
29
+ }
30
+
31
+ @Test
32
+ fun `FakePromise should reject with throwable`() {
33
+ val promise = FakePromise()
34
+ val error = RuntimeException("Network error")
35
+
36
+ promise.reject(error)
37
+
38
+ assertEquals(error, promise.rejectThrowable)
39
+ }
40
+
41
+ @Test
42
+ fun `FakePromise should handle multiple resolve calls`() {
43
+ val promise = FakePromise()
44
+
45
+ promise.resolve("first")
46
+ promise.resolve("second") // Should overwrite
47
+
48
+ assertEquals("second", promise.resolveValue)
49
+ }
50
+
51
+ @Test
52
+ fun `FakePromise should handle multiple reject calls`() {
53
+ val promise = FakePromise()
54
+
55
+ promise.reject("FIRST", "first error")
56
+ promise.reject("SECOND", "second error") // Should overwrite
57
+
58
+ assertEquals("SECOND: second error", promise.rejectThrowable?.message)
59
+ }
60
+
61
+ @Test
62
+ fun `Promise interface methods should work`() {
63
+ val promise = FakePromise()
64
+
65
+ // Test different reject overloads
66
+ promise.reject("CODE", "message", RuntimeException("cause"))
67
+ assertNotNull(promise.rejectThrowable)
68
+
69
+ // Reset and test resolve
70
+ val newPromise = FakePromise()
71
+ newPromise.resolve(mapOf("key" to "value"))
72
+ assertNotNull(newPromise.resolveValue)
73
+ }
74
+
75
+ @Test
76
+ fun `Promise should handle null values`() {
77
+ val promise = FakePromise()
78
+
79
+ promise.resolve(null)
80
+ assertEquals(null, promise.resolveValue)
81
+ }
82
+
83
+ @Test
84
+ fun `Promise should handle complex data structures`() {
85
+ val promise = FakePromise()
86
+ val complexData = mapOf(
87
+ "string" to "value",
88
+ "number" to 42,
89
+ "boolean" to true,
90
+ "array" to listOf("item1", "item2"),
91
+ "nested" to mapOf("inner" to "value")
92
+ )
93
+
94
+ promise.resolve(complexData)
95
+ assertEquals(complexData, promise.resolveValue)
96
+ }
97
+
98
+ @Test
99
+ fun `Module name validation`() {
100
+ val expectedName = "RNUsercentricsModule"
101
+ assertEquals("RNUsercentricsModule", expectedName)
102
+ }
103
+
104
+ @Test
105
+ fun `Basic string operations`() {
106
+ val settingsId = "AAAAA"
107
+ val ruleSetId = "BBBBB"
108
+
109
+ assertEquals(5, settingsId.length)
110
+ assertEquals(5, ruleSetId.length)
111
+ assertEquals("AAAAA", settingsId)
112
+ assertEquals("BBBBB", ruleSetId)
113
+ }
114
+
115
+ @Test
116
+ fun `Basic number operations`() {
117
+ val timeoutMillis = 1000L
118
+ val initTimeoutMillis = 10000L
119
+
120
+ assertEquals(1000L, timeoutMillis)
121
+ assertEquals(10000L, initTimeoutMillis)
122
+ assertEquals(10.0, initTimeoutMillis.toDouble() / timeoutMillis.toDouble(), 0.1)
123
+ }
124
+
125
+ @Test
126
+ fun `Boolean logic validation`() {
127
+ val shouldCollectConsent = false
128
+ val isEnabled = true
129
+
130
+ assertEquals(false, shouldCollectConsent)
131
+ assertEquals(true, isEnabled)
132
+ assertEquals(true, !shouldCollectConsent)
133
+ assertEquals(false, !isEnabled)
134
+ }
135
+
136
+ @Test
137
+ fun `List operations`() {
138
+ val items = listOf("item1", "item2", "item3")
139
+
140
+ assertEquals(3, items.size)
141
+ assertEquals("item1", items[0])
142
+ assertEquals("item3", items.last())
143
+ assertEquals(true, items.contains("item2"))
144
+ }
145
+
146
+ @Test
147
+ fun `Map operations`() {
148
+ val config = mapOf(
149
+ "settingsId" to "test123",
150
+ "enabled" to true,
151
+ "timeout" to 5000
152
+ )
153
+
154
+ assertEquals("test123", config["settingsId"])
155
+ assertEquals(true, config["enabled"])
156
+ assertEquals(5000, config["timeout"])
157
+ assertEquals(3, config.size)
158
+ }
159
+ }
@@ -0,0 +1,73 @@
1
+ package com.usercentrics.reactnativemodule.fake
2
+
3
+ import com.facebook.react.bridge.Promise
4
+ import com.facebook.react.bridge.WritableMap
5
+ import java.util.concurrent.CountDownLatch
6
+
7
+ internal class FakePromise : Promise {
8
+
9
+ var resolveValue: Any? = null
10
+ var rejectThrowable: Throwable? = null
11
+
12
+ private val lock = CountDownLatch(1)
13
+
14
+ fun await() {
15
+ lock.await()
16
+ }
17
+
18
+ override fun resolve(value: Any?) {
19
+ resolveValue = value
20
+ lock.countDown()
21
+ }
22
+
23
+ override fun reject(code: String, message: String?) {
24
+ rejectThrowable = RuntimeException("$code: $message")
25
+ lock.countDown()
26
+ }
27
+
28
+ override fun reject(code: String, throwable: Throwable?) {
29
+ rejectThrowable = throwable ?: RuntimeException(code)
30
+ lock.countDown()
31
+ }
32
+
33
+ override fun reject(code: String, message: String?, throwable: Throwable?) {
34
+ rejectThrowable = throwable ?: RuntimeException("$code: $message")
35
+ lock.countDown()
36
+ }
37
+
38
+ override fun reject(throwable: Throwable) {
39
+ rejectThrowable = throwable
40
+ lock.countDown()
41
+ }
42
+
43
+ override fun reject(throwable: Throwable, userInfo: WritableMap) {
44
+ rejectThrowable = throwable
45
+ lock.countDown()
46
+ }
47
+
48
+ override fun reject(code: String, userInfo: WritableMap) {
49
+ rejectThrowable = RuntimeException("$code: $userInfo")
50
+ lock.countDown()
51
+ }
52
+
53
+ override fun reject(code: String, throwable: Throwable?, userInfo: WritableMap) {
54
+ rejectThrowable = throwable
55
+ lock.countDown()
56
+ }
57
+
58
+ override fun reject(code: String, message: String?, userInfo: WritableMap) {
59
+ rejectThrowable = RuntimeException("$code: $message")
60
+ lock.countDown()
61
+ }
62
+
63
+ override fun reject(code: String?, message: String?, throwable: Throwable?, userInfo: WritableMap?) {
64
+ rejectThrowable = throwable ?: RuntimeException("$code: $message")
65
+ lock.countDown()
66
+ }
67
+
68
+ @Deprecated("Use reject(code, message) instead")
69
+ override fun reject(message: String) {
70
+ rejectThrowable = RuntimeException(message)
71
+ lock.countDown()
72
+ }
73
+ }
@@ -1,5 +1,6 @@
1
1
  import Foundation
2
2
  import UsercentricsUI
3
+ import UIKit
3
4
 
4
5
  extension BannerSettings {
5
6
  init?(from dictionary: NSDictionary?) {
@@ -1,4 +1,4 @@
1
- import Foundation
1
+ import UIKit
2
2
 
3
3
  extension UIColor {
4
4
  convenience init?(unsafeHex: String?) {
@@ -1,4 +1,5 @@
1
1
  import Foundation
2
+ import UIKit
2
3
 
3
4
  extension UIImage {
4
5
  convenience init?(from dictionary: NSDictionary?) {
@@ -2,9 +2,20 @@ import Foundation
2
2
  import Usercentrics
3
3
  import UsercentricsUI
4
4
  import UIKit
5
+ import React
6
+
7
+ #if RCT_NEW_ARCH_ENABLED
8
+ #if canImport(RNUsercentricsModuleSpec)
9
+ // RN ≤ 0.77
10
+ import RNUsercentricsModuleSpec
11
+ #else
12
+ // RN ≥ 0.78
13
+ import React_Codegen
14
+ #endif
15
+ #endif
5
16
 
6
17
  @objc(RNUsercentricsModule)
7
- class RNUsercentricsModule: NSObject, RCTBridgeModule {
18
+ class RNUsercentricsModule: NSObject {
8
19
 
9
20
  var usercentricsManager: UsercentricsManager = UsercentricsManagerImplementation()
10
21
  var queue: DispatchQueueManager = DispatchQueue.main
@@ -204,3 +215,16 @@ class RNUsercentricsModule: NSObject, RCTBridgeModule {
204
215
  }
205
216
  }
206
217
  }
218
+
219
+ // MARK: - RCTBridgeModule & TurboModule Conformance
220
+ #if RCT_NEW_ARCH_ENABLED
221
+ extension RNUsercentricsModule: NativeUsercentricsSpec {
222
+ func getTurboModule(jsInvoker: RCTJSInvoker) -> Any {
223
+ return self
224
+ }
225
+ }
226
+ #else
227
+ extension RNUsercentricsModule: RCTBridgeModule {
228
+
229
+ }
230
+ #endif