@usercentrics/react-native-sdk 2.23.3 → 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 (53) hide show
  1. package/README.md +5 -5
  2. package/android/build-legacy.gradle +11 -1
  3. package/android/build.gradle.kts +35 -17
  4. package/android/gradle.properties +1 -3
  5. package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsPackage.kt +37 -8
  6. package/android/src/main/jni/CMakeLists.txt +85 -0
  7. package/android/src/main/jni/RNUsercentricsModule.cpp +21 -0
  8. package/android/src/main/jni/rn_usercentrics.cpp +22 -0
  9. package/lib/NativeUsercentrics.d.ts +2 -1
  10. package/lib/NativeUsercentrics.js +3 -2
  11. package/lib/NativeUsercentrics.js.map +1 -1
  12. package/lib/fabric/NativeUsercentricsModule.d.ts +30 -0
  13. package/lib/fabric/NativeUsercentricsModule.js +3 -0
  14. package/lib/fabric/NativeUsercentricsModule.js.map +1 -0
  15. package/package.json +15 -4
  16. package/react-native.config.js +15 -0
  17. package/src/NativeUsercentrics.ts +75 -0
  18. package/src/Usercentrics.tsx +145 -0
  19. package/src/__tests__/index.test.ts +476 -0
  20. package/src/__tests__/mocks.ts +402 -0
  21. package/src/fabric/NativeUsercentricsModule.ts +51 -0
  22. package/src/index.tsx +2 -0
  23. package/src/models/AdditionalConsentModeData.tsx +33 -0
  24. package/src/models/BannerSettings.tsx +117 -0
  25. package/src/models/CCPAData.tsx +32 -0
  26. package/src/models/CCPASettings.tsx +49 -0
  27. package/src/models/ConsentDisclosureObject.tsx +47 -0
  28. package/src/models/FirstLayerSettings.tsx +185 -0
  29. package/src/models/GeolocationRuleset.tsx +10 -0
  30. package/src/models/LegalBasisLocalization.tsx +100 -0
  31. package/src/models/NetworkMode.tsx +5 -0
  32. package/src/models/SecondLayerSettings.tsx +12 -0
  33. package/src/models/TCF2Settings.tsx +209 -0
  34. package/src/models/TCFData.tsx +297 -0
  35. package/src/models/TCFDecisionUILayer.tsx +5 -0
  36. package/src/models/TCFUserDecisions.tsx +73 -0
  37. package/src/models/UserDecision.tsx +10 -0
  38. package/src/models/UsercentricsAnalyticsEventType.tsx +15 -0
  39. package/src/models/UsercentricsCMPData.tsx +38 -0
  40. package/src/models/UsercentricsCategory.tsx +26 -0
  41. package/src/models/UsercentricsConsentType.tsx +5 -0
  42. package/src/models/UsercentricsConsentUserResponse.tsx +14 -0
  43. package/src/models/UsercentricsLabels.tsx +276 -0
  44. package/src/models/UsercentricsLocation.tsx +32 -0
  45. package/src/models/UsercentricsLoggerLevel.tsx +7 -0
  46. package/src/models/UsercentricsOptions.tsx +45 -0
  47. package/src/models/UsercentricsReadyStatus.tsx +20 -0
  48. package/src/models/UsercentricsService.tsx +134 -0
  49. package/src/models/UsercentricsServiceConsent.tsx +37 -0
  50. package/src/models/UsercentricsSettings.tsx +177 -0
  51. package/src/models/UsercentricsUserInteraction.tsx +7 -0
  52. package/src/models/UsercentricsVariant.tsx +6 -0
  53. package/src/models/index.tsx +29 -0
package/README.md CHANGED
@@ -25,22 +25,22 @@ The Usercentrics Apps SDK is a native Consent Management Platform solution for m
25
25
  ## 📋 Requirements
26
26
 
27
27
  ### Mobile Platforms
28
- * **Android 5.0 (API 21)** or higher
28
+ * **Android 7.0 (API 24)** or higher
29
29
  * **iOS 11** or higher
30
30
 
31
31
  ### Development Environment
32
32
  * **Node.js 18.0+** (LTS recommended)
