@usercentrics/react-native-sdk 2.23.0 → 2.23.2
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 +64 -0
- package/android/gradle.properties +2 -2
- package/android/settings.gradle.kts +21 -0
- package/android/src/main/AndroidManifest.xml +1 -2
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsModule.kt +31 -27
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsModuleSpec.kt +99 -0
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsPackage.kt +1 -0
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/BannerSettingsExtensions.kt +4 -3
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/UserDecisionExtensions.kt +19 -17
- package/ios/RNUsercentricsModule.swift +24 -1
- package/ios/RNUsercentricsModuleSpec.h +103 -0
- package/lib/NativeUsercentrics.d.ts +31 -0
- package/lib/NativeUsercentrics.js +3 -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 +35 -17
- package/react-native-usercentrics.podspec +26 -3
- package/CHANGELOG.md +0 -822
- package/android/settings.gradle +0 -1
- /package/ios/{RNUsercentricsModule.m → RNUsercentricsModule.mm} +0 -0
package/README.md
CHANGED
|
@@ -22,12 +22,36 @@ The Usercentrics Apps SDK is a native Consent Management Platform solution for m
|
|
|
22
22
|
<img src="https://docs.usercentrics.com/cmp_in_app_sdk/latest/assets/media/predefinedUI.png" alt="Usercentrics UI" />
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
|
|
25
|
+
## 📋 Requirements
|
|
26
|
+
|
|
27
|
+
### Mobile Platforms
|
|
28
|
+
* **Android 5.0 (API 21)** or higher
|
|
29
|
+
* **iOS 11** or higher
|
|
30
|
+
|
|
31
|
+
### Development Environment
|
|
32
|
+
* **Node.js 18.0+** (LTS recommended)
|
|
33
|
+
* **npm 9.0+** or **Yarn 1.22+**
|
|
34
|
+
* **TypeScript 5.1+**
|
|
35
|
+
* **React 18.2+**
|
|
36
|
+
* **React Native 0.74.3+** (with Fabric support)
|
|
37
|
+
|
|
38
|
+
### Android Development
|
|
39
|
+
* **Java 17+** (OpenJDK or Oracle JDK)
|
|
40
|
+
* **Android SDK** with API 33+ platforms
|
|
41
|
+
* **Android NDK 25+**
|
|
42
|
+
* **Gradle 8.2+**
|
|
43
|
+
* **Kotlin 1.9.22+**
|
|
44
|
+
* **Android Gradle Plugin 8.2+**
|
|
45
|
+
|
|
46
|
+
### iOS Development (macOS only)
|
|
47
|
+
* **Xcode 15.0+** with iOS SDK
|
|
48
|
+
* **CocoaPods 1.12+**
|
|
49
|
+
* **iOS Simulators** (recommended)
|
|
50
|
+
|
|
51
|
+
### Optional but Recommended
|
|
52
|
+
* **Watchman** (for better file watching)
|
|
53
|
+
* **Git** (for version control)
|
|
54
|
+
* **SDKMan** (for Java version management)
|
|
31
55
|
|
|
32
56
|
## Get started!
|
|
33
57
|
|
|
@@ -41,35 +65,92 @@ Continue to our [documentation](https://usercentrics.com/docs/apps/intro/) for a
|
|
|
41
65
|
|
|
42
66
|
See the [example](https://github.com/Usercentrics/react-native/tree/master/example) directory for a complete sample app using Usercentrics.
|
|
43
67
|
|
|
44
|
-
##
|
|
68
|
+
## Quick Start
|
|
45
69
|
|
|
46
|
-
|
|
70
|
+
### 🚀 Automated Setup (Recommended)
|
|
47
71
|
|
|
72
|
+
The easiest way to get started is using our automated setup script:
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
# Check your development environment
|
|
76
|
+
npm run check-requirements
|
|
77
|
+
|
|
78
|
+
# Automatically install missing dependencies
|
|
79
|
+
npm run auto-setup
|
|
80
|
+
|
|
81
|
+
# Verify everything is ready
|
|
82
|
+
npm run check-requirements
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 📱 Running the Sample Project
|
|
86
|
+
|
|
87
|
+
### Option 1: Using Helper Scripts
|
|
88
|
+
```sh
|
|
89
|
+
# Install all dependencies
|
|
90
|
+
npm run install-dependencies
|
|
91
|
+
|
|
92
|
+
# Run Android app
|
|
93
|
+
npm run run-android
|
|
94
|
+
|
|
95
|
+
# Run iOS app (macOS only)
|
|
96
|
+
npm run ios
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Option 2: Manual Setup
|
|
48
100
|
* From root folder:
|
|
49
101
|
```sh
|
|
50
|
-
npm install
|
|
102
|
+
npm install --legacy-peer-deps
|
|
51
103
|
```
|
|
52
104
|
* From example folder:
|
|
53
105
|
```sh
|
|
54
|
-
npm install
|
|
106
|
+
npm install --legacy-peer-deps
|
|
55
107
|
```
|
|
56
108
|
|
|
57
|
-
|
|
109
|
+
### iOS (macOS only)
|
|
58
110
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
111
|
+
From example folder:
|
|
112
|
+
```sh
|
|
113
|
+
npx pod-install
|
|
114
|
+
npx react-native run-ios
|
|
115
|
+
```
|
|
64
116
|
|
|
65
|
-
|
|
117
|
+
### Android
|
|
66
118
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
119
|
+
Make sure you have Android SDK configured, then from example folder:
|
|
120
|
+
```sh
|
|
121
|
+
npx react-native run-android
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 🛠️ Development Scripts
|
|
125
|
+
|
|
126
|
+
| Script | Description |
|
|
127
|
+
|--------|-------------|
|
|
128
|
+
| `npm run auto-setup` | 🤖 Automatically install all required dependencies |
|
|
129
|
+
| `npm run check-requirements` | 🔍 Check development environment requirements |
|
|
130
|
+
| `npm run clean-all-caches` | 🧹 Clean all project and system caches |
|
|
131
|
+
| `npm run install-dependencies` | 📦 Install dependencies in root and example folders |
|
|
132
|
+
| `npm run run-android` | 🤖 Kill conflicting ports and run Android app |
|
|
133
|
+
|
|
134
|
+
### 🔧 Troubleshooting
|
|
135
|
+
|
|
136
|
+
If you encounter issues:
|
|
137
|
+
|
|
138
|
+
1. **Check Requirements**: `npm run check-requirements`
|
|
139
|
+
2. **Clean & Reinstall**: `npm run clean-all-caches && npm run install-dependencies`
|
|
140
|
+
3. **Auto Setup**: `npm run auto-setup` (installs missing tools)
|
|
141
|
+
4. **Manual Setup**: Follow the detailed error messages from check-requirements
|
|
142
|
+
|
|
143
|
+
### 📋 Environment Setup
|
|
144
|
+
|
|
145
|
+
The project includes intelligent scripts that will:
|
|
146
|
+
- ✅ Detect your operating system (macOS/Linux)
|
|
147
|
+
- ✅ Check for required tools and versions
|
|
148
|
+
- ✅ Install missing dependencies automatically
|
|
149
|
+
- ✅ Configure environment variables
|
|
150
|
+
- ✅ Apply necessary patches
|
|
151
|
+
- ✅ Verify the setup works correctly
|
|
71
152
|
|
|
72
|
-
|
|
153
|
+
## Consent Mediation
|
|
73
154
|
|
|
74
155
|
You can enable and run the Consent Mediation example in this example by following the [documentation](https://usercentrics.com/docs/apps/features/consent-mediation/#enable-mediation).
|
|
75
156
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
def usercentrics_version = "2.23.
|
|
1
|
+
def usercentrics_version = "2.23.2"
|
|
2
2
|
version usercentrics_version
|
|
3
3
|
|
|
4
4
|
buildscript {
|
|
@@ -27,6 +27,7 @@ apply plugin: 'com.android.library'
|
|
|
27
27
|
apply plugin: 'kotlin-android'
|
|
28
28
|
|
|
29
29
|
android {
|
|
30
|
+
namespace 'com.usercentrics.reactnative'
|
|
30
31
|
compileSdkVersion 33
|
|
31
32
|
|
|
32
33
|
compileOptions {
|
|
@@ -43,6 +44,22 @@ android {
|
|
|
43
44
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
44
45
|
consumerProguardFile "proguard-rules.pro"
|
|
45
46
|
}
|
|
47
|
+
|
|
48
|
+
buildTypes {
|
|
49
|
+
debug {
|
|
50
|
+
debuggable true
|
|
51
|
+
}
|
|
52
|
+
release {
|
|
53
|
+
minifyEnabled false
|
|
54
|
+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
publishing {
|
|
59
|
+
singleVariant('release') {
|
|
60
|
+
withSourcesJar()
|
|
61
|
+
}
|
|
62
|
+
}
|
|
46
63
|
}
|
|
47
64
|
|
|
48
65
|
repositories {
|
|
@@ -61,4 +78,4 @@ dependencies {
|
|
|
61
78
|
androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.3'
|
|
62
79
|
androidTestImplementation 'androidx.test:runner:1.4.0'
|
|
63
80
|
androidTestImplementation 'androidx.test:rules:1.4.0'
|
|
64
|
-
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
id("com.android.library")
|
|
3
|
+
id("org.jetbrains.kotlin.android")
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
val usercentricsVersion = "2.23.2"
|
|
7
|
+
val reactNativeVersion = "0.79.6"
|
|
8
|
+
|
|
9
|
+
android {
|
|
10
|
+
namespace = "com.usercentrics.reactnative"
|
|
11
|
+
compileSdk = 34
|
|
12
|
+
|
|
13
|
+
defaultConfig {
|
|
14
|
+
minSdk = 24
|
|
15
|
+
targetSdk = 34
|
|
16
|
+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
|
17
|
+
consumerProguardFiles("proguard-rules.pro")
|
|
18
|
+
|
|
19
|
+
val isNewArchEnabled = project.findProperty("newArchEnabled") == "true"
|
|
20
|
+
val isHermesEnabled = project.findProperty("hermesEnabled") == "true"
|
|
21
|
+
|
|
22
|
+
buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchEnabled.toString())
|
|
23
|
+
buildConfigField("boolean", "IS_HERMES_ENABLED", isHermesEnabled.toString())
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
compileOptions {
|
|
27
|
+
sourceCompatibility = JavaVersion.VERSION_17
|
|
28
|
+
targetCompatibility = JavaVersion.VERSION_17
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
kotlinOptions {
|
|
32
|
+
jvmTarget = "17"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
compileOptions {
|
|
36
|
+
sourceCompatibility = JavaVersion.VERSION_17
|
|
37
|
+
targetCompatibility = JavaVersion.VERSION_17
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
sourceSets {
|
|
41
|
+
getByName("main").java.srcDirs("src/main/kotlin")
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
buildFeatures {
|
|
45
|
+
buildConfig = true
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
packagingOptions {
|
|
49
|
+
jniLibs {
|
|
50
|
+
useLegacyPackaging = false
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
dependencies {
|
|
56
|
+
implementation("com.facebook.react:react-android:$reactNativeVersion")
|
|
57
|
+
implementation("com.usercentrics.sdk:usercentrics-ui:$usercentricsVersion")
|
|
58
|
+
|
|
59
|
+
androidTestImplementation("io.mockk:mockk-android:1.12.0")
|
|
60
|
+
androidTestImplementation("junit:junit:4.13.2")
|
|
61
|
+
androidTestImplementation("androidx.test.ext:junit-ktx:1.1.3")
|
|
62
|
+
androidTestImplementation("androidx.test:runner:1.4.0")
|
|
63
|
+
androidTestImplementation("androidx.test:rules:1.4.0")
|
|
64
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
org.gradle.jvmargs=-
|
|
1
|
+
org.gradle.jvmargs=-Xmx2048M
|
|
2
2
|
android.useAndroidX=true
|
|
3
|
-
android.enableJetifier=true
|
|
3
|
+
android.enableJetifier=true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
pluginManagement {
|
|
2
|
+
repositories {
|
|
3
|
+
google()
|
|
4
|
+
mavenCentral()
|
|
5
|
+
gradlePluginPortal()
|
|
6
|
+
}
|
|
7
|
+
plugins {
|
|
8
|
+
id("org.jetbrains.kotlin.android") version "2.1.20"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
dependencyResolutionManagement {
|
|
13
|
+
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
|
|
14
|
+
repositories {
|
|
15
|
+
google()
|
|
16
|
+
mavenCentral()
|
|
17
|
+
maven { url = uri("https://www.jitpack.io") }
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
rootProject.name = "usercentrics"
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
2
|
-
package="com.usercentrics.reactnativeusercentrics"></manifest>
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"/>
|
package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsModule.kt
CHANGED
|
@@ -11,18 +11,18 @@ internal class RNUsercentricsModule(
|
|
|
11
11
|
reactContext: ReactApplicationContext,
|
|
12
12
|
private val usercentricsProxy: UsercentricsProxy,
|
|
13
13
|
private val reactContextProvider: ReactContextProvider,
|
|
14
|
-
) :
|
|
14
|
+
) : RNUsercentricsModuleSpec(reactContext) {
|
|
15
15
|
|
|
16
|
-
override fun getName() =
|
|
16
|
+
override fun getName() = NAME
|
|
17
17
|
|
|
18
18
|
@ReactMethod
|
|
19
|
-
fun configure(options: ReadableMap) {
|
|
19
|
+
override fun configure(options: ReadableMap) {
|
|
20
20
|
val usercentricsOptions = options.usercentricsOptionsFromMap()
|
|
21
21
|
usercentricsProxy.initialize(reactApplicationContext, usercentricsOptions)
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
@ReactMethod
|
|
25
|
-
fun isReady(promise: Promise) {
|
|
25
|
+
override fun isReady(promise: Promise) {
|
|
26
26
|
usercentricsProxy.isReady({
|
|
27
27
|
promise.resolve(it.toWritableMap())
|
|
28
28
|
}, {
|
|
@@ -31,7 +31,7 @@ internal class RNUsercentricsModule(
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
@ReactMethod
|
|
34
|
-
fun showFirstLayer(options: ReadableMap?, promise: Promise) {
|
|
34
|
+
override fun showFirstLayer(options: ReadableMap?, promise: Promise) {
|
|
35
35
|
runOnUiThread {
|
|
36
36
|
try {
|
|
37
37
|
val context = reactContextProvider.context()
|
|
@@ -46,7 +46,7 @@ internal class RNUsercentricsModule(
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
@ReactMethod
|
|
49
|
-
fun showSecondLayer(options: ReadableMap?, promise: Promise) {
|
|
49
|
+
override fun showSecondLayer(options: ReadableMap?, promise: Promise) {
|
|
50
50
|
runOnUiThread {
|
|
51
51
|
try {
|
|
52
52
|
val context = reactContextProvider.context()
|
|
@@ -61,7 +61,7 @@ internal class RNUsercentricsModule(
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
@ReactMethod
|
|
64
|
-
fun restoreUserSession(controllerId: String, promise: Promise) {
|
|
64
|
+
override fun restoreUserSession(controllerId: String, promise: Promise) {
|
|
65
65
|
usercentricsProxy.instance.restoreUserSession(controllerId, {
|
|
66
66
|
promise.resolve(it.toWritableMap())
|
|
67
67
|
}, {
|
|
@@ -70,59 +70,59 @@ internal class RNUsercentricsModule(
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
@ReactMethod
|
|
73
|
-
fun getControllerId(promise: Promise) {
|
|
73
|
+
override fun getControllerId(promise: Promise) {
|
|
74
74
|
promise.resolve(usercentricsProxy.instance.getControllerId())
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
@ReactMethod
|
|
78
|
-
fun getABTestingVariant(promise: Promise) {
|
|
78
|
+
override fun getABTestingVariant(promise: Promise) {
|
|
79
79
|
promise.resolve(usercentricsProxy.instance.getABTestingVariant())
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
@ReactMethod
|
|
83
|
-
fun getConsents(promise: Promise) {
|
|
83
|
+
override fun getConsents(promise: Promise) {
|
|
84
84
|
promise.resolve(usercentricsProxy.instance.getConsents().toWritableArray())
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
@ReactMethod
|
|
88
|
-
fun getCMPData(promise: Promise) {
|
|
88
|
+
override fun getCMPData(promise: Promise) {
|
|
89
89
|
promise.resolve(usercentricsProxy.instance.getCMPData().serialize())
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
@ReactMethod
|
|
93
|
-
fun getAdditionalConsentModeData(promise: Promise) {
|
|
93
|
+
override fun getAdditionalConsentModeData(promise: Promise) {
|
|
94
94
|
promise.resolve(usercentricsProxy.instance.getAdditionalConsentModeData().serialize())
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
@ReactMethod
|
|
98
|
-
fun setCMPId(id: Int) {
|
|
98
|
+
override fun setCMPId(id: Int) {
|
|
99
99
|
usercentricsProxy.instance.setCMPId(id)
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
@ReactMethod
|
|
103
|
-
fun setABTestingVariant(variant: String) {
|
|
103
|
+
override fun setABTestingVariant(variant: String) {
|
|
104
104
|
usercentricsProxy.instance.setABTestingVariant(variant)
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
@ReactMethod
|
|
108
|
-
fun getTCFData(promise: Promise) {
|
|
108
|
+
override fun getTCFData(promise: Promise) {
|
|
109
109
|
usercentricsProxy.instance.getTCFData {
|
|
110
110
|
promise.resolve(it.serialize())
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
@ReactMethod
|
|
115
|
-
fun getUserSessionData(promise: Promise) {
|
|
115
|
+
override fun getUserSessionData(promise: Promise) {
|
|
116
116
|
promise.resolve(usercentricsProxy.instance.getUserSessionData())
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
@ReactMethod
|
|
120
|
-
fun getUSPData(promise: Promise) {
|
|
120
|
+
override fun getUSPData(promise: Promise) {
|
|
121
121
|
promise.resolve(usercentricsProxy.instance.getUSPData().serialize())
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
@ReactMethod
|
|
125
|
-
fun changeLanguage(language: String, promise: Promise) {
|
|
125
|
+
override fun changeLanguage(language: String, promise: Promise) {
|
|
126
126
|
usercentricsProxy.instance.changeLanguage(language, {
|
|
127
127
|
promise.resolve(null)
|
|
128
128
|
}, {
|
|
@@ -131,7 +131,7 @@ internal class RNUsercentricsModule(
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
@ReactMethod
|
|
134
|
-
fun acceptAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
|
|
134
|
+
override fun acceptAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
|
|
135
135
|
promise.resolve(
|
|
136
136
|
usercentricsProxy.instance.acceptAllForTCF(
|
|
137
137
|
TCFDecisionUILayer.values()[fromLayer], UsercentricsConsentType.values()[consentType]
|
|
@@ -140,7 +140,7 @@ internal class RNUsercentricsModule(
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
@ReactMethod
|
|
143
|
-
fun acceptAll(consentType: Int, promise: Promise) {
|
|
143
|
+
override fun acceptAll(consentType: Int, promise: Promise) {
|
|
144
144
|
promise.resolve(
|
|
145
145
|
usercentricsProxy.instance.acceptAll(
|
|
146
146
|
UsercentricsConsentType.values()[consentType]
|
|
@@ -149,7 +149,7 @@ internal class RNUsercentricsModule(
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
@ReactMethod
|
|
152
|
-
fun denyAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
|
|
152
|
+
override fun denyAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
|
|
153
153
|
promise.resolve(
|
|
154
154
|
usercentricsProxy.instance.denyAllForTCF(
|
|
155
155
|
TCFDecisionUILayer.values()[fromLayer], UsercentricsConsentType.values()[consentType]
|
|
@@ -158,7 +158,7 @@ internal class RNUsercentricsModule(
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
@ReactMethod
|
|
161
|
-
fun denyAll(consentType: Int, promise: Promise) {
|
|
161
|
+
override fun denyAll(consentType: Int, promise: Promise) {
|
|
162
162
|
promise.resolve(
|
|
163
163
|
usercentricsProxy.instance.denyAll(
|
|
164
164
|
UsercentricsConsentType.values()[consentType]
|
|
@@ -167,7 +167,7 @@ internal class RNUsercentricsModule(
|
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
@ReactMethod
|
|
170
|
-
fun saveDecisionsForTCF(
|
|
170
|
+
override fun saveDecisionsForTCF(
|
|
171
171
|
tcfDecisions: ReadableMap,
|
|
172
172
|
fromLayer: Int,
|
|
173
173
|
saveDecisions: ReadableArray,
|
|
@@ -185,7 +185,7 @@ internal class RNUsercentricsModule(
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
@ReactMethod
|
|
188
|
-
fun saveDecisions(decisions: ReadableArray, consentType: Int, promise: Promise) {
|
|
188
|
+
override fun saveDecisions(decisions: ReadableArray, consentType: Int, promise: Promise) {
|
|
189
189
|
promise.resolve(
|
|
190
190
|
usercentricsProxy.instance.saveDecisions(
|
|
191
191
|
decisions.deserializeUserDecision(), UsercentricsConsentType.values()[consentType]
|
|
@@ -194,7 +194,7 @@ internal class RNUsercentricsModule(
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
@ReactMethod
|
|
197
|
-
fun saveOptOutForCCPA(isOptedOut: Boolean, consentType: Int, promise: Promise) {
|
|
197
|
+
override fun saveOptOutForCCPA(isOptedOut: Boolean, consentType: Int, promise: Promise) {
|
|
198
198
|
promise.resolve(
|
|
199
199
|
usercentricsProxy.instance.saveOptOutForCCPA(
|
|
200
200
|
isOptedOut, UsercentricsConsentType.values()[consentType]
|
|
@@ -203,12 +203,12 @@ internal class RNUsercentricsModule(
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
@ReactMethod
|
|
206
|
-
fun track(event: Int) {
|
|
206
|
+
override fun track(event: Int) {
|
|
207
207
|
usercentricsProxy.instance.track(UsercentricsAnalyticsEventType.values()[event])
|
|
208
208
|
}
|
|
209
209
|
|
|
210
210
|
@ReactMethod
|
|
211
|
-
fun clearUserSession(promise: Promise) {
|
|
211
|
+
override fun clearUserSession(promise: Promise) {
|
|
212
212
|
usercentricsProxy.instance.clearUserSession({
|
|
213
213
|
promise.resolve(it.toWritableMap())
|
|
214
214
|
}, {
|
|
@@ -219,4 +219,8 @@ internal class RNUsercentricsModule(
|
|
|
219
219
|
private fun runOnUiThread(block: () -> Unit) {
|
|
220
220
|
UiThreadUtil.runOnUiThread(block)
|
|
221
221
|
}
|
|
222
|
+
|
|
223
|
+
companion object {
|
|
224
|
+
const val NAME = "RNUsercentricsModule"
|
|
225
|
+
}
|
|
222
226
|
}
|
package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsModuleSpec.kt
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
package com.usercentrics.reactnativeusercentrics
|
|
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
|
+
}
|
package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsPackage.kt
CHANGED
|
@@ -4,6 +4,7 @@ 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.facebook.react.turbomodule.core.interfaces.TurboModule
|
|
7
8
|
import com.usercentrics.reactnativeusercentrics.api.UsercentricsProxyImpl
|
|
8
9
|
|
|
9
10
|
class RNUsercentricsPackage : ReactPackage {
|
|
@@ -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
|
}
|
|
@@ -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
|
}
|