@usercentrics/react-native-sdk 2.24.1 → 2.24.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/android/build-legacy.gradle +1 -1
- package/android/build.gradle.kts +1 -1
- package/android/src/androidTest/java/com/usercentrics/reactnative/RNUsercentricsModuleTest.kt +4 -3
- package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsModule.kt +2 -2
- package/android/src/main/java/com/usercentrics/reactnative/RNUsercentricsModuleSpec.kt +1 -1
- package/android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt +13 -0
- package/android/src/main/jni/CMakeLists.txt +26 -35
- package/ios/Manager/UsercentricsManager.swift +3 -3
- package/ios/RNUsercentricsModule.mm +1 -0
- package/ios/RNUsercentricsModule.swift +12 -1
- package/ios/RNUsercentricsModuleSpec.h +1 -0
- package/lib/NativeUsercentrics.d.ts +2 -2
- package/lib/NativeUsercentrics.js.map +1 -1
- package/lib/Usercentrics.d.ts +2 -2
- package/lib/Usercentrics.js +2 -2
- package/lib/Usercentrics.js.map +1 -1
- package/lib/fabric/NativeUsercentricsModule.d.ts +1 -1
- package/package.json +3 -11
- package/react-native-usercentrics.podspec +41 -7
- package/src/NativeUsercentrics.ts +2 -1
- package/src/Usercentrics.tsx +3 -2
- package/src/fabric/NativeUsercentricsModule.ts +1 -1
package/android/build.gradle.kts
CHANGED
package/android/src/androidTest/java/com/usercentrics/reactnative/RNUsercentricsModuleTest.kt
CHANGED
|
@@ -517,7 +517,7 @@ class RNUsercentricsModuleTest {
|
|
|
517
517
|
val usercentricsSDK = mockk<UsercentricsSDK>()
|
|
518
518
|
every {
|
|
519
519
|
usercentricsSDK.denyAllForTCF(
|
|
520
|
-
any(), any()
|
|
520
|
+
any(), any(), any()
|
|
521
521
|
)
|
|
522
522
|
}.returns(GetConsentsMock.fakeWithData)
|
|
523
523
|
|
|
@@ -527,11 +527,12 @@ class RNUsercentricsModuleTest {
|
|
|
527
527
|
RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
|
|
528
528
|
|
|
529
529
|
val promise = FakePromise()
|
|
530
|
-
|
|
530
|
+
val emptyArray = JavaOnlyArray()
|
|
531
|
+
module.denyAllForTCF(0, 0, emptyArray, promise)
|
|
531
532
|
|
|
532
533
|
verify(exactly = 1) {
|
|
533
534
|
usercentricsSDK.denyAllForTCF(
|
|
534
|
-
TCFDecisionUILayer.FIRST_LAYER, UsercentricsConsentType.EXPLICIT
|
|
535
|
+
TCFDecisionUILayer.FIRST_LAYER, UsercentricsConsentType.EXPLICIT, null
|
|
535
536
|
)
|
|
536
537
|
}
|
|
537
538
|
|
|
@@ -149,10 +149,10 @@ internal class RNUsercentricsModule(
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
@ReactMethod
|
|
152
|
-
override fun denyAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
|
|
152
|
+
override fun denyAllForTCF(fromLayer: Int, consentType: Int, unsavedPurposeLIDecisions: ReadableArray, promise: Promise) {
|
|
153
153
|
promise.resolve(
|
|
154
154
|
usercentricsProxy.instance.denyAllForTCF(
|
|
155
|
-
TCFDecisionUILayer.values()[fromLayer], UsercentricsConsentType.values()[consentType]
|
|
155
|
+
TCFDecisionUILayer.values()[fromLayer], UsercentricsConsentType.values()[consentType], unsavedPurposeLIDecisions.deserializePurposeLIDecisionsMap()
|
|
156
156
|
).toWritableArray()
|
|
157
157
|
)
|
|
158
158
|
}
|
|
@@ -73,7 +73,7 @@ abstract class RNUsercentricsModuleSpec internal constructor(context: ReactAppli
|
|
|
73
73
|
abstract fun denyAll(consentType: Int, promise: Promise)
|
|
74
74
|
|
|
75
75
|
@ReactMethod
|
|
76
|
-
abstract fun denyAllForTCF(fromLayer: Int, consentType: Int, promise: Promise)
|
|
76
|
+
abstract fun denyAllForTCF(fromLayer: Int, consentType: Int, unsavedPurposeLIDecisions: ReadableArray, promise: Promise)
|
|
77
77
|
|
|
78
78
|
@ReactMethod
|
|
79
79
|
abstract fun saveDecisions(decisions: ReadableArray, consentType: Int, promise: Promise)
|
package/android/src/main/java/com/usercentrics/reactnative/extensions/UserDecisionExtensions.kt
CHANGED
|
@@ -25,6 +25,19 @@ internal fun ReadableArray.deserializeUserDecision(): List<UserDecision> {
|
|
|
25
25
|
return decisionList
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
internal fun ReadableArray.deserializePurposeLIDecisionsMap(): Map<Int, Boolean>? {
|
|
29
|
+
if (size() == 0) return null
|
|
30
|
+
val map = mutableMapOf<Int, Boolean>()
|
|
31
|
+
for (i in 0 until size()) {
|
|
32
|
+
getMap(i)?.let { readableMap ->
|
|
33
|
+
val id = readableMap.getInt("id")
|
|
34
|
+
val consent = readableMap.getBooleanOrNull("legitimateInterestConsent") ?: false
|
|
35
|
+
map[id] = consent
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return map
|
|
39
|
+
}
|
|
40
|
+
|
|
28
41
|
internal fun ReadableMap.deserializeTCFUserDecisions(): TCFUserDecisions {
|
|
29
42
|
val purposes = getArray("purposes")?.let { purpose ->
|
|
30
43
|
val list = mutableListOf<TCFUserDecisionOnPurpose>()
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
cmake_minimum_required(VERSION 3.13)
|
|
2
|
+
project(rn_usercentrics)
|
|
2
3
|
set(CMAKE_VERBOSE_MAKEFILE ON)
|
|
3
4
|
|
|
4
5
|
# Set library name
|
|
5
|
-
set(LIB_TARGET_NAME
|
|
6
|
+
set(LIB_TARGET_NAME rn_usercentrics)
|
|
6
7
|
|
|
7
8
|
# Add compile options
|
|
8
9
|
add_compile_options(
|
|
@@ -32,54 +33,44 @@ target_include_directories(
|
|
|
32
33
|
.
|
|
33
34
|
)
|
|
34
35
|
|
|
36
|
+
# Find ReactAndroid package first (required for version detection)
|
|
37
|
+
find_package(ReactAndroid REQUIRED CONFIG)
|
|
38
|
+
|
|
35
39
|
# Link libraries based on React Native version
|
|
36
|
-
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
40
|
+
if(DEFINED ReactAndroid_VERSION_MINOR AND ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
37
41
|
target_link_libraries(
|
|
38
42
|
${LIB_TARGET_NAME}
|
|
39
43
|
ReactAndroid::reactnative
|
|
40
44
|
ReactAndroid::jsi
|
|
41
|
-
|
|
45
|
+
ReactAndroid::fbjni
|
|
46
|
+
android
|
|
47
|
+
log
|
|
42
48
|
)
|
|
43
49
|
else()
|
|
50
|
+
# Fallback for older RN versions or when version is not available
|
|
44
51
|
target_link_libraries(
|
|
45
52
|
${LIB_TARGET_NAME}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
53
|
+
ReactAndroid::reactnative
|
|
54
|
+
ReactAndroid::jsi
|
|
55
|
+
android
|
|
56
|
+
log
|
|
62
57
|
)
|
|
63
58
|
endif()
|
|
64
59
|
|
|
65
|
-
# Compile options
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
-std=c++20
|
|
76
|
-
-Wall
|
|
77
|
-
)
|
|
78
|
-
endif()
|
|
60
|
+
# Compile options - use standard approach for compatibility
|
|
61
|
+
target_compile_options(
|
|
62
|
+
${LIB_TARGET_NAME}
|
|
63
|
+
PRIVATE
|
|
64
|
+
-DLOG_TAG=\"ReactNative\"
|
|
65
|
+
-fexceptions
|
|
66
|
+
-frtti
|
|
67
|
+
-std=c++20
|
|
68
|
+
-Wall
|
|
69
|
+
)
|
|
79
70
|
|
|
80
71
|
# Additional include directories
|
|
81
72
|
target_include_directories(
|
|
82
|
-
${
|
|
83
|
-
|
|
73
|
+
${LIB_TARGET_NAME}
|
|
74
|
+
PRIVATE
|
|
84
75
|
${CMAKE_CURRENT_SOURCE_DIR}
|
|
85
76
|
)
|
|
@@ -28,7 +28,7 @@ public protocol UsercentricsManager {
|
|
|
28
28
|
func acceptAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent]
|
|
29
29
|
func acceptAll(consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent]
|
|
30
30
|
|
|
31
|
-
func denyAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent]
|
|
31
|
+
func denyAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType, unsavedPurposeLIDecisions: [KotlinInt: KotlinBoolean]?) -> [UsercentricsServiceConsent]
|
|
32
32
|
func denyAll(consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent]
|
|
33
33
|
|
|
34
34
|
func saveDecisionsForTCF(tcfDecisions: TCFUserDecisions,
|
|
@@ -112,8 +112,8 @@ final class UsercentricsManagerImplementation: UsercentricsManager {
|
|
|
112
112
|
return UsercentricsCore.shared.acceptAll(consentType: consentType)
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
func denyAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] {
|
|
116
|
-
return UsercentricsCore.shared.denyAllForTCF(fromLayer: fromLayer, consentType: consentType)
|
|
115
|
+
func denyAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType, unsavedPurposeLIDecisions: [KotlinInt: KotlinBoolean]?) -> [UsercentricsServiceConsent] {
|
|
116
|
+
return UsercentricsCore.shared.denyAllForTCF(fromLayer: fromLayer, consentType: consentType, unsavedPurposeLIDecisions: unsavedPurposeLIDecisions)
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
func denyAll(consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] {
|
|
@@ -71,6 +71,7 @@ RCT_EXTERN_METHOD(acceptAll:(NSInteger *)consentType
|
|
|
71
71
|
|
|
72
72
|
RCT_EXTERN_METHOD(denyAllForTCF:(NSInteger *)fromLayer
|
|
73
73
|
consentType:(NSInteger)consentType
|
|
74
|
+
unsavedPurposeLIDecisions:(NSArray)unsavedPurposeLIDecisions
|
|
74
75
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
75
76
|
reject:(RCTPromiseRejectBlock)reject)
|
|
76
77
|
|
|
@@ -157,9 +157,20 @@ class RNUsercentricsModule: NSObject {
|
|
|
157
157
|
|
|
158
158
|
@objc func denyAllForTCF(_ fromLayer: Int,
|
|
159
159
|
consentType: Int,
|
|
160
|
+
unsavedPurposeLIDecisions: [NSDictionary],
|
|
160
161
|
resolve: @escaping RCTPromiseResolveBlock,
|
|
161
162
|
reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
162
|
-
|
|
163
|
+
var decisions: [KotlinInt: KotlinBoolean]? = nil
|
|
164
|
+
if !unsavedPurposeLIDecisions.isEmpty {
|
|
165
|
+
decisions = [:]
|
|
166
|
+
for dict in unsavedPurposeLIDecisions {
|
|
167
|
+
if let id = dict["id"] as? Int,
|
|
168
|
+
let consent = dict["legitimateInterestConsent"] as? Bool {
|
|
169
|
+
decisions?[KotlinInt(int: Int32(id))] = KotlinBoolean(bool: consent)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
let services = usercentricsManager.denyAllForTCF(fromLayer: .initialize(from: fromLayer), consentType: .initialize(from: consentType), unsavedPurposeLIDecisions: decisions)
|
|
163
174
|
resolve(services.toListOfDictionary())
|
|
164
175
|
}
|
|
165
176
|
|
|
@@ -74,6 +74,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
74
74
|
|
|
75
75
|
- (void)denyAllForTCF:(NSInteger)fromLayer
|
|
76
76
|
consentType:(NSInteger)consentType
|
|
77
|
+
unsavedPurposeLIDecisions:(NSArray<NSDictionary *> *)unsavedPurposeLIDecisions
|
|
77
78
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
78
79
|
reject:(RCTPromiseRejectBlock)reject;
|
|
79
80
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TurboModule } from 'react-native';
|
|
2
|
-
import type { UsercentricsOptions, UsercentricsReadyStatus, BannerSettings, UsercentricsConsentUserResponse, UsercentricsServiceConsent, UsercentricsCMPData, AdditionalConsentModeData, TCFData, CCPAData, UserDecision, TCFUserDecisions } from './models';
|
|
2
|
+
import type { UsercentricsOptions, UsercentricsReadyStatus, BannerSettings, UsercentricsConsentUserResponse, UsercentricsServiceConsent, UsercentricsCMPData, AdditionalConsentModeData, TCFData, CCPAData, UserDecision, TCFUserDecisions, TCFUserDecisionOnPurpose } from './models';
|
|
3
3
|
export interface Spec extends TurboModule {
|
|
4
4
|
configure(options: UsercentricsOptions): void;
|
|
5
5
|
isReady(): Promise<UsercentricsReadyStatus>;
|
|
@@ -21,7 +21,7 @@ export interface Spec extends TurboModule {
|
|
|
21
21
|
acceptAll(consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
22
22
|
acceptAllForTCF(fromLayer: number, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
23
23
|
denyAll(consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
24
|
-
denyAllForTCF(fromLayer: number, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
24
|
+
denyAllForTCF(fromLayer: number, consentType: number, unsavedPurposeLIDecisions: Array<TCFUserDecisionOnPurpose>): Promise<Array<UsercentricsServiceConsent>>;
|
|
25
25
|
saveDecisions(decisions: Array<UserDecision>, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
26
26
|
saveDecisionsForTCF(tcfDecisions: TCFUserDecisions, fromLayer: number, saveDecisions: Array<UserDecision>, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
27
27
|
saveOptOutForCCPA(isOptedOut: boolean, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeUsercentrics.js","sourceRoot":"","sources":["../src/NativeUsercentrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAe,MAAM,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;AA+D/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"}
|
package/lib/Usercentrics.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AdditionalConsentModeData, BannerSettings, CCPAData, TCFData, TCFDecisionUILayer, TCFUserDecisions, UsercentricsAnalyticsEventType, UsercentricsCMPData, UsercentricsConsentType, UsercentricsConsentUserResponse, UsercentricsOptions, UsercentricsReadyStatus, UsercentricsServiceConsent, UserDecision } from './models';
|
|
1
|
+
import { AdditionalConsentModeData, BannerSettings, CCPAData, TCFData, TCFDecisionUILayer, TCFUserDecisionOnPurpose, TCFUserDecisions, UsercentricsAnalyticsEventType, UsercentricsCMPData, UsercentricsConsentType, UsercentricsConsentUserResponse, UsercentricsOptions, UsercentricsReadyStatus, UsercentricsServiceConsent, UserDecision } from './models';
|
|
2
2
|
export declare const Usercentrics: {
|
|
3
3
|
configure: (options: UsercentricsOptions) => void;
|
|
4
4
|
status: () => Promise<UsercentricsReadyStatus>;
|
|
@@ -17,7 +17,7 @@ export declare const Usercentrics: {
|
|
|
17
17
|
acceptAll: (consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
|
18
18
|
acceptAllForTCF: (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
|
19
19
|
denyAll: (consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
|
20
|
-
denyAllForTCF: (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
|
20
|
+
denyAllForTCF: (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType, unsavedPurposeLIDecisions?: TCFUserDecisionOnPurpose[]) => Promise<Array<UsercentricsServiceConsent>>;
|
|
21
21
|
saveDecisions: (decisions: UserDecision[], consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
|
22
22
|
saveDecisionsForTCF: (tcfDecisions: TCFUserDecisions, fromLayer: TCFDecisionUILayer, decisions: UserDecision[], consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
|
23
23
|
saveOptOutForCCPA: (isOptedOut: boolean, consentType: UsercentricsConsentType) => Promise<Array<UsercentricsServiceConsent>>;
|
package/lib/Usercentrics.js
CHANGED
|
@@ -69,9 +69,9 @@ export const Usercentrics = {
|
|
|
69
69
|
await RNUsercentricsModule.isReady();
|
|
70
70
|
return RNUsercentricsModule.denyAll(consentType);
|
|
71
71
|
},
|
|
72
|
-
denyAllForTCF: async (fromLayer, consentType) => {
|
|
72
|
+
denyAllForTCF: async (fromLayer, consentType, unsavedPurposeLIDecisions = []) => {
|
|
73
73
|
await RNUsercentricsModule.isReady();
|
|
74
|
-
return RNUsercentricsModule.denyAllForTCF(fromLayer, consentType);
|
|
74
|
+
return RNUsercentricsModule.denyAllForTCF(fromLayer, consentType, unsavedPurposeLIDecisions);
|
|
75
75
|
},
|
|
76
76
|
saveDecisions: async (decisions, consentType) => {
|
|
77
77
|
await RNUsercentricsModule.isReady();
|
package/lib/Usercentrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Usercentrics.js","sourceRoot":"","sources":["../src/Usercentrics.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAW,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Usercentrics.js","sourceRoot":"","sources":["../src/Usercentrics.tsx"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export interface Spec extends TurboModule {
|
|
|
20
20
|
acceptAll(consentType: number): Promise<Array<Object>>;
|
|
21
21
|
acceptAllForTCF(fromLayer: number, consentType: number): Promise<Array<Object>>;
|
|
22
22
|
denyAll(consentType: number): Promise<Array<Object>>;
|
|
23
|
-
denyAllForTCF(fromLayer: number, consentType: number): Promise<Array<Object>>;
|
|
23
|
+
denyAllForTCF(fromLayer: number, consentType: number, unsavedPurposeLIDecisions: Array<Object>): Promise<Array<Object>>;
|
|
24
24
|
saveDecisions(decisions: Array<Object>, consentType: number): Promise<Array<Object>>;
|
|
25
25
|
saveDecisionsForTCF(tcfDecisions: Object, fromLayer: number, saveDecisions: Array<Object>, consentType: number): Promise<Array<Object>>;
|
|
26
26
|
saveOptOutForCCPA(isOptedOut: boolean, consentType: number): Promise<Array<Object>>;
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usercentrics/react-native-sdk",
|
|
3
|
-
"version": "2.24.
|
|
3
|
+
"version": "2.24.2",
|
|
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.24.
|
|
10
|
+
"iosPackageVersion": "2.24.2",
|
|
11
11
|
"license": "SEE LICENSE IN LICENSE",
|
|
12
12
|
"files": [
|
|
13
13
|
"android",
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@babel/core": "^7.25.10",
|
|
49
|
-
"@babel/runtime": "^7.25.3",
|
|
50
49
|
"@react-native-community/cli": "^18.0.0",
|
|
51
50
|
"@react-native-community/cli-platform-android": "18.0.0",
|
|
52
51
|
"@react-native-community/cli-platform-ios": "18.0.0",
|
|
@@ -92,14 +91,7 @@
|
|
|
92
91
|
"bugs": {
|
|
93
92
|
"url": "https://github.com/Usercentrics/react-native-sdk/issues"
|
|
94
93
|
},
|
|
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
|
-
},
|
|
94
|
+
"dependencies": {},
|
|
103
95
|
"codegenConfig": {
|
|
104
96
|
"name": "RNUsercentricsModule",
|
|
105
97
|
"type": "all",
|
|
@@ -21,22 +21,56 @@ Pod::Spec.new do |s|
|
|
|
21
21
|
s.dependency 'React-NativeModulesApple'
|
|
22
22
|
s.dependency 'UsercentricsUI', "#{package['iosPackageVersion']}"
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
# Base C++ configuration
|
|
25
|
+
# Note: RCT_NEW_ARCH_ENABLED is inherited from parent project build settings
|
|
26
|
+
# This ensures compatibility with Expo's prebuild process
|
|
27
|
+
base_cpp_flags = {
|
|
25
28
|
'CLANG_CXX_LANGUAGE_STANDARD' => 'c++20',
|
|
26
29
|
'CLANG_CXX_LIBRARY' => 'libc++',
|
|
27
|
-
'OTHER_CPLUSPLUSFLAGS' => '-std=c++20 -stdlib=libc++',
|
|
28
|
-
'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/React-Core" "$(PODS_ROOT)/React-NativeModulesApple" "$(PODS_ROOT)/ReactCommon" "$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon"',
|
|
29
|
-
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) RCT_NEW_ARCH_ENABLED=0',
|
|
30
|
+
'OTHER_CPLUSPLUSFLAGS' => '-std=c++20 -stdlib=libc++ $(inherited)',
|
|
30
31
|
'CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER' => 'NO',
|
|
31
32
|
'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO',
|
|
32
|
-
'GCC_WARN_INHIBIT_ALL_WARNINGS' => 'YES'
|
|
33
|
+
'GCC_WARN_INHIBIT_ALL_WARNINGS' => 'YES',
|
|
34
|
+
'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
|
|
35
|
+
'DEFINES_MODULE' => 'YES',
|
|
36
|
+
# Ensure C++ standard library headers are accessible
|
|
37
|
+
'USE_HEADERMAP' => 'YES',
|
|
38
|
+
'ALWAYS_SEARCH_USER_PATHS' => 'NO'
|
|
33
39
|
}
|
|
34
40
|
|
|
41
|
+
# Header search paths - include React Native and C++ standard library paths
|
|
42
|
+
header_search_paths = [
|
|
43
|
+
'$(PODS_ROOT)/React-Core',
|
|
44
|
+
'$(PODS_ROOT)/React-NativeModulesApple',
|
|
45
|
+
'$(PODS_ROOT)/ReactCommon',
|
|
46
|
+
'$(PODS_CONFIGURATION_BUILD_DIR)/ReactCommon',
|
|
47
|
+
'$(PODS_TARGET_SRCROOT)',
|
|
48
|
+
'$(PODS_ROOT)/Headers/Public',
|
|
49
|
+
'$(PODS_ROOT)/Headers/Public/React-Core',
|
|
50
|
+
'$(PODS_ROOT)/Headers/Public/ReactCommon'
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
# Add new architecture paths if available (will be resolved at build time)
|
|
54
|
+
header_search_paths += [
|
|
55
|
+
'$(PODS_ROOT)/Headers/Public/React-Fabric',
|
|
56
|
+
'$(PODS_ROOT)/Headers/Public/React-Codegen',
|
|
57
|
+
'$(PODS_CONFIGURATION_BUILD_DIR)/React-Codegen/React_Codegen.framework/Headers',
|
|
58
|
+
'$(PODS_CONFIGURATION_BUILD_DIR)/React-Fabric/React_Fabric.framework/Headers'
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
base_cpp_flags['HEADER_SEARCH_PATHS'] = header_search_paths.map { |path| "\"#{path}\"" }.join(' ')
|
|
62
|
+
|
|
63
|
+
# Preprocessor definitions - inherit RCT_NEW_ARCH_ENABLED from parent project
|
|
64
|
+
# This allows Expo/React Native to control the new architecture flag
|
|
65
|
+
base_cpp_flags['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited)'
|
|
66
|
+
|
|
67
|
+
s.pod_target_xcconfig = base_cpp_flags
|
|
68
|
+
|
|
35
69
|
s.user_target_xcconfig = {
|
|
36
70
|
'CLANG_CXX_LANGUAGE_STANDARD' => 'c++20',
|
|
37
71
|
'CLANG_CXX_LIBRARY' => 'libc++',
|
|
38
|
-
'OTHER_CPLUSPLUSFLAGS' => '-std=c++20 -stdlib=libc++',
|
|
39
|
-
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited)
|
|
72
|
+
'OTHER_CPLUSPLUSFLAGS' => '-std=c++20 -stdlib=libc++ $(inherited)',
|
|
73
|
+
'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited)',
|
|
40
74
|
'CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER' => 'NO',
|
|
41
75
|
'CLANG_WARN_DOCUMENTATION_COMMENTS' => 'NO',
|
|
42
76
|
'GCC_WARN_INHIBIT_ALL_WARNINGS' => 'YES'
|
|
@@ -11,6 +11,7 @@ import type {
|
|
|
11
11
|
CCPAData,
|
|
12
12
|
UserDecision,
|
|
13
13
|
TCFUserDecisions,
|
|
14
|
+
TCFUserDecisionOnPurpose,
|
|
14
15
|
} from './models';
|
|
15
16
|
|
|
16
17
|
export interface Spec extends TurboModule {
|
|
@@ -45,7 +46,7 @@ export interface Spec extends TurboModule {
|
|
|
45
46
|
acceptAll(consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
46
47
|
acceptAllForTCF(fromLayer: number, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
47
48
|
denyAll(consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
48
|
-
denyAllForTCF(fromLayer: number, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
49
|
+
denyAllForTCF(fromLayer: number, consentType: number, unsavedPurposeLIDecisions: Array<TCFUserDecisionOnPurpose>): Promise<Array<UsercentricsServiceConsent>>;
|
|
49
50
|
|
|
50
51
|
saveDecisions(decisions: Array<UserDecision>, consentType: number): Promise<Array<UsercentricsServiceConsent>>;
|
|
51
52
|
saveDecisionsForTCF(
|
package/src/Usercentrics.tsx
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
CCPAData,
|
|
6
6
|
TCFData,
|
|
7
7
|
TCFDecisionUILayer,
|
|
8
|
+
TCFUserDecisionOnPurpose,
|
|
8
9
|
TCFUserDecisions,
|
|
9
10
|
UsercentricsAnalyticsEventType,
|
|
10
11
|
UsercentricsCMPData,
|
|
@@ -105,9 +106,9 @@ export const Usercentrics = {
|
|
|
105
106
|
return RNUsercentricsModule.denyAll(consentType);
|
|
106
107
|
},
|
|
107
108
|
|
|
108
|
-
denyAllForTCF: async (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
|
|
109
|
+
denyAllForTCF: async (fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType, unsavedPurposeLIDecisions: TCFUserDecisionOnPurpose[] = []): Promise<Array<UsercentricsServiceConsent>> => {
|
|
109
110
|
await RNUsercentricsModule.isReady();
|
|
110
|
-
return RNUsercentricsModule.denyAllForTCF(fromLayer, consentType);
|
|
111
|
+
return RNUsercentricsModule.denyAllForTCF(fromLayer, consentType, unsavedPurposeLIDecisions);
|
|
111
112
|
},
|
|
112
113
|
|
|
113
114
|
saveDecisions: async (decisions: UserDecision[], consentType: UsercentricsConsentType): Promise<Array<UsercentricsServiceConsent>> => {
|
|
@@ -33,7 +33,7 @@ export interface Spec extends TurboModule {
|
|
|
33
33
|
acceptAll(consentType: number): Promise<Array<Object>>;
|
|
34
34
|
acceptAllForTCF(fromLayer: number, consentType: number): Promise<Array<Object>>;
|
|
35
35
|
denyAll(consentType: number): Promise<Array<Object>>;
|
|
36
|
-
denyAllForTCF(fromLayer: number, consentType: number): Promise<Array<Object>>;
|
|
36
|
+
denyAllForTCF(fromLayer: number, consentType: number, unsavedPurposeLIDecisions: Array<Object>): Promise<Array<Object>>;
|
|
37
37
|
|
|
38
38
|
saveDecisions(decisions: Array<Object>, consentType: number): Promise<Array<Object>>;
|
|
39
39
|
saveDecisionsForTCF(
|