@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.
- package/README.md +103 -22
- package/android/{build.gradle → build-legacy.gradle} +19 -2
- package/android/build.gradle.kts +76 -0
- package/android/gradle.properties +6 -2
- package/android/settings.gradle.kts +21 -0
- package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/RNUsercentricsModuleTest.kt +5 -5
- package/android/src/androidTest/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
- package/android/src/main/AndroidManifest.xml +1 -2
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModule.kt +34 -30
- package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsModuleSpec.kt +99 -0
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsPackage.kt +3 -2
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProvider.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProviderImpl.kt +1 -1
- package/android/src/main/java/com/usercentrics/reactnative/UCRNFlag.kt +4 -0
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/api/UsercentricsProxy.kt +2 -2
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerFontExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerSettingsExtensions.kt +5 -4
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/CCPADataExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ConsentDisclosureSerializer.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ReadableMapExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/TCFDataExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserDecisionExtensions.kt +20 -18
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserOptionsExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsCMPDataExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsConsentUserResponseExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsReadyStatusExtensions.kt +1 -1
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsServiceConsentExtensions.kt +1 -1
- package/android/src/test/java/com/usercentrics/reactnative/RNUsercentricsModuleTest.kt +159 -0
- package/android/src/test/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
- package/ios/Extensions/BannerSettings+Dict.swift +1 -0
- package/ios/Extensions/UIColor+Extensions.swift +1 -1
- package/ios/Extensions/UIImage+UsercentricsLogoDict.swift +1 -0
- package/ios/RNUsercentricsModule.swift +25 -1
- package/ios/RNUsercentricsModuleSpec.h +103 -0
- package/lib/NativeUsercentrics.d.ts +30 -0
- package/lib/NativeUsercentrics.js +10 -0
- package/lib/NativeUsercentrics.js.map +1 -0
- package/lib/Usercentrics.d.ts +8 -8
- package/lib/Usercentrics.js +3 -1
- package/lib/Usercentrics.js.map +1 -1
- package/package.json +98 -79
- package/react-native-usercentrics.podspec +26 -3
- package/CHANGELOG.md +0 -822
- package/android/settings.gradle +0 -1
- package/android/src/androidTest/java/com/usercentrics/reactnativemodule/fake/FakePromise.kt +0 -67
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/UCRNFlag.kt +0 -4
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/api/FakeUsercentricsProxy.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetCMPDataMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetConsentsMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetTCFDataMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUSPDataMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUserSessionDataMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/ReactContextProviderMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsForTCFMock.kt +0 -0
- /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsMock.kt +0 -0
- /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.
|
|
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.
|
|
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,9 +1,9 @@
|
|
|
1
|
-
package com.usercentrics.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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.
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
30
|
-
|
|
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
|
|
38
|
-
|
|
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
|
|
46
|
-
|
|
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
|
|
54
|
-
|
|
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
|
}
|
|
@@ -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
|
+
}
|
|
@@ -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
|
|
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
|