33
33
  * **npm 9.0+** or **Yarn 1.22+**
34
34
  * **TypeScript 5.1+**
35
- * **React 18.2+**
35
+ * **React 18.2+** (React 19 supported)
36
36
  * **React Native 0.74.3+** (with Fabric support)
37
37
 
38
38
  ### Android Development
39
39
  * **Java 17+** (OpenJDK or Oracle JDK)
40
- * **Android SDK** with API 33+ platforms
40
+ * **Android SDK** with API 34+ platforms
41
41
  * **Android NDK 25+**
42
- * **Gradle 8.2+**
43
- * **Kotlin 1.9.22+**
42
+ * **Gradle 8.2+** (Gradle 8.13 used)
43
+ * **Kotlin 1.9.22+** (Kotlin 2.0.21 recommended)
44
44
  * **Android Gradle Plugin 8.2+**
45
45
 
46
46
  ### iOS Development (macOS only)
@@ -1,4 +1,4 @@
1
- def usercentrics_version = "2.23.3"
1
+ def usercentrics_version = "2.24.0"
2
2
  version usercentrics_version
3
3
 
4
4
  buildscript {
@@ -78,4 +78,14 @@ dependencies {
78
78
  androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.3'
79
79
  androidTestImplementation 'androidx.test:runner:1.4.0'
80
80
  androidTestImplementation 'androidx.test:rules:1.4.0'
81
+ }
82
+
83
+ // Fix for Gradle task dependency issue with React Native autolinking
84
+ // This ensures that packageReleaseResources task waits for generateReleaseResValues to complete
85
+ afterEvaluate {
86
+ if (project.tasks.findByName("packageReleaseResources") && project.tasks.findByName(":usercentrics_react-native-sdk:generateReleaseResValues")) {
87
+ project.tasks.named("packageReleaseResources").configure {
88
+ dependsOn(":usercentrics_react-native-sdk:generateReleaseResValues")
89
+ }
90
+ }
81
91
  }
@@ -1,10 +1,21 @@
1
+ val usercentricsVersion = "2.24.0"
2
+ val reactNativeVersion = "+"
3
+
4
+ fun BooleanProperty(name: String): Boolean {
5
+ return project.hasProperty(name) && project.property(name) == "true"
6
+ }
7
+
8
+ val isNewArchitectureEnabled = BooleanProperty("newArchEnabled")
9
+ val isHermesEnabled = BooleanProperty("hermesEnabled")
10
+
1
11
  plugins {
2
12
  id("com.android.library")
3
- id("org.jetbrains.kotlin.android")
13
+ id("kotlin-android")
4
14
  }
5
15
 
6
- val usercentricsVersion = "2.23.3"
7
- val reactNativeVersion = "0.79.6"
16
+ if (isNewArchitectureEnabled) {
17
+ apply(plugin = "com.facebook.react")
18
+ }
8
19
 
9
20
  android {
10
21
  namespace = "com.usercentrics.reactnative"
@@ -16,15 +27,14 @@ android {
16
27
  testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
17
28
  consumerProguardFiles("proguard-rules.pro")
18
29
 
19
- val isNewArchEnabled = project.findProperty("newArchEnabled") == "true"
20
- val isHermesEnabled = project.findProperty("hermesEnabled") == "true"
21
-
22
- buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchEnabled.toString())
30
+ // BuildConfig flags
31
+ buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled.toString())
23
32
  buildConfigField("boolean", "IS_HERMES_ENABLED", isHermesEnabled.toString())
24
-
33
+
25
34
  ndk {
26
35
  abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
27
36
  }
37
+
28
38
  }
29
39
 
30
40
  compileOptions {
@@ -35,14 +45,12 @@ android {
35
45
  kotlinOptions {
36
46
  jvmTarget = "17"
37
47
  }
38
-
39
- compileOptions {
40
- sourceCompatibility = JavaVersion.VERSION_17
41
- targetCompatibility = JavaVersion.VERSION_17
42
- }
43
48
 
44
49
  sourceSets {
45
- getByName("main").java.srcDirs("src/main/kotlin")
50
+ getByName("main").java.srcDirs(
51
+ "src/main/kotlin",
52
+ "$buildDir/generated/codegen/NativeModules"
53
+ )
46
54
  }
47
55
 
48
56
  buildFeatures {
@@ -54,23 +62,33 @@ android {
54
62
  useLegacyPackaging = false
55
63
  }
56
64
  }
65
+
57
66
  }
58
67
 
59
68
  dependencies {
60
69
  implementation("com.facebook.react:react-android:$reactNativeVersion")
61
70
  implementation("com.usercentrics.sdk:usercentrics-ui:$usercentricsVersion")
62
71
 
63
- // Unit tests (JVM)
72
+ // Unit tests
64
73
  testImplementation("junit:junit:4.13.2")
65
74
  testImplementation("io.mockk:mockk:1.13.12")
66
75
  testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0")
67
- testImplementation("com.facebook.react:react-android:$reactNativeVersion")
68
76
 
69
- // Instrumented tests (Android)
77
+ // Instrumented tests
70
78
  androidTestImplementation("com.facebook.react:react-android:$reactNativeVersion")
71
79
  androidTestImplementation("io.mockk:mockk-android:1.12.0")
72
80
  androidTestImplementation("junit:junit:4.13.2")
73
81
  androidTestImplementation("androidx.test.ext:junit-ktx:1.1.3")
74
82
  androidTestImplementation("androidx.test:runner:1.4.0")
75
83
  androidTestImplementation("androidx.test:rules:1.4.0")
84
+ }
85
+
86
+ // Fix for Gradle task dependency issue with React Native autolinking
87
+ // This ensures that packageReleaseResources task waits for generateReleaseResValues to complete
88
+ afterEvaluate {
89
+ if (project.tasks.findByName("packageReleaseResources") != null && project.tasks.findByName(":usercentrics_react-native-sdk:generateReleaseResValues") != null) {
90
+ project.tasks.named("packageReleaseResources").configure {
91
+ dependsOn(":usercentrics_react-native-sdk:generateReleaseResValues")
92
+ }
93
+ }
76
94
  }
@@ -2,6 +2,4 @@ org.gradle.jvmargs=-Xmx2048M
2
2
  android.useAndroidX=true
3
3
  android.enableJetifier=true
4
4
 
5
- reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
6
-
7
- hermesEnabled=true
5
+ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
@@ -1,22 +1,51 @@
1
1
  package com.usercentrics.reactnative
2
2
 
3
- import com.facebook.react.ReactPackage
3
+ import com.facebook.react.TurboReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.annotations.ReactModuleList
7
+ import com.facebook.react.module.model.ReactModuleInfo
8
+ import com.facebook.react.module.model.ReactModuleInfoProvider
6
9
  import com.facebook.react.uimanager.ViewManager
7
- import com.facebook.react.turbomodule.core.interfaces.TurboModule
8
10
  import com.usercentrics.reactnative.api.UsercentricsProxyImpl
9
11
 
10
- class RNUsercentricsPackage : ReactPackage {
12
+ @ReactModuleList(
13
+ nativeModules = [
14
+ RNUsercentricsModule::class,
15
+ ],
16
+ )
17
+ class RNUsercentricsPackage : TurboReactPackage() {
11
18
 
12
19
  private val usercentricsProxy = UsercentricsProxyImpl()
13
20
 
14
- override fun createViewManagers(reactContext: ReactApplicationContext): MutableList<ViewManager<*, *>> {
15
- return mutableListOf()
21
+ override fun getModule(s: String, reactApplicationContext: ReactApplicationContext): NativeModule? {
22
+ when (s) {
23
+ RNUsercentricsModule.NAME -> {
24
+ val reactContextProvider = ReactContextProviderImpl(reactApplicationContext)
25
+ return RNUsercentricsModule(reactApplicationContext, usercentricsProxy, reactContextProvider)
26
+ }
27
+ }
28
+ return null
16
29
  }
17
30
 
18
- override fun createNativeModules(reactContext: ReactApplicationContext): MutableList<NativeModule> {
19
- val reactContextProvider = ReactContextProviderImpl(reactContext)
20
- return mutableListOf(RNUsercentricsModule(reactContext, usercentricsProxy, reactContextProvider))
31
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =
32
+ ReactModuleInfoProvider {
33
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
34
+ val isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
35
+ moduleInfos[RNUsercentricsModule.NAME] =
36
+ ReactModuleInfo(
37
+ RNUsercentricsModule.NAME,
38
+ RNUsercentricsModule.NAME,
39
+ false, // canOverrideExistingModule
40
+ false, // needsEagerInit
41
+ true, // hasConstants
42
+ false, // isCxxModule
43
+ isTurboModule,
44
+ )
45
+ moduleInfos
46
+ }
47
+
48
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
49
+ return emptyList()
21
50
  }
22
51
  }
@@ -0,0 +1,85 @@
1
+ cmake_minimum_required(VERSION 3.13)
2
+ set(CMAKE_VERBOSE_MAKEFILE ON)
3
+
4
+ # Set library name
5
+ set(LIB_TARGET_NAME react_codegen_RNUsercentricsModule)
6
+
7
+ # Add compile options
8
+ add_compile_options(
9
+ -fexceptions
10
+ -frtti
11
+ -std=c++20
12
+ -Wall
13
+ -Wpedantic
14
+ -Wno-gnu-zero-variadic-macro-arguments
15
+ -Wno-dollar-in-identifier-extension
16
+ )
17
+
18
+ # Find source files
19
+ file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp)
20
+
21
+ # Create the library
22
+ add_library(
23
+ ${LIB_TARGET_NAME}
24
+ SHARED
25
+ ${LIB_CUSTOM_SRCS}
26
+ )
27
+
28
+ # Include directories
29
+ target_include_directories(
30
+ ${LIB_TARGET_NAME}
31
+ PUBLIC
32
+ .
33
+ )
34
+
35
+ # Link libraries based on React Native version
36
+ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
37
+ target_link_libraries(
38
+ ${LIB_TARGET_NAME}
39
+ ReactAndroid::reactnative
40
+ ReactAndroid::jsi
41
+ fbjni::fbjni
42
+ )
43
+ else()
44
+ target_link_libraries(
45
+ ${LIB_TARGET_NAME}
46
+ fbjni
47
+ folly_runtime
48
+ glog
49
+ jsi
50
+ react_codegen_rncore
51
+ react_debug
52
+ react_nativemodule_core
53
+ react_render_core
54
+ react_render_debug
55
+ react_render_graphics
56
+ react_render_mapbuffer
57
+ react_render_componentregistry
58
+ react_utils
59
+ rrc_view
60
+ turbomodulejsijni
61
+ yoga
62
+ )
63
+ endif()
64
+
65
+ # Compile options based on React Native version
66
+ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 80)
67
+ target_compile_reactnative_options(${LIB_TARGET_NAME} PRIVATE)
68
+ else()
69
+ target_compile_options(
70
+ ${LIB_TARGET_NAME}
71
+ PRIVATE
72
+ -DLOG_TAG=\"ReactNative\"
73
+ -fexceptions
74
+ -frtti
75
+ -std=c++20
76
+ -Wall
77
+ )
78
+ endif()
79
+
80
+ # Additional include directories
81
+ target_include_directories(
82
+ ${CMAKE_PROJECT_NAME}
83
+ PUBLIC
84
+ ${CMAKE_CURRENT_SOURCE_DIR}
85
+ )
@@ -0,0 +1,21 @@
1
+ #include <ReactCommon/JavaTurboModule.h>
2
+ #include <ReactCommon/TurboModule.h>
3
+ #include <jsi/jsi.h>
4
+
5
+ namespace facebook {
6
+ namespace react {
7
+
8
+ JSI_EXPORT
9
+ std::shared_ptr<TurboModule> RNUsercentricsModule_ModuleProvider(
10
+ const std::string &moduleName,
11
+ const JavaTurboModule::InitParams &params) {
12
+ // This is a placeholder implementation
13
+ // The actual module is implemented in Java/Kotlin
14
+ return nullptr;
15
+ }
16
+
17
+ } // namespace react
18
+ } // namespace facebook
19
+
20
+
21
+
@@ -0,0 +1,22 @@
1
+ #include <jni.h>
2
+ #include <jsi/jsi.h>
3
+ #include <fbjni/fbjni.h>
4
+ #include <ReactCommon/CallInvokerHolder.h>
5
+ #include <ReactCommon/TurboModuleUtils.h>
6
+
7
+ namespace facebook {
8
+ namespace react {
9
+
10
+ // This is a minimal C++ TurboModule bridge that delegates to the Kotlin implementation
11
+ // The actual TurboModule implementation is in RNUsercentricsModule.kt
12
+
13
+ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
14
+ return facebook::jni::initialize(vm, [] {
15
+ // No additional initialization needed
16
+ // The Kotlin TurboModule will be loaded via TurboReactPackage
17
+ });
18
+ }
19
+
20
+ } // namespace react
21
+ } // namespace facebook
22
+
@@ -1,5 +1,6 @@
1
+ import { TurboModule } from 'react-native';
1
2
  import type { UsercentricsOptions, UsercentricsReadyStatus, BannerSettings, UsercentricsConsentUserResponse, UsercentricsServiceConsent, UsercentricsCMPData, AdditionalConsentModeData, TCFData, CCPAData, UserDecision, TCFUserDecisions } from './models';
2
- export interface Spec {
3
+ export interface Spec extends TurboModule {
3
4
  configure(options: UsercentricsOptions): void;
4
5
  isReady(): Promise<UsercentricsReadyStatus>;
5
6
  showFirstLayer(options?: BannerSettings): Promise<UsercentricsConsentUserResponse>;
@@ -1,5 +1,6 @@
1
- import { NativeModules } from 'react-native';
2
- const { RNUsercentricsModule } = NativeModules;
1
+ import { NativeModules, TurboModuleRegistry } from 'react-native';
2
+ // Try to get TurboModule first, fallback to NativeModule
3
+ const RNUsercentricsModule = TurboModuleRegistry.get('RNUsercentricsModule') || NativeModules.RNUsercentricsModule;
3
4
  if (!RNUsercentricsModule) {
4
5
  throw new Error('Usercentrics React Native SDK: Native module not found. ' +
5
6
  'Make sure the SDK is properly installed and linked. ' +
@@ -1 +1 @@
1
- {"version":3,"file":"NativeUsercentrics.js","sourceRoot":"","sources":["../src/NativeUsercentrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA8D7C,MAAM,EAAE,oBAAoB,EAAE,GAAG,aAAa,CAAC;AAE/C,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"}
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,20 +1,21 @@
1
1
  {
2
2
  "name": "@usercentrics/react-native-sdk",
3
- "version": "2.23.3",
3
+ "version": "2.24.0",
4
4
  "description": "Usercentrics SDK",
5
5
  "homepage": "https://usercentrics.com",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
8
8
  "author": "Usercentrics <developer@usercentrics.com>",
9
9
  "iosPackageName": "react-native-usercentrics",
10
- "iosPackageVersion": "2.23.3",
10
+ "iosPackageVersion": "2.24.0",
11
11
  "license": "SEE LICENSE IN LICENSE",
12
12
  "files": [
13
13
  "android",
14
14
  "ios",
15
15
  "lib",
16
+ "src",
16
17
  "react-native-usercentrics.podspec",
17
- "!android/build",
18
+ "react-native.config.js",
18
19
  "!.DS_Store",
19
20
  "!.gradle",
20
21
  "!.idea",
@@ -39,7 +40,9 @@
39
40
  "run-android": "./scripts/run-android.sh",
40
41
  "check-requirements": "./scripts/check-requirements.sh",
41
42
  "auto-setup": "./scripts/auto-setup.sh",
42
- "publish-local": "./scripts/publish-local.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"
43
46
  },
44
47
  "devDependencies": {
45
48
  "@babel/core": "^7.25.10",
@@ -96,5 +99,13 @@
96
99
  "react-native-safe-area-context": "^5.6.1",
97
100
  "react-native-screens": "^4.16.0",
98
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"
109
+ }
99
110
  }
100
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;