@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.
Files changed (92) hide show
  1. package/README.md +5 -5
  2. package/android/build-legacy.gradle +11 -1
  3. package/android/build.gradle.kts +44 -14
  4. package/android/gradle.properties +2 -0
  5. package/android/settings.gradle.kts +1 -1
  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/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModule.kt +3 -3
  9. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/RNUsercentricsModuleSpec.kt +1 -1
  10. package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsPackage.kt +51 -0
  11. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProvider.kt +1 -1
  12. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/ReactContextProviderImpl.kt +1 -1
  13. package/android/src/main/java/com/usercentrics/reactnative/UCRNFlag.kt +4 -0
  14. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/api/UsercentricsProxy.kt +2 -2
  15. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerFontExtensions.kt +1 -1
  16. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/BannerSettingsExtensions.kt +1 -1
  17. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/CCPADataExtensions.kt +1 -1
  18. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ConsentDisclosureSerializer.kt +1 -1
  19. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/ReadableMapExtensions.kt +1 -1
  20. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/TCFDataExtensions.kt +1 -1
  21. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserDecisionExtensions.kt +1 -1
  22. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UserOptionsExtensions.kt +1 -1
  23. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsCMPDataExtensions.kt +1 -1
  24. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsConsentUserResponseExtensions.kt +1 -1
  25. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsReadyStatusExtensions.kt +1 -1
  26. package/android/src/main/java/com/usercentrics/{reactnativeusercentrics → reactnative}/extensions/UsercentricsServiceConsentExtensions.kt +1 -1
  27. package/android/src/main/jni/CMakeLists.txt +85 -0
  28. package/android/src/main/jni/RNUsercentricsModule.cpp +21 -0
  29. package/android/src/main/jni/rn_usercentrics.cpp +22 -0
  30. package/android/src/test/java/com/usercentrics/reactnative/RNUsercentricsModuleTest.kt +159 -0
  31. package/android/src/test/java/com/usercentrics/reactnative/fake/FakePromise.kt +73 -0
  32. package/ios/Extensions/BannerSettings+Dict.swift +1 -0
  33. package/ios/Extensions/UIColor+Extensions.swift +1 -1
  34. package/ios/Extensions/UIImage+UsercentricsLogoDict.swift +1 -0
  35. package/ios/RNUsercentricsModule.swift +1 -0
  36. package/lib/NativeUsercentrics.d.ts +1 -1
  37. package/lib/NativeUsercentrics.js +10 -2
  38. package/lib/NativeUsercentrics.js.map +1 -1
  39. package/lib/fabric/NativeUsercentricsModule.d.ts +30 -0
  40. package/lib/fabric/NativeUsercentricsModule.js +3 -0
  41. package/lib/fabric/NativeUsercentricsModule.js.map +1 -0
  42. package/package.json +108 -96
  43. package/react-native.config.js +15 -0
  44. package/src/NativeUsercentrics.ts +75 -0
  45. package/src/Usercentrics.tsx +145 -0
  46. package/src/__tests__/index.test.ts +476 -0
  47. package/src/__tests__/mocks.ts +402 -0
  48. package/src/fabric/NativeUsercentricsModule.ts +51 -0
  49. package/src/index.tsx +2 -0
  50. package/src/models/AdditionalConsentModeData.tsx +33 -0
  51. package/src/models/BannerSettings.tsx +117 -0
  52. package/src/models/CCPAData.tsx +32 -0
  53. package/src/models/CCPASettings.tsx +49 -0
  54. package/src/models/ConsentDisclosureObject.tsx +47 -0
  55. package/src/models/FirstLayerSettings.tsx +185 -0
  56. package/src/models/GeolocationRuleset.tsx +10 -0
  57. package/src/models/LegalBasisLocalization.tsx +100 -0
  58. package/src/models/NetworkMode.tsx +5 -0
  59. package/src/models/SecondLayerSettings.tsx +12 -0
  60. package/src/models/TCF2Settings.tsx +209 -0
  61. package/src/models/TCFData.tsx +297 -0
  62. package/src/models/TCFDecisionUILayer.tsx +5 -0
  63. package/src/models/TCFUserDecisions.tsx +73 -0
  64. package/src/models/UserDecision.tsx +10 -0
  65. package/src/models/UsercentricsAnalyticsEventType.tsx +15 -0
  66. package/src/models/UsercentricsCMPData.tsx +38 -0
  67. package/src/models/UsercentricsCategory.tsx +26 -0
  68. package/src/models/UsercentricsConsentType.tsx +5 -0
  69. package/src/models/UsercentricsConsentUserResponse.tsx +14 -0
  70. package/src/models/UsercentricsLabels.tsx +276 -0
  71. package/src/models/UsercentricsLocation.tsx +32 -0
  72. package/src/models/UsercentricsLoggerLevel.tsx +7 -0
  73. package/src/models/UsercentricsOptions.tsx +45 -0
  74. package/src/models/UsercentricsReadyStatus.tsx +20 -0
  75. package/src/models/UsercentricsService.tsx +134 -0
  76. package/src/models/UsercentricsServiceConsent.tsx +37 -0
  77. package/src/models/UsercentricsSettings.tsx +177 -0
  78. package/src/models/UsercentricsUserInteraction.tsx +7 -0
  79. package/src/models/UsercentricsVariant.tsx +6 -0
  80. package/src/models/index.tsx +29 -0
  81. package/android/src/androidTest/java/com/usercentrics/reactnativemodule/fake/FakePromise.kt +0 -67
  82. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsPackage.kt +0 -22
  83. package/android/src/main/java/com/usercentrics/reactnativeusercentrics/UCRNFlag.kt +0 -4
  84. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/api/FakeUsercentricsProxy.kt +0 -0
  85. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetCMPDataMock.kt +0 -0
  86. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetConsentsMock.kt +0 -0
  87. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetTCFDataMock.kt +0 -0
  88. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUSPDataMock.kt +0 -0
  89. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/GetUserSessionDataMock.kt +0 -0
  90. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/ReactContextProviderMock.kt +0 -0
  91. /package/android/src/androidTest/java/com/usercentrics/{reactnativemodule → reactnative}/mock/SaveDecisionsForTCFMock.kt +0 -0
  92. /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,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,6 +2,7 @@ import Foundation
2
2
  import Usercentrics
3
3
  import UsercentricsUI
4
4
  import UIKit
5
+ import React
5
6
 
6
7
  #if RCT_NEW_ARCH_ENABLED
7
8
  #if canImport(RNUsercentricsModuleSpec)
@@ -1,4 +1,4 @@
1
- import type { TurboModule } from 'react-native';
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
- export default TurboModuleRegistry.getEnforcing('RNUsercentricsModule');
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":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA8DnD,eAAe,mBAAmB,CAAC,YAAY,CAAO,sBAAsB,CAAC,CAAC"}
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,3 @@
1
+ import { TurboModuleRegistry } from 'react-native';
2
+ export default TurboModuleRegistry.get('RNUsercentricsModule');
3
+ //# sourceMappingURL=NativeUsercentricsModule.js.map
@@ -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
- "name": "@usercentrics/react-native-sdk",
3
- "version": "2.23.2",
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.23.2",
11
- "license": "SEE LICENSE IN LICENSE",
12
- "files": [
13
- "android",
14
- "ios",
15
- "lib",
16
- "react-native-usercentrics.podspec",
17
- "!android/build",
18
- "!.DS_Store",
19
- "!.gradle",
20
- "!.idea",
21
- "!build",
22
- "!gradle",
23
- "!*.iml",
24
- "!gradlew",
25
- "!gradlew.bat",
26
- "!local.properties",
27
- "!project.xcworkspace",
28
- "!xcshareddata",
29
- "!xcuserdata"
30
- ],
31
- "scripts": {
32
- "compile": "rm -rf lib && tsc -p .",
33
- "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
34
- "prepare": "yarn compile",
35
- "test": "jest src/__tests__/index.test.ts",
36
- "clean-all-caches": "./scripts/clean-all-caches.sh",
37
- "install-dependencies": "./scripts/install-dependencies.sh",
38
- "android": "./scripts/run-android.sh",
39
- "run-android": "./scripts/run-android.sh",
40
- "check-requirements": "./scripts/check-requirements.sh",
41
- "auto-setup": "./scripts/auto-setup.sh"
42
- },
43
- "devDependencies": {
44
- "@babel/core": "^7.25.10",
45
- "@babel/runtime": "^7.25.3",
46
- "@react-native-community/cli": "^18.0.0",
47
- "@react-native-community/cli-platform-android": "18.0.0",
48
- "@react-native-community/cli-platform-ios": "18.0.0",
49
- "@react-native-community/eslint-config": "^3.0.1",
50
- "@react-native/babel-preset": "^0.81.1",
51
- "@types/jest": "^29.5.2",
52
- "@types/react-native": "^0.73.0",
53
- "@types/react-test-renderer": "^19.0.0",
54
- "babel-jest": "^29.5.0",
55
- "eslint": "^8.44.0",
56
- "eslint-plugin-simple-import-sort": "^10.0.0",
57
- "jest": "^29.5.0",
58
- "metro-react-native-babel-preset": "^0.77.0",
59
- "react": "^19.1.0",
60
- "react-native": "^0.79.6",
61
- "react-native-codegen": "^0.0.7",
62
- "react-test-renderer": "^19.1.0",
63
- "typescript": "^5.8.3"
64
- },
65
- "peerDependencies": {
66
- "react": "*",
67
- "react-native": "*"
68
- },
69
- "jest": {
70
- "preset": "react-native",
71
- "moduleFileExtensions": [
72
- "ts",
73
- "tsx",
74
- "js",
75
- "jsx",
76
- "json",
77
- "node"
78
- ]
79
- },
80
- "directories": {
81
- "example": "example",
82
- "lib": "lib"
83
- },
84
- "repository": {
85
- "type": "git",
86
- "url": "https://github.com/Usercentrics/react-native-sdk"
87
- },
88
- "bugs": {
89
- "url": "https://github.com/Usercentrics/react-native-sdk/issues"
90
- },
91
- "dependencies": {
92
- "hermes-engine": "^0.11.0",
93
- "install": "^0.13.0",
94
- "npm": "^11.6.0",
95
- "react-native-safe-area-context": "^5.6.1",
96
- "react-native-screens": "^4.16.0",
97
- "react-native-webview": "^13.16.0"
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;