@usercentrics/react-native-sdk 2.2.1 → 2.4.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.
- package/CHANGELOG.md +74 -0
- package/android/build.gradle +1 -1
- package/android/src/androidTest/java/com/usercentrics/reactnativemodule/RNUsercentricsModuleTest.kt +13 -144
- package/android/src/androidTest/java/com/usercentrics/reactnativemodule/api/FakeUsercentricsProxy.kt +4 -31
- package/android/src/androidTest/java/com/usercentrics/reactnativemodule/mock/GetTCFDataMock.kt +3 -1
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/RNUsercentricsModule.kt +25 -76
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/api/UsercentricsProxy.kt +12 -64
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/BannerFontExtensions.kt +26 -0
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/FirstLayerOptionsExtensions.kt +39 -14
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/TCFDataExtensions.kt +2 -1
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/UsercentricsReadyStatusExtensions.kt +1 -1
- package/ios/Extensions/BannerSettings+Dict.swift +103 -16
- package/ios/Extensions/ReadyStatus+Dict.swift +1 -1
- package/ios/Manager/UsercentricsManager.swift +12 -25
- package/ios/RNUsercentricsModule.swift +19 -55
- package/ios/RNUsercentricsModule.xcodeproj/project.pbxproj +0 -8
- package/lib/Usercentrics.d.ts +4 -5
- package/lib/Usercentrics.js +3 -7
- package/lib/Usercentrics.js.map +1 -1
- package/lib/models/BannerSettings.d.ts +26 -4
- package/lib/models/BannerSettings.js +25 -1
- package/lib/models/BannerSettings.js.map +1 -1
- package/lib/models/FirstLayerOptions.d.ts +14 -12
- package/lib/models/FirstLayerOptions.js +10 -8
- package/lib/models/FirstLayerOptions.js.map +1 -1
- package/lib/models/SecondLayerOptions.d.ts +7 -3
- package/lib/models/SecondLayerOptions.js +6 -1
- package/lib/models/SecondLayerOptions.js.map +1 -1
- package/lib/models/TCFData.d.ts +2 -1
- package/lib/models/TCFData.js +2 -1
- package/lib/models/TCFData.js.map +1 -1
- package/lib/models/UsercentricsReadyStatus.d.ts +2 -2
- package/lib/models/UsercentricsReadyStatus.js +2 -2
- package/lib/models/UsercentricsReadyStatus.js.map +1 -1
- package/lib/models/index.d.ts +2 -3
- package/lib/models/index.js +2 -3
- package/lib/models/index.js.map +1 -1
- package/package.json +2 -2
- package/android/src/main/java/com/usercentrics/reactnativeusercentrics/extensions/UsercentricsUserInterfaceExtensions.kt +0 -45
- package/ios/Extensions/UIFont+UsercentricsFontDict.swift +0 -15
- package/ios/Extensions/UsercentricsUISettings+Dict.swift +0 -27
- package/lib/models/UsercentricsUIOptions.d.ts +0 -18
- package/lib/models/UsercentricsUIOptions.js +0 -21
- package/lib/models/UsercentricsUIOptions.js.map +0 -1
|
@@ -20,12 +20,24 @@ internal fun ReadableMap.bannerSettingsFromMap(assetManager: AssetManager): Bann
|
|
|
20
20
|
val customFont = getMap("font")
|
|
21
21
|
val customLogo = getMap("logo")
|
|
22
22
|
|
|
23
|
+
val rawFirstLayerStyleSettings = getMap("firstLayerSettings")
|
|
24
|
+
val rawSecondLayerStyleSettings = getMap("secondLayerSettings")
|
|
25
|
+
val rawLegalLinkSettings = getString("links")
|
|
26
|
+
|
|
23
27
|
return BannerSettings(
|
|
24
|
-
customFont?.
|
|
25
|
-
customLogo?.
|
|
28
|
+
font = customFont?.bannerFontFromMap(assetManager),
|
|
29
|
+
logo = customLogo?.bannerLogoFromMap(),
|
|
30
|
+
firstLayerSettings = rawFirstLayerStyleSettings?.firstLayerStyleSettingsFromMap(assetManager),
|
|
31
|
+
secondLayerSettings = rawSecondLayerStyleSettings?.secondLayerStyleSettingsFromMap(assetManager),
|
|
32
|
+
links = rawLegalLinkSettings?.legalLinksFromEnumString()
|
|
26
33
|
)
|
|
27
34
|
}
|
|
28
35
|
|
|
36
|
+
internal fun ReadableMap.bannerLogoFromMap(): UsercentricsImage? {
|
|
37
|
+
val logoPath = getString("logoPath") ?: return null
|
|
38
|
+
return UsercentricsImage.ImageUrl(logoPath)
|
|
39
|
+
}
|
|
40
|
+
|
|
29
41
|
internal fun ReadableMap.firstLayerStyleSettingsFromMap(assetManager: AssetManager): FirstLayerStyleSettings {
|
|
30
42
|
return FirstLayerStyleSettings(
|
|
31
43
|
headerImage = getMap("headerImage")?.headerImageFromMap(),
|
|
@@ -44,7 +56,7 @@ internal fun ReadableMap.headerImageFromMap(): HeaderImageSettings? {
|
|
|
44
56
|
return HeaderImageSettings.Hidden
|
|
45
57
|
}
|
|
46
58
|
|
|
47
|
-
val image = getMap("image")?.
|
|
59
|
+
val image = getMap("image")?.bannerLogoFromMap() ?: return null
|
|
48
60
|
|
|
49
61
|
val isExtended = getBooleanOrNull("isExtended") ?: false
|
|
50
62
|
return if (isExtended) {
|
|
@@ -59,21 +71,18 @@ internal fun ReadableMap.headerImageFromMap(): HeaderImageSettings? {
|
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
internal fun ReadableMap.titleFromMap(assetManager: AssetManager): TitleSettings {
|
|
62
|
-
val font = getMap("font")?.usercentricsFontFromMap(assetManager)
|
|
63
74
|
return TitleSettings(
|
|
64
75
|
alignment = getString("alignment")?.sectionAlignmentFromMap(),
|
|
65
76
|
textColor = getString("textColorHex")?.deserializeColor(),
|
|
66
|
-
font =
|
|
67
|
-
textSizeInSp =
|
|
77
|
+
font = assetManager.createFontFromName(getString("fontName")),
|
|
78
|
+
textSizeInSp = getDoubleOrNull("textSize")?.toFloat()
|
|
68
79
|
)
|
|
69
80
|
}
|
|
70
81
|
|
|
71
82
|
internal fun ReadableMap.messageFromMap(assetManager: AssetManager): MessageSettings {
|
|
72
|
-
val font = getMap("font")?.usercentricsFontFromMap(assetManager)
|
|
73
|
-
|
|
74
83
|
return MessageSettings(
|
|
75
|
-
font =
|
|
76
|
-
textSizeInSp =
|
|
84
|
+
font = assetManager.createFontFromName(getString("fontName")),
|
|
85
|
+
textSizeInSp = getDoubleOrNull("textSize")?.toFloat(),
|
|
77
86
|
textColor = getString("textColorHex")?.deserializeColor(),
|
|
78
87
|
alignment = getString("alignment")?.sectionAlignmentFromMap(),
|
|
79
88
|
linkTextColor = getString("linkTextColorHex")?.deserializeColor(),
|
|
@@ -129,15 +138,14 @@ internal fun ReadableMap.buttonLayoutFromMap(
|
|
|
129
138
|
internal fun ReadableMap.buttonSettingsFromMap(
|
|
130
139
|
assetManager: AssetManager
|
|
131
140
|
): ButtonSettings {
|
|
132
|
-
|
|
133
|
-
return ButtonSettings(
|
|
141
|
+
return ButtonSettings(
|
|
134
142
|
type = getString("buttonType")!!.deserializeButtonType(),
|
|
135
143
|
isAllCaps = getBooleanOrNull("isAllCaps"),
|
|
136
|
-
font =
|
|
144
|
+
font = assetManager.createFontFromName(getString("fontName")),
|
|
137
145
|
textColor = getString("textColorHex")?.deserializeColor(),
|
|
138
146
|
backgroundColor = getString("backgroundColorHex")?.deserializeColor(),
|
|
139
147
|
cornerRadius = getIntOrNull("cornerRadius"),
|
|
140
|
-
textSizeInSp =
|
|
148
|
+
textSizeInSp = getDoubleOrNull("textSize")?.toFloat()
|
|
141
149
|
)
|
|
142
150
|
}
|
|
143
151
|
|
|
@@ -145,6 +153,23 @@ internal fun String.deserializeButtonType(): ButtonType {
|
|
|
145
153
|
return ButtonType.valueOf(this)
|
|
146
154
|
}
|
|
147
155
|
|
|
156
|
+
internal fun ReadableMap.secondLayerStyleSettingsFromMap(assetManager: AssetManager): SecondLayerStyleSettings {
|
|
157
|
+
return SecondLayerStyleSettings(
|
|
158
|
+
buttonLayout = getMap("buttonLayout")?.buttonLayoutFromMap(assetManager),
|
|
159
|
+
showCloseButton = getBoolean("showCloseButton"),
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
internal fun String?.legalLinksFromEnumString(): LegalLinksSettings? {
|
|
164
|
+
return when (this) {
|
|
165
|
+
"BOTH" -> LegalLinksSettings.BOTH
|
|
166
|
+
"NONE" -> LegalLinksSettings.NONE
|
|
167
|
+
"FIRST_LAYER_ONLY" -> LegalLinksSettings.FIRST_LAYER_ONLY
|
|
168
|
+
"SECOND_LAYER_ONLY" -> LegalLinksSettings.SECOND_LAYER_ONLY
|
|
169
|
+
else -> null
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
148
173
|
@ColorInt
|
|
149
174
|
internal fun String.deserializeColor(): Int? {
|
|
150
175
|
val colorString: String =
|
|
@@ -10,7 +10,8 @@ internal fun TCFData.serialize(): WritableMap {
|
|
|
10
10
|
"specialFeatures" to specialFeatures.map { it.serialize() },
|
|
11
11
|
"specialPurposes" to specialPurposes.map { it.serialize() },
|
|
12
12
|
"stacks" to stacks.map { it.serialize() },
|
|
13
|
-
"vendors" to vendors.map { it.serialize() }
|
|
13
|
+
"vendors" to vendors.map { it.serialize() },
|
|
14
|
+
"tcString" to tcString
|
|
14
15
|
).toWritableMap()
|
|
15
16
|
}
|
|
16
17
|
|
|
@@ -6,7 +6,7 @@ import com.usercentrics.sdk.UsercentricsReadyStatus
|
|
|
6
6
|
|
|
7
7
|
internal fun UsercentricsReadyStatus.toWritableMap(): WritableMap {
|
|
8
8
|
return Arguments.createMap().apply {
|
|
9
|
-
putBoolean("
|
|
9
|
+
putBoolean("shouldCollectConsent", shouldCollectConsent)
|
|
10
10
|
putArray("consents", consents.toWritableArray())
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -5,25 +5,84 @@ extension BannerSettings {
|
|
|
5
5
|
init?(from dictionary: NSDictionary?) {
|
|
6
6
|
guard let dictionary = dictionary else { return nil }
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
let bannerFontHolder = BannerFontHolder(from: dictionary["font"] as? NSDictionary)
|
|
9
|
+
|
|
10
|
+
let firstLayerStyleSettingsDict = dictionary["firstLayerSettings"] as? NSDictionary
|
|
11
|
+
let firstLayerSettings = FirstLayerStyleSettings(from: firstLayerStyleSettingsDict, bannerFontHolder: bannerFontHolder)
|
|
12
|
+
|
|
13
|
+
let secondLayerStyleSettingsDict = dictionary["secondLayerSettings"] as? NSDictionary
|
|
14
|
+
let secondLayerSettings = SecondLayerStyleSettings(from: secondLayerStyleSettingsDict, bannerFontHolder: bannerFontHolder)
|
|
15
|
+
|
|
16
|
+
let links = LegalLinksSettings.from(enumString: dictionary["links"] as? String)
|
|
17
|
+
|
|
18
|
+
self.init(font: bannerFontHolder?.font,
|
|
19
|
+
logo: UIImage(from: dictionary["logo"] as? NSDictionary),
|
|
20
|
+
links: links,
|
|
21
|
+
firstLayerSettings: firstLayerSettings,
|
|
22
|
+
secondLayerSettings: secondLayerSettings)
|
|
10
23
|
}
|
|
11
24
|
}
|
|
12
25
|
|
|
13
|
-
|
|
26
|
+
struct BannerFontHolder {
|
|
27
|
+
public let font: BannerFont
|
|
28
|
+
|
|
29
|
+
public let regularFont: UIFont
|
|
30
|
+
public let boldFont: UIFont
|
|
31
|
+
|
|
14
32
|
init?(from dictionary: NSDictionary?) {
|
|
33
|
+
guard let dictionary = dictionary,
|
|
34
|
+
let regularFontName: String = dictionary["regularFont"] as? String,
|
|
35
|
+
let boldFontName: String = dictionary["boldFont"] as? String,
|
|
36
|
+
let fontSize: CGFloat = dictionary["fontSize"] as? CGFloat,
|
|
37
|
+
let regularFont = UIFont(name: regularFontName, size: fontSize),
|
|
38
|
+
let boldFont = UIFont(name: boldFontName, size: fontSize)
|
|
39
|
+
else { return nil }
|
|
40
|
+
|
|
41
|
+
self.regularFont = regularFont
|
|
42
|
+
self.boldFont = boldFont
|
|
43
|
+
self.font = .init(regularFont: regularFont, boldFont: boldFont)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
extension UIFont {
|
|
48
|
+
static func initialize(from fontName: String?, fontSizeValue: CGFloat?, fallbackFont: UIFont?) -> UIFont? {
|
|
49
|
+
let fontSize = fontSizeValue ?? UIFont.systemFontSize
|
|
50
|
+
|
|
51
|
+
// System font with custom size
|
|
52
|
+
if fontName == nil, fontSizeValue != nil {
|
|
53
|
+
return fallbackFont?.withSize(fontSize) ?? UIFont.systemFont(ofSize: fontSize)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if let fontName = fontName {
|
|
57
|
+
return UIFont(name: fontName, size: fontSize)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return fallbackFont?.withSize(fontSize)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
extension FirstLayerStyleSettings {
|
|
65
|
+
init?(from dictionary: NSDictionary?, bannerFontHolder: BannerFontHolder?) {
|
|
15
66
|
guard let dictionary = dictionary else { return nil }
|
|
16
67
|
|
|
17
68
|
self.init(headerImage: HeaderImageSettings.from(dictionary: dictionary["headerImage"] as? NSDictionary),
|
|
18
|
-
title: TitleSettings(from: dictionary["title"] as? NSDictionary),
|
|
19
|
-
message: MessageSettings(from: dictionary["message"] as? NSDictionary),
|
|
20
|
-
buttonLayout: ButtonLayout.from(dictionary: dictionary["buttonLayout"] as? NSDictionary),
|
|
69
|
+
title: TitleSettings(from: dictionary["title"] as? NSDictionary, fallbackFont: bannerFontHolder?.boldFont),
|
|
70
|
+
message: MessageSettings(from: dictionary["message"] as? NSDictionary, fallbackFont: bannerFontHolder?.regularFont),
|
|
71
|
+
buttonLayout: ButtonLayout.from(dictionary: dictionary["buttonLayout"] as? NSDictionary, fallbackFont: bannerFontHolder?.boldFont),
|
|
21
72
|
backgroundColor: UIColor(unsafeHex: dictionary["backgroundColorHex"] as? String),
|
|
22
73
|
cornerRadius: dictionary["cornerRadius"] as? CGFloat,
|
|
23
74
|
overlayColor: UIColor(unsafeHex: dictionary["overlayColorHex"] as? String))
|
|
24
75
|
}
|
|
25
76
|
}
|
|
26
77
|
|
|
78
|
+
extension SecondLayerStyleSettings {
|
|
79
|
+
init?(from dictionary: NSDictionary?, bannerFontHolder: BannerFontHolder?) {
|
|
80
|
+
guard let dictionary = dictionary else { return nil }
|
|
81
|
+
|
|
82
|
+
self.init(buttonLayout: ButtonLayout.from(dictionary: dictionary["buttonLayout"] as? NSDictionary, fallbackFont: bannerFontHolder?.boldFont),
|
|
83
|
+
showCloseButton: dictionary["showCloseButton"] as? Bool)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
27
86
|
|
|
28
87
|
extension HeaderImageSettings {
|
|
29
88
|
static func from(dictionary: NSDictionary?) -> HeaderImageSettings? {
|
|
@@ -50,10 +109,13 @@ extension HeaderImageSettings {
|
|
|
50
109
|
}
|
|
51
110
|
|
|
52
111
|
extension TitleSettings {
|
|
53
|
-
init?(from dictionary: NSDictionary?) {
|
|
112
|
+
init?(from dictionary: NSDictionary?, fallbackFont: UIFont? = nil) {
|
|
54
113
|
guard let dictionary = dictionary else { return nil }
|
|
55
114
|
|
|
56
|
-
|
|
115
|
+
let fontName: String? = dictionary["fontName"] as? String
|
|
116
|
+
let fontSize: CGFloat? = dictionary["textSize"] as? CGFloat
|
|
117
|
+
|
|
118
|
+
self.init(font: UIFont.initialize(from: fontName, fontSizeValue: fontSize, fallbackFont: fallbackFont),
|
|
57
119
|
textColor: UIColor(unsafeHex: dictionary["textColorHex"] as? String ?? ""),
|
|
58
120
|
textAlignment: NSTextAlignment.from(enumString: dictionary["textAlignment"] as? String))
|
|
59
121
|
}
|
|
@@ -61,10 +123,13 @@ extension TitleSettings {
|
|
|
61
123
|
|
|
62
124
|
|
|
63
125
|
extension MessageSettings {
|
|
64
|
-
init?(from dictionary: NSDictionary?) {
|
|
126
|
+
init?(from dictionary: NSDictionary?, fallbackFont: UIFont? = nil) {
|
|
65
127
|
guard let dictionary = dictionary else { return nil }
|
|
66
128
|
|
|
67
|
-
|
|
129
|
+
let fontName: String? = dictionary["fontName"] as? String
|
|
130
|
+
let textSize: CGFloat? = dictionary["textSize"] as? CGFloat
|
|
131
|
+
|
|
132
|
+
self.init(font: UIFont.initialize(from: fontName, fontSizeValue: textSize, fallbackFont: fallbackFont),
|
|
68
133
|
textColor: UIColor(unsafeHex: dictionary["textColorHex"] as? String ?? ""),
|
|
69
134
|
textAlignment: NSTextAlignment.from(enumString: dictionary["textAlignment"] as? String),
|
|
70
135
|
linkTextColor: UIColor(unsafeHex: dictionary["linkTextColorHex"] as? String ?? ""),
|
|
@@ -73,7 +138,7 @@ extension MessageSettings {
|
|
|
73
138
|
}
|
|
74
139
|
|
|
75
140
|
extension ButtonLayout {
|
|
76
|
-
static func from(dictionary: NSDictionary?) -> ButtonLayout? {
|
|
141
|
+
static func from(dictionary: NSDictionary?, fallbackFont: UIFont? = nil) -> ButtonLayout? {
|
|
77
142
|
guard let dictionary = dictionary else { return nil }
|
|
78
143
|
|
|
79
144
|
let layoutDict = dictionary["layout"] as? String
|
|
@@ -81,11 +146,11 @@ extension ButtonLayout {
|
|
|
81
146
|
|
|
82
147
|
switch layoutDict {
|
|
83
148
|
case "ROW":
|
|
84
|
-
return .row(buttons: buttons.flatMap { $0 }.compactMap { ButtonSettings(from: $0) })
|
|
149
|
+
return .row(buttons: buttons.flatMap { $0 }.compactMap { ButtonSettings(from: $0, fallbackFont: fallbackFont) })
|
|
85
150
|
case "COLUMN":
|
|
86
|
-
return .column(buttons: buttons.flatMap { $0 }.compactMap { ButtonSettings(from: $0) })
|
|
151
|
+
return .column(buttons: buttons.flatMap { $0 }.compactMap { ButtonSettings(from: $0, fallbackFont: fallbackFont) })
|
|
87
152
|
case "GRID":
|
|
88
|
-
let gridButtons = buttons.map { $0.compactMap { button in ButtonSettings(from: button) }}
|
|
153
|
+
let gridButtons = buttons.map { $0.compactMap { button in ButtonSettings(from: button, fallbackFont: fallbackFont) }}
|
|
89
154
|
return .grid(buttons: gridButtons)
|
|
90
155
|
default:
|
|
91
156
|
break
|
|
@@ -96,15 +161,18 @@ extension ButtonLayout {
|
|
|
96
161
|
}
|
|
97
162
|
|
|
98
163
|
extension ButtonSettings {
|
|
99
|
-
init?(from dictionary: NSDictionary?) {
|
|
164
|
+
init?(from dictionary: NSDictionary?, fallbackFont: UIFont? = nil) {
|
|
100
165
|
guard
|
|
101
166
|
let dictionary = dictionary,
|
|
102
167
|
let buttonTypeDict = dictionary["buttonType"] as? String,
|
|
103
168
|
let buttonType = ButtonType.from(enumString: buttonTypeDict)
|
|
104
169
|
else { return nil }
|
|
105
170
|
|
|
171
|
+
let fontName: String? = dictionary["fontName"] as? String
|
|
172
|
+
let textSize: CGFloat? = dictionary["textSize"] as? CGFloat
|
|
173
|
+
|
|
106
174
|
self.init(type: buttonType,
|
|
107
|
-
font: UIFont(from:
|
|
175
|
+
font: UIFont.initialize(from: fontName, fontSizeValue: textSize, fallbackFont: fallbackFont),
|
|
108
176
|
textColor: UIColor(unsafeHex: dictionary["textColorHex"] as? String),
|
|
109
177
|
backgroundColor: UIColor(unsafeHex: dictionary["backgroundColorHex"] as? String),
|
|
110
178
|
cornerRadius: dictionary["cornerRadius"] as? CGFloat)
|
|
@@ -178,3 +246,22 @@ extension NSTextAlignment {
|
|
|
178
246
|
}
|
|
179
247
|
}
|
|
180
248
|
}
|
|
249
|
+
|
|
250
|
+
extension LegalLinksSettings {
|
|
251
|
+
static func from(enumString: String?) -> LegalLinksSettings? {
|
|
252
|
+
guard let enumString = enumString else { return nil }
|
|
253
|
+
|
|
254
|
+
switch enumString {
|
|
255
|
+
case "BOTH":
|
|
256
|
+
return .both
|
|
257
|
+
case "FIRST_LAYER_ONLY":
|
|
258
|
+
return .firstLayerOnly
|
|
259
|
+
case "NONE":
|
|
260
|
+
return LegalLinksSettings.none
|
|
261
|
+
case "SECOND_LAYER_ONLY":
|
|
262
|
+
return .secondLayerOnly
|
|
263
|
+
default:
|
|
264
|
+
return nil
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
@@ -8,26 +8,22 @@ public protocol UsercentricsManager {
|
|
|
8
8
|
func isReady(onSuccess: @escaping ((UsercentricsReadyStatus) -> Void), onFailure: @escaping ((Error) -> Void))
|
|
9
9
|
func restoreUserSession(controllerId: String, onSuccess: @escaping ((UsercentricsReadyStatus) -> Void), onFailure: @escaping ((Error) -> Void))
|
|
10
10
|
|
|
11
|
-
func getPredefinedUI(settings: UsercentricsUISettings?, dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void) -> UIViewController
|
|
12
|
-
|
|
13
11
|
func showFirstLayer(bannerSettings: BannerSettings?,
|
|
14
|
-
hostView:
|
|
12
|
+
hostView: UIViewController,
|
|
15
13
|
layout: UsercentricsLayout,
|
|
16
|
-
settings: FirstLayerStyleSettings?,
|
|
17
14
|
dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void)
|
|
18
15
|
|
|
19
16
|
func showSecondLayer(bannerSettings: BannerSettings?,
|
|
20
|
-
hostView:
|
|
21
|
-
showCloseButton: Bool,
|
|
17
|
+
hostView: UIViewController,
|
|
22
18
|
dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void)
|
|
23
19
|
|
|
24
|
-
func getTCString() ->
|
|
20
|
+
func getTCString(callback: @escaping (String) -> Void)
|
|
25
21
|
func getControllerId() -> String
|
|
26
22
|
func getConsents() -> [UsercentricsServiceConsent]
|
|
27
23
|
func getCMPData() -> UsercentricsCMPData
|
|
28
24
|
func getUserSessionData() -> String
|
|
29
25
|
func getUSPData() -> CCPAData
|
|
30
|
-
func getTCFData() ->
|
|
26
|
+
func getTCFData(callback: @escaping (TCFData) -> Void)
|
|
31
27
|
|
|
32
28
|
func changeLanguage(language: String, onSuccess: @escaping (() -> Void), onFailure: @escaping ((Error) -> Void))
|
|
33
29
|
|
|
@@ -71,37 +67,28 @@ final class UsercentricsManagerImplementation: UsercentricsManager {
|
|
|
71
67
|
UsercentricsCore.reset()
|
|
72
68
|
}
|
|
73
69
|
|
|
74
|
-
func getPredefinedUI(settings: UsercentricsUISettings?, dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void) -> UIViewController {
|
|
75
|
-
return UsercentricsUserInterface.getPredefinedUI(settings: settings, dismissViewHandler: dismissViewHandler)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
70
|
func showFirstLayer(bannerSettings: BannerSettings?,
|
|
79
|
-
hostView:
|
|
71
|
+
hostView: UIViewController,
|
|
80
72
|
layout: UsercentricsLayout,
|
|
81
|
-
settings: FirstLayerStyleSettings?,
|
|
82
73
|
dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void) {
|
|
83
74
|
UsercentricsBanner(bannerSettings: bannerSettings).showFirstLayer(hostView: hostView,
|
|
84
75
|
layout: layout,
|
|
85
|
-
settings: settings,
|
|
86
76
|
completionHandler: dismissViewHandler)
|
|
87
77
|
}
|
|
88
78
|
|
|
89
79
|
func showSecondLayer(bannerSettings: BannerSettings?,
|
|
90
|
-
hostView:
|
|
91
|
-
showCloseButton: Bool,
|
|
80
|
+
hostView: UIViewController,
|
|
92
81
|
dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void) {
|
|
93
|
-
UsercentricsBanner(bannerSettings: bannerSettings).showSecondLayer(hostView: hostView,
|
|
94
|
-
showCloseButton: showCloseButton,
|
|
95
|
-
presentationMode: .present,
|
|
96
|
-
completionHandler: dismissViewHandler)
|
|
82
|
+
UsercentricsBanner(bannerSettings: bannerSettings).showSecondLayer(hostView: hostView, completionHandler: dismissViewHandler)
|
|
97
83
|
}
|
|
98
84
|
|
|
99
85
|
func restoreUserSession(controllerId: String, onSuccess: @escaping ((UsercentricsReadyStatus) -> Void), onFailure: @escaping ((Error) -> Void)) {
|
|
100
86
|
UsercentricsCore.shared.restoreUserSession(controllerId: controllerId, onSuccess: onSuccess, onFailure: onFailure)
|
|
101
87
|
}
|
|
102
88
|
|
|
103
|
-
|
|
104
|
-
|
|
89
|
+
@available(*, deprecated, message: "Please, call getTCFData() to get the 'tcString' from that model")
|
|
90
|
+
func getTCString(callback: @escaping (String) -> Void) {
|
|
91
|
+
UsercentricsCore.shared.getTCString(callback: callback)
|
|
105
92
|
}
|
|
106
93
|
|
|
107
94
|
func getControllerId() -> String {
|
|
@@ -124,8 +111,8 @@ final class UsercentricsManagerImplementation: UsercentricsManager {
|
|
|
124
111
|
return UsercentricsCore.shared.getUSPData()
|
|
125
112
|
}
|
|
126
113
|
|
|
127
|
-
func getTCFData() ->
|
|
128
|
-
|
|
114
|
+
func getTCFData(callback: @escaping (TCFData) -> Void) {
|
|
115
|
+
UsercentricsCore.shared.getTCFData(callback: callback)
|
|
129
116
|
}
|
|
130
117
|
|
|
131
118
|
func changeLanguage(language: String, onSuccess: @escaping (() -> Void), onFailure: @escaping ((Error) -> Void)) {
|
|
@@ -24,37 +24,20 @@ class RNUsercentricsModule: NSObject, RCTBridgeModule {
|
|
|
24
24
|
let self = self,
|
|
25
25
|
let userOptions = UsercentricsOptions(from: dict)
|
|
26
26
|
else { return }
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
self.usercentricsManager.configure(options: userOptions)
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
@objc func isReady(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
33
|
-
usercentricsManager.isReady { status in
|
|
34
|
-
resolve(status.toDictionary())
|
|
35
|
-
} onFailure: { error in
|
|
36
|
-
reject("usercentrics_reactNative_isReady_error", error.localizedDescription, error)
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
@objc func showCMP(_ dict: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
41
33
|
queue.async { [weak self] in
|
|
42
|
-
guard
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
reject("
|
|
48
|
-
return
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
let predefinedUI = self.usercentricsManager.getPredefinedUI(settings: settings) { response in
|
|
52
|
-
resolve(response.toDictionary())
|
|
53
|
-
rootVC.dismiss(animated: true)
|
|
34
|
+
guard let self = self else { return }
|
|
35
|
+
|
|
36
|
+
self.usercentricsManager.isReady { status in
|
|
37
|
+
resolve(status.toDictionary())
|
|
38
|
+
} onFailure: { error in
|
|
39
|
+
reject("usercentrics_reactNative_isReady_error", error.localizedDescription, error)
|
|
54
40
|
}
|
|
55
|
-
|
|
56
|
-
if #available(iOS 13.0, *) { predefinedUI.isModalInPresentation = true }
|
|
57
|
-
rootVC.present(predefinedUI)
|
|
58
41
|
}
|
|
59
42
|
}
|
|
60
43
|
|
|
@@ -69,23 +52,11 @@ class RNUsercentricsModule: NSObject, RCTBridgeModule {
|
|
|
69
52
|
reject("usercentrics_reactNative_showFirstLayer_error", RNUsercentricsModuleError.invalidData.localizedDescription, RNUsercentricsModuleError.invalidData)
|
|
70
53
|
return
|
|
71
54
|
}
|
|
72
|
-
|
|
73
|
-
let nav = UINavigationController()
|
|
74
|
-
nav.setNavigationBarHidden(true, animated: false)
|
|
75
|
-
nav.modalPresentationStyle = .overFullScreen
|
|
76
|
-
if #available(iOS 13.0, *) {
|
|
77
|
-
nav.isModalInPresentation = true
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
rootVC.present(nav)
|
|
55
|
+
|
|
81
56
|
let bannerSettingsDict = dict["bannerSettings"] as? NSDictionary
|
|
82
|
-
let styleSettingsDict = dict["styleSettings"] as? NSDictionary
|
|
83
|
-
|
|
84
57
|
self.usercentricsManager.showFirstLayer(bannerSettings: BannerSettings(from: bannerSettingsDict),
|
|
85
|
-
hostView:
|
|
86
|
-
layout: layout
|
|
87
|
-
settings: FirstLayerStyleSettings(from: styleSettingsDict)) { response in
|
|
88
|
-
rootVC.dismiss(animated: true)
|
|
58
|
+
hostView: rootVC as! UIViewController,
|
|
59
|
+
layout: layout) { response in
|
|
89
60
|
resolve(response.toDictionary())
|
|
90
61
|
}
|
|
91
62
|
}
|
|
@@ -100,21 +71,10 @@ class RNUsercentricsModule: NSObject, RCTBridgeModule {
|
|
|
100
71
|
reject("usercentrics_reactNative_showFirstLayer_error", RNUsercentricsModuleError.invalidData.localizedDescription, RNUsercentricsModuleError.invalidData)
|
|
101
72
|
return
|
|
102
73
|
}
|
|
74
|
+
|
|
103
75
|
let bannerSettingsDict = dict["bannerSettings"] as? NSDictionary
|
|
104
|
-
let showCloseButton = (dict["showCloseButton"] as? Bool) ?? false
|
|
105
|
-
|
|
106
|
-
let nav = UINavigationController()
|
|
107
|
-
nav.setNavigationBarHidden(true, animated: false)
|
|
108
|
-
nav.modalPresentationStyle = .overFullScreen
|
|
109
|
-
if #available(iOS 13.0, *) {
|
|
110
|
-
nav.isModalInPresentation = true
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
rootVC.present(nav)
|
|
114
|
-
|
|
115
76
|
self.usercentricsManager.showSecondLayer(bannerSettings: BannerSettings(from: bannerSettingsDict),
|
|
116
|
-
hostView:
|
|
117
|
-
showCloseButton: showCloseButton) { response in
|
|
77
|
+
hostView: rootVC as! UIViewController) { response in
|
|
118
78
|
rootVC.dismiss(animated: true)
|
|
119
79
|
resolve(response.toDictionary())
|
|
120
80
|
}
|
|
@@ -134,7 +94,9 @@ class RNUsercentricsModule: NSObject, RCTBridgeModule {
|
|
|
134
94
|
}
|
|
135
95
|
|
|
136
96
|
@objc func getTCFString(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
137
|
-
|
|
97
|
+
usercentricsManager.getTCString { tcString in
|
|
98
|
+
resolve(tcString)
|
|
99
|
+
}
|
|
138
100
|
}
|
|
139
101
|
|
|
140
102
|
@objc func getControllerId(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
@@ -150,7 +112,9 @@ class RNUsercentricsModule: NSObject, RCTBridgeModule {
|
|
|
150
112
|
}
|
|
151
113
|
|
|
152
114
|
@objc func getTCFData(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
153
|
-
|
|
115
|
+
usercentricsManager.getTCFData { tcfData in
|
|
116
|
+
resolve(tcfData.toDictionary())
|
|
117
|
+
}
|
|
154
118
|
}
|
|
155
119
|
|
|
156
120
|
@objc func getUserSessionData(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
|
|
@@ -13,9 +13,7 @@
|
|
|
13
13
|
A22EDF9F271DA49900F5BB8C /* ReadyStatus+Dict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22EDF9A271DA49900F5BB8C /* ReadyStatus+Dict.swift */; };
|
|
14
14
|
A22EDFA0271DA49900F5BB8C /* UsercentricsUserInteraction+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22EDF9B271DA49900F5BB8C /* UsercentricsUserInteraction+String.swift */; };
|
|
15
15
|
A22EDFA1271DA49900F5BB8C /* UserResponse+Dict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22EDF9C271DA49900F5BB8C /* UserResponse+Dict.swift */; };
|
|
16
|
-
A22EDFA2271DA49900F5BB8C /* UsercentricsUISettings+Dict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22EDF9D271DA49900F5BB8C /* UsercentricsUISettings+Dict.swift */; };
|
|
17
16
|
A2390F8227B52ADA00F355C1 /* UIImage+UsercentricsLogoDict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2390F8127B52ADA00F355C1 /* UIImage+UsercentricsLogoDict.swift */; };
|
|
18
|
-
A2390F8427B52B0800F355C1 /* UIFont+UsercentricsFontDict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2390F8327B52B0800F355C1 /* UIFont+UsercentricsFontDict.swift */; };
|
|
19
17
|
A2390F8627B52B2700F355C1 /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2390F8527B52B2700F355C1 /* UIColor+Extensions.swift */; };
|
|
20
18
|
A24E4EA327313492001093C7 /* UserDecision+Dict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24E4EA227313492001093C7 /* UserDecision+Dict.swift */; };
|
|
21
19
|
A24E4EAB273186FD001093C7 /* TCFData+Dict.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24E4EAA273186FD001093C7 /* TCFData+Dict.swift */; };
|
|
@@ -51,9 +49,7 @@
|
|
|
51
49
|
A22EDF9A271DA49900F5BB8C /* ReadyStatus+Dict.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ReadyStatus+Dict.swift"; sourceTree = "<group>"; };
|
|
52
50
|
A22EDF9B271DA49900F5BB8C /* UsercentricsUserInteraction+String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UsercentricsUserInteraction+String.swift"; sourceTree = "<group>"; };
|
|
53
51
|
A22EDF9C271DA49900F5BB8C /* UserResponse+Dict.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UserResponse+Dict.swift"; sourceTree = "<group>"; };
|
|
54
|
-
A22EDF9D271DA49900F5BB8C /* UsercentricsUISettings+Dict.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UsercentricsUISettings+Dict.swift"; sourceTree = "<group>"; };
|
|
55
52
|
A2390F8127B52ADA00F355C1 /* UIImage+UsercentricsLogoDict.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+UsercentricsLogoDict.swift"; sourceTree = "<group>"; };
|
|
56
|
-
A2390F8327B52B0800F355C1 /* UIFont+UsercentricsFontDict.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+UsercentricsFontDict.swift"; sourceTree = "<group>"; };
|
|
57
53
|
A2390F8527B52B2700F355C1 /* UIColor+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extensions.swift"; sourceTree = "<group>"; };
|
|
58
54
|
A24E4EA227313492001093C7 /* UserDecision+Dict.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDecision+Dict.swift"; sourceTree = "<group>"; };
|
|
59
55
|
A24E4EAA273186FD001093C7 /* TCFData+Dict.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TCFData+Dict.swift"; sourceTree = "<group>"; };
|
|
@@ -88,7 +84,6 @@
|
|
|
88
84
|
children = (
|
|
89
85
|
A22EDF9A271DA49900F5BB8C /* ReadyStatus+Dict.swift */,
|
|
90
86
|
A22EDF99271DA49900F5BB8C /* UsercentricsOptions+Dict.swift */,
|
|
91
|
-
A22EDF9D271DA49900F5BB8C /* UsercentricsUISettings+Dict.swift */,
|
|
92
87
|
A22EDF9B271DA49900F5BB8C /* UsercentricsUserInteraction+String.swift */,
|
|
93
88
|
A22EDF9C271DA49900F5BB8C /* UserResponse+Dict.swift */,
|
|
94
89
|
A21D32A3272AE191004ED33E /* UsercentricsServiceConsents+Dict.swift */,
|
|
@@ -101,7 +96,6 @@
|
|
|
101
96
|
A20E7C9327B28D88004DC947 /* BannerSettings+Dict.swift */,
|
|
102
97
|
A2390F8127B52ADA00F355C1 /* UIImage+UsercentricsLogoDict.swift */,
|
|
103
98
|
A2390F8527B52B2700F355C1 /* UIColor+Extensions.swift */,
|
|
104
|
-
A2390F8327B52B0800F355C1 /* UIFont+UsercentricsFontDict.swift */,
|
|
105
99
|
);
|
|
106
100
|
path = Extensions;
|
|
107
101
|
sourceTree = "<group>";
|
|
@@ -215,11 +209,9 @@
|
|
|
215
209
|
A2F0B086272C483300A99DD3 /* TCFUserDecisions+Dict.swift in Sources */,
|
|
216
210
|
A22EDF9F271DA49900F5BB8C /* ReadyStatus+Dict.swift in Sources */,
|
|
217
211
|
A24E4EAB273186FD001093C7 /* TCFData+Dict.swift in Sources */,
|
|
218
|
-
A22EDFA2271DA49900F5BB8C /* UsercentricsUISettings+Dict.swift in Sources */,
|
|
219
212
|
A2DC25402722A91400AA9DD8 /* UCRNFlag.swift in Sources */,
|
|
220
213
|
A2DC252727216CFC00AA9DD8 /* DispatchQueueManager.swift in Sources */,
|
|
221
214
|
A20E7C9427B28D88004DC947 /* BannerSettings+Dict.swift in Sources */,
|
|
222
|
-
A2390F8427B52B0800F355C1 /* UIFont+UsercentricsFontDict.swift in Sources */,
|
|
223
215
|
A22EDF9E271DA49900F5BB8C /* UsercentricsOptions+Dict.swift in Sources */,
|
|
224
216
|
A2F0B080272C367B00A99DD3 /* UsercentricsConsentType+Int.swift in Sources */,
|
|
225
217
|
A2DC25362721A05500AA9DD8 /* RNUsercentricsModuleError.swift in Sources */,
|
package/lib/Usercentrics.d.ts
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { UsercentricsOptions, UsercentricsServiceConsent,
|
|
1
|
+
import { UsercentricsOptions, UsercentricsServiceConsent, UsercentricsConsentUserResponse, UsercentricsReadyStatus, UsercentricsCMPData, CCPAData, TCFData, UsercentricsConsentType, TCFDecisionUILayer, UserDecision, TCFUserDecisions, FirstLayerOptions, SecondLayerOptions } from './models';
|
|
2
2
|
export declare const Usercentrics: {
|
|
3
3
|
configure: (options: UsercentricsOptions) => void;
|
|
4
4
|
status: () => Promise<UsercentricsReadyStatus>;
|
|
5
|
-
/**
|
|
6
|
-
* @deprecated showCMP is deprecated: This API will soon be removed in favor of showFirstLayer and showSecondLayer, check our documentation for more details: https://docs.usercentrics.com/cmp_in_app_sdk/latest/collect_consent/present_cmp/
|
|
7
|
-
*/
|
|
8
|
-
showCMP: (options: UsercentricsUIOptions) => Promise<UsercentricsConsentUserResponse>;
|
|
9
5
|
showFirstLayer: (options: FirstLayerOptions) => Promise<UsercentricsConsentUserResponse>;
|
|
10
6
|
showSecondLayer: (options: SecondLayerOptions) => Promise<UsercentricsConsentUserResponse>;
|
|
11
7
|
restoreUserSession: (controllerId: string) => Promise<UsercentricsReadyStatus>;
|
|
12
8
|
getControllerId: () => Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Please, call getTCFData() to get the 'tcString' from that model
|
|
11
|
+
*/
|
|
13
12
|
getTCFString: () => Promise<string>;
|
|
14
13
|
getConsents: () => Promise<[UsercentricsServiceConsent]>;
|
|
15
14
|
getCMPData: () => Promise<UsercentricsCMPData>;
|
package/lib/Usercentrics.js
CHANGED
|
@@ -7,13 +7,6 @@ export const Usercentrics = {
|
|
|
7
7
|
status: () => {
|
|
8
8
|
return RNUsercentricsModule.isReady();
|
|
9
9
|
},
|
|
10
|
-
/**
|
|
11
|
-
* @deprecated showCMP is deprecated: This API will soon be removed in favor of showFirstLayer and showSecondLayer, check our documentation for more details: https://docs.usercentrics.com/cmp_in_app_sdk/latest/collect_consent/present_cmp/
|
|
12
|
-
*/
|
|
13
|
-
showCMP: async (options) => {
|
|
14
|
-
await RNUsercentricsModule.isReady();
|
|
15
|
-
return RNUsercentricsModule.showCMP(options);
|
|
16
|
-
},
|
|
17
10
|
showFirstLayer: async (options) => {
|
|
18
11
|
await RNUsercentricsModule.isReady();
|
|
19
12
|
return RNUsercentricsModule.showFirstLayer(options);
|
|
@@ -30,6 +23,9 @@ export const Usercentrics = {
|
|
|
30
23
|
await RNUsercentricsModule.isReady();
|
|
31
24
|
return RNUsercentricsModule.getControllerId();
|
|
32
25
|
},
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated Please, call getTCFData() to get the 'tcString' from that model
|
|
28
|
+
*/
|
|
33
29
|
getTCFString: async () => {
|
|
34
30
|
await RNUsercentricsModule.isReady();
|
|
35
31
|
return RNUsercentricsModule.getTCFString();
|
package/lib/Usercentrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Usercentrics.js","sourceRoot":"","sources":["../src/Usercentrics.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Usercentrics.js","sourceRoot":"","sources":["../src/Usercentrics.tsx"],"names":[],"mappings":"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"}
|