@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 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
- ### Requirements
26
- * Android 5.0 (API 21) or higher with Kotlin 1.5 or higher
27
- * iOS 11 or higher
28
- * React 17.0 or higher
29
- * React Native 0.65 or higher
30
- * Node 14
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
- ## Sample Project
68
+ ## Quick Start
45
69
 
46
- To run the sample project, you will need to run npm install from both root and example folders:
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
- ### iOS
109
+ ### iOS (macOS only)
58
110
 
59
- From example folder:
60
- ```sh
61
- npx pod-install
62
- npx react-native run-ios
63
- ```
111
+ From example folder:
112
+ ```sh
113
+ npx pod-install
114
+ npx react-native run-ios
115
+ ```
64
116
 
65
- ### Android
117
+ ### Android
66
118
 
67
- Open the android folder using Android Studio in order to create essential files then run from example folder:
68
- ```sh
69
- npx react-native run-android
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
- ### Consent Mediation
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.0"
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=-Xmx1536M
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"/>
@@ -11,18 +11,18 @@ internal class RNUsercentricsModule(
11
11
  reactContext: ReactApplicationContext,
12
12
  private val usercentricsProxy: UsercentricsProxy,
13
13
  private val reactContextProvider: ReactContextProvider,
14
- ) : ReactContextBaseJavaModule(reactContext) {
14
+ ) : RNUsercentricsModuleSpec(reactContext) {
15
15
 
16
- override fun getName() = "RNUsercentricsModule"
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
  }
@@ -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
+ }
@@ -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
- for (rowElement in 0 until row.size()) {
114
- val element = row.getMap(rowElement)
115
- listRow.add(element.buttonSettingsFromMap(context))
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
- decisionList.add(
17
- UserDecision(
18
- map.getString("serviceId")!!,
19
- map.getBoolean("consent")
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 it.size()) {
30
- list.add(it.getMap(i).deserializeTCFUserDecisionOnPurpose())
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 it.size()) {
38
- list.add(it.getMap(i).deserializeTCFUserDecisionOnSpecialFeature())
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 it.size()) {
46
- list.add(it.getMap(i).deserializeTCFUserDecisionOnVendor())
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 it.size()) {
54
- list.add(it.getMap(i).deserializeAdTechProviderDecision())
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
  }