@usercentrics/react-native-sdk 2.23.2 → 2.24.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.
- package/README.md +5 -5
- package/android/build-legacy.gradle +11 -1
- package/android/build.gradle.kts +44 -14
- package/android/gradle.properties +2 -0
- package/android/settings.gradle.kts +1 -1
- 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/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModule.kt +3 -3
- package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModuleSpec.kt +1 -1
- package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsPackage.kt +51 -0
- 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 +1 -1
- 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 +1 -1
- 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/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/RNUsercentricsModule.cpp +21 -0
- package/android/src/main/jni/rn_usercentrics.cpp +22 -0
- 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 +1 -0
- package/lib/NativeUsercentrics.d.ts +1 -1
- package/lib/NativeUsercentrics.js +10 -2
- package/lib/NativeUsercentrics.js.map +1 -1
- package/lib/fabric/NativeUsercentricsModule.d.ts +30 -0
- package/lib/fabric/NativeUsercentricsModule.js +3 -0
- package/lib/fabric/NativeUsercentricsModule.js.map +1 -0
- package/package.json +108 -96
- package/react-native.config.js +15 -0
- package/src/NativeUsercentrics.ts +75 -0
- package/src/Usercentrics.tsx +145 -0
- package/src/__tests__/index.test.ts +476 -0
- package/src/__tests__/mocks.ts +402 -0
- package/src/fabric/NativeUsercentricsModule.ts +51 -0
- package/src/index.tsx +2 -0
- package/src/models/AdditionalConsentModeData.tsx +33 -0
- package/src/models/BannerSettings.tsx +117 -0
- package/src/models/CCPAData.tsx +32 -0
- package/src/models/CCPASettings.tsx +49 -0
- package/src/models/ConsentDisclosureObject.tsx +47 -0
- package/src/models/FirstLayerSettings.tsx +185 -0
- package/src/models/GeolocationRuleset.tsx +10 -0
- package/src/models/LegalBasisLocalization.tsx +100 -0
- package/src/models/NetworkMode.tsx +5 -0
- package/src/models/SecondLayerSettings.tsx +12 -0
- package/src/models/TCF2Settings.tsx +209 -0
- package/src/models/TCFData.tsx +297 -0
- package/src/models/TCFDecisionUILayer.tsx +5 -0
- package/src/models/TCFUserDecisions.tsx +73 -0
- package/src/models/UserDecision.tsx +10 -0
- package/src/models/UsercentricsAnalyticsEventType.tsx +15 -0
- package/src/models/UsercentricsCMPData.tsx +38 -0
- package/src/models/UsercentricsCategory.tsx +26 -0
- package/src/models/UsercentricsConsentType.tsx +5 -0
- package/src/models/UsercentricsConsentUserResponse.tsx +14 -0
- package/src/models/UsercentricsLabels.tsx +276 -0
- package/src/models/UsercentricsLocation.tsx +32 -0
- package/src/models/UsercentricsLoggerLevel.tsx +7 -0
- package/src/models/UsercentricsOptions.tsx +45 -0
- package/src/models/UsercentricsReadyStatus.tsx +20 -0
- package/src/models/UsercentricsService.tsx +134 -0
- package/src/models/UsercentricsServiceConsent.tsx +37 -0
- package/src/models/UsercentricsSettings.tsx +177 -0
- package/src/models/UsercentricsUserInteraction.tsx +7 -0
- package/src/models/UsercentricsVariant.tsx +6 -0
- package/src/models/index.tsx +29 -0
- package/android/src/androidTest/java/com/usercentrics/reactnativemodule/fake/FakePromise.kt +0 -67
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsPackage.kt +0 -22
- 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
|
@@ -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,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { TurboModule } from 'react-native';
|
|
2
2
|
import type { UsercentricsOptions, UsercentricsReadyStatus, BannerSettings, UsercentricsConsentUserResponse, UsercentricsServiceConsent, UsercentricsCMPData, AdditionalConsentModeData, TCFData, CCPAData, UserDecision, TCFUserDecisions } from './models';
|
|
3
3
|
export interface Spec extends TurboModule {
|
|
4
4
|
configure(options: UsercentricsOptions): void;
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
import { TurboModuleRegistry } from 'react-native';
|
|
2
|
-
|
|
1
|
+
import { NativeModules, TurboModuleRegistry } from 'react-native';
|
|
2
|
+
// Try to get TurboModule first, fallback to NativeModule
|
|
3
|
+
const RNUsercentricsModule = TurboModuleRegistry.get('RNUsercentricsModule') || NativeModules.RNUsercentricsModule;
|
|
4
|
+
if (!RNUsercentricsModule) {
|
|
5
|
+
throw new Error('Usercentrics React Native SDK: Native module not found. ' +
|
|
6
|
+
'Make sure the SDK is properly installed and linked. ' +
|
|
7
|
+
'For iOS, run "cd ios && pod install". ' +
|
|
8
|
+
'For Android, make sure autolinking is working correctly.');
|
|
9
|
+
}
|
|
10
|
+
export default RNUsercentricsModule;
|
|
3
11
|
//# sourceMappingURL=NativeUsercentrics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeUsercentrics.js","sourceRoot":"","sources":["../src/NativeUsercentrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"NativeUsercentrics.js","sourceRoot":"","sources":["../src/NativeUsercentrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAe,MAAM,cAAc,CAAC;AA8D/E,yDAAyD;AACzD,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,GAAG,CAAO,sBAAsB,CAAC,IAAI,aAAa,CAAC,oBAAoB,CAAC;AAEzH,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC1B,MAAM,IAAI,KAAK,CACb,0DAA0D;QAC1D,sDAAsD;QACtD,wCAAwC;QACxC,0DAA0D,CAC3D,CAAC;AACJ,CAAC;AAED,eAAe,oBAA4B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
configure(options: Object): void;
|
|
4
|
+
isReady(): Promise<Object>;
|
|
5
|
+
showFirstLayer(options?: Object): Promise<Object>;
|
|
6
|
+
showSecondLayer(options?: Object): Promise<Object>;
|
|
7
|
+
restoreUserSession(controllerId: string): Promise<Object>;
|
|
8
|
+
getControllerId(): Promise<string>;
|
|
9
|
+
clearUserSession(): Promise<Object>;
|
|
10
|
+
getConsents(): Promise<Array<Object>>;
|
|
11
|
+
getCMPData(): Promise<Object>;
|
|
12
|
+
getAdditionalConsentModeData(): Promise<Object>;
|
|
13
|
+
getTCFData(): Promise<Object>;
|
|
14
|
+
getUserSessionData(): Promise<string>;
|
|
15
|
+
getUSPData(): Promise<Object>;
|
|
16
|
+
getABTestingVariant(): Promise<string>;
|
|
17
|
+
setCMPId(id: number): void;
|
|
18
|
+
setABTestingVariant(variant: string): void;
|
|
19
|
+
changeLanguage(language: string): Promise<void>;
|
|
20
|
+
acceptAll(consentType: number): Promise<Array<Object>>;
|
|
21
|
+
acceptAllForTCF(fromLayer: number, consentType: number): Promise<Array<Object>>;
|
|
22
|
+
denyAll(consentType: number): Promise<Array<Object>>;
|
|
23
|
+
denyAllForTCF(fromLayer: number, consentType: number): Promise<Array<Object>>;
|
|
24
|
+
saveDecisions(decisions: Array<Object>, consentType: number): Promise<Array<Object>>;
|
|
25
|
+
saveDecisionsForTCF(tcfDecisions: Object, fromLayer: number, saveDecisions: Array<Object>, consentType: number): Promise<Array<Object>>;
|
|
26
|
+
saveOptOutForCCPA(isOptedOut: boolean, consentType: number): Promise<Array<Object>>;
|
|
27
|
+
track(event: number): void;
|
|
28
|
+
}
|
|
29
|
+
declare const _default: Spec | null;
|
|
30
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeUsercentricsModule.js","sourceRoot":"","sources":["../../src/fabric/NativeUsercentricsModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAiDnD,eAAe,mBAAmB,CAAC,GAAG,CAAO,sBAAsB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,99 +1,111 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
2
|
+
"name": "@usercentrics/react-native-sdk",
|
|
3
|
+
"version": "2.24.0",
|
|
4
|
+
"description": "Usercentrics SDK",
|
|
5
|
+
"homepage": "https://usercentrics.com",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"author": "Usercentrics <developer@usercentrics.com>",
|
|
9
|
+
"iosPackageName": "react-native-usercentrics",
|
|
10
|
+
"iosPackageVersion": "2.24.0",
|
|
11
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
12
|
+
"files": [
|
|
13
|
+
"android",
|
|
14
|
+
"ios",
|
|
15
|
+
"lib",
|
|
16
|
+
"src",
|
|
17
|
+
"react-native-usercentrics.podspec",
|
|
18
|
+
"react-native.config.js",
|
|
19
|
+
"!.DS_Store",
|
|
20
|
+
"!.gradle",
|
|
21
|
+
"!.idea",
|
|
22
|
+
"!build",
|
|
23
|
+
"!gradle",
|
|
24
|
+
"!*.iml",
|
|
25
|
+
"!gradlew",
|
|
26
|
+
"!gradlew.bat",
|
|
27
|
+
"!local.properties",
|
|
28
|
+
"!project.xcworkspace",
|
|
29
|
+
"!xcshareddata",
|
|
30
|
+
"!xcuserdata"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"compile": "rm -rf lib && tsc -p .",
|
|
34
|
+
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
|
35
|
+
"prepare": "yarn compile",
|
|
36
|
+
"test": "jest src/__tests__/index.test.ts",
|
|
37
|
+
"clean-all-caches": "./scripts/clean-all-caches.sh",
|
|
38
|
+
"install-dependencies": "./scripts/install-dependencies.sh",
|
|
39
|
+
"android": "./scripts/run-android.sh",
|
|
40
|
+
"run-android": "./scripts/run-android.sh",
|
|
41
|
+
"check-requirements": "./scripts/check-requirements.sh",
|
|
42
|
+
"auto-setup": "./scripts/auto-setup.sh",
|
|
43
|
+
"publish-local": "./scripts/publish-local.sh",
|
|
44
|
+
"prepublishOnly": "node scripts/generate-codegen-jni.js",
|
|
45
|
+
"pack:local": "node scripts/generate-codegen-jni.js && npm pack"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@babel/core": "^7.25.10",
|
|
49
|
+
"@babel/runtime": "^7.25.3",
|
|
50
|
+
"@react-native-community/cli": "^18.0.0",
|
|
51
|
+
"@react-native-community/cli-platform-android": "18.0.0",
|
|
52
|
+
"@react-native-community/cli-platform-ios": "18.0.0",
|
|
53
|
+
"@react-native-community/eslint-config": "^3.0.1",
|
|
54
|
+
"@react-native/babel-preset": "^0.81.1",
|
|
55
|
+
"@types/jest": "^29.5.2",
|
|
56
|
+
"@types/react-native": "^0.73.0",
|
|
57
|
+
"@types/react-test-renderer": "^19.0.0",
|
|
58
|
+
"babel-jest": "^29.5.0",
|
|
59
|
+
"eslint": "^8.44.0",
|
|
60
|
+
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
61
|
+
"jest": "^29.5.0",
|
|
62
|
+
"metro-react-native-babel-preset": "^0.77.0",
|
|
63
|
+
"react": "^19.1.0",
|
|
64
|
+
"react-native": "^0.79.6",
|
|
65
|
+
"react-native-codegen": "^0.0.7",
|
|
66
|
+
"react-test-renderer": "^19.1.0",
|
|
67
|
+
"typescript": "^5.8.3"
|
|
68
|
+
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"react": "*",
|
|
71
|
+
"react-native": "*"
|
|
72
|
+
},
|
|
73
|
+
"jest": {
|
|
74
|
+
"preset": "react-native",
|
|
75
|
+
"moduleFileExtensions": [
|
|
76
|
+
"ts",
|
|
77
|
+
"tsx",
|
|
78
|
+
"js",
|
|
79
|
+
"jsx",
|
|
80
|
+
"json",
|
|
81
|
+
"node"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
"directories": {
|
|
85
|
+
"example": "example",
|
|
86
|
+
"lib": "lib"
|
|
87
|
+
},
|
|
88
|
+
"repository": {
|
|
89
|
+
"type": "git",
|
|
90
|
+
"url": "https://github.com/Usercentrics/react-native-sdk"
|
|
91
|
+
},
|
|
92
|
+
"bugs": {
|
|
93
|
+
"url": "https://github.com/Usercentrics/react-native-sdk/issues"
|
|
94
|
+
},
|
|
95
|
+
"dependencies": {
|
|
96
|
+
"hermes-engine": "^0.11.0",
|
|
97
|
+
"install": "^0.13.0",
|
|
98
|
+
"npm": "^11.6.0",
|
|
99
|
+
"react-native-safe-area-context": "^5.6.1",
|
|
100
|
+
"react-native-screens": "^4.16.0",
|
|
101
|
+
"react-native-webview": "^13.16.0"
|
|
102
|
+
},
|
|
103
|
+
"codegenConfig": {
|
|
104
|
+
"name": "RNUsercentricsModule",
|
|
105
|
+
"type": "all",
|
|
106
|
+
"jsSrcsDir": "./src/fabric",
|
|
107
|
+
"android": {
|
|
108
|
+
"javaPackageName": "com.usercentrics.reactnative"
|
|
98
109
|
}
|
|
110
|
+
}
|
|
99
111
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
dependency: {
|
|
3
|
+
platforms: {
|
|
4
|
+
android: {
|
|
5
|
+
sourceDir: './android',
|
|
6
|
+
packageImportPath: 'import com.usercentrics.reactnative.RNUsercentricsPackage;',
|
|
7
|
+
packageInstance: 'new RNUsercentricsPackage()',
|
|
8
|
+
componentDescriptors: []
|
|
9
|
+
},
|
|
10
|
+
ios: {
|
|
11
|
+
sourceDir: './ios',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { NativeModules, TurboModuleRegistry, TurboModule } from 'react-native';
|
|
2
|
+
import type {
|
|
3
|
+
UsercentricsOptions,
|
|
4
|
+
UsercentricsReadyStatus,
|
|
5
|
+
BannerSettings,
|
|
6
|
+
UsercentricsConsentUserResponse,
|
|
7
|
+
UsercentricsServiceConsent,
|
|
8
|
+
UsercentricsCMPData,
|
|
9
|
+
AdditionalConsentModeData,
|
|
10
|
+
TCFData,
|
|
11
|
+
CCPAData,
|
|
12
|
+
UserDecision,
|
|
13
|
+
TCFUserDecisions,
|
|
14
|
+
} from './models';
|
|
15
|
+
|
|
16
|
+
export interface Spec extends TurboModule {
|
|
17
|
+
// Configuration
|
|
18
|
+
configure(options: UsercentricsOptions): void;
|
|
19
|
+
isReady(): Promise<UsercentricsReadyStatus>;
|
|
20
|
+
|
|
21
|
+
// UI Methods
|
|
22
|
+
showFirstLayer(options?: BannerSettings): Promise<UsercentricsConsentUserResponse>;
|
|
23
|
+
showSecondLayer(options?: BannerSettings): Promise<UsercentricsConsentUserResponse>;
|
|
24
|
+
|
|
25
|
+
// Session Management
|
|
26
|
+
restoreUserSession(controllerId: string): Promise<UsercentricsReadyStatus>;
|
|
27
|
+
getControllerId(): Promise<string>;
|
|
28
|
+
clearUserSession(): Promise<UsercentricsReadyStatus>;
|
|
29
|
+
|
|
30
|
+
// Data Retrieval
|
|
31
|
+
getConsents(): Promise<Array<UsercentricsServiceConsent>>;
|
|
32
|
+
getCMPData(): Promise<UsercentricsCMPData>;
|
|
33
|
+
getAdditionalConsentModeData(): Promise<AdditionalConsentModeData>;
|
|
34
|
+
getTCFData(): Promise<TCFData>;
|
|
35
|
+
getUserSessionData(): Promise<string>;
|
|
36
|
+
getUSPData(): Promise<CCPAData>;
|
|
37
|
+
getABTestingVariant(): Promise<string>;
|
|
38
|
+
|
|
39
|
+
// Configuration Setters
|
|
40
|
+
setCMPId(id: number): void;
|
|
41
|
+
setABTestingVariant(variant: string): void;
|
|
42
|
+
changeLanguage(language: string): Promise<void>;
|
|
43
|
+
|
|
44
|
+
// Consent Actions
|
|
45
|
+
acceptAll(consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
46
|
+
acceptAllForTCF(fromLayer: number, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
47
|
+
denyAll(consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
48
|
+
denyAllForTCF(fromLayer: number, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
49
|
+
|
|
50
|
+
saveDecisions(decisions: Array<UserDecision>, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
51
|
+
saveDecisionsForTCF(
|
|
52
|
+
tcfDecisions: TCFUserDecisions,
|
|
53
|
+
fromLayer: number,
|
|
54
|
+
saveDecisions: Array<UserDecision>,
|
|
55
|
+
consentType: number
|
|
56
|
+
): Promise<Array<UsercentricsServiceConsent>>;
|
|
57
|
+
saveOptOutForCCPA(isOptedOut: boolean, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
58
|
+
|
|
59
|
+
// Analytics
|
|
60
|
+
track(event: number): void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Try to get TurboModule first, fallback to NativeModule
|
|
64
|
+
const RNUsercentricsModule = TurboModuleRegistry.get<Spec>('RNUsercentricsModule') || NativeModules.RNUsercentricsModule;
|
|
65
|
+
|
|
66
|
+
if (!RNUsercentricsModule) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
'Usercentrics React Native SDK: Native module not found. ' +
|
|
69
|
+
'Make sure the SDK is properly installed and linked. ' +
|
|
70
|
+
'For iOS, run "cd ios && pod install". ' +
|
|
71
|
+
'For Android, make sure autolinking is working correctly.'
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export default RNUsercentricsModule as Spec;
|