Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ Refer to the table below regarding the different campaigns that can be implement
|---------------------|-----------------------------------------------------------------|
| `gdpr: {}` | Used if your property runs a GDPR TCF or GDPR Standard campaign |
| `usnat: {}` | Used if your property runs a U.S. Multi-State Privacy campaign |
| `preferences: {}` | Used if your property runs a Preferences campaign |

### Set up callbacks in instance of `SPConsentManager`

Expand Down
2 changes: 1 addition & 1 deletion ReactNativeCmp.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Pod::Spec.new do |s|
s.platforms = { :ios => min_ios_version_supported }
s.source = { :git => "https://github.com/SourcePointUSA/react-native-sourcepoint-cmp.git", :tag => "#{s.version}" }

s.dependency "ConsentViewController", "7.9.0"
s.dependency "ConsentViewController", "7.9.1"
s.source_files = "ios/**/*.{h,m,mm,cpp,swift}"
s.private_header_files = "ios/**/*.h"

Expand Down
4 changes: 3 additions & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,10 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
dependencies {
implementation "com.facebook.react:react-android"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3"
implementation "org.jetbrains.kotlinx:kotlinx-datetime:0.6.1"

implementation "com.sourcepoint.cmplibrary:cmplibrary:7.13.0"
implementation "com.sourcepoint.cmplibrary:cmplibrary:7.14.1-beta2"
}

react {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sourcepoint.reactnativecmp
import com.facebook.react.bridge.ReadableMap
import com.sourcepoint.cmplibrary.model.CampaignsEnv
import com.sourcepoint.cmplibrary.model.exposed.ActionType
import com.sourcepoint.cmplibrary.model.exposed.ActionType.*
import com.sourcepoint.cmplibrary.model.exposed.TargetingParam

fun campaignsEnvFrom(rawValue: String?): CampaignsEnv? =
Expand All @@ -14,14 +15,16 @@ fun campaignsEnvFrom(rawValue: String?): CampaignsEnv? =

data class SPCampaign(
val rawTargetingParam: ReadableMap?,
val supportLegacyUSPString: Boolean
val supportLegacyUSPString: Boolean,
val groupPmId: String? = null,
) {
val targetingParams = rawTargetingParam?.toHashMap()?.map { TargetingParam(it.key, it.value.toString()) } ?: emptyList()
}

data class SPCampaigns(
val gdpr: SPCampaign?,
val usnat: SPCampaign?,
val preferences: SPCampaign?,
val environment: CampaignsEnv?
)

Expand All @@ -31,24 +34,26 @@ enum class RNSourcepointActionType {
companion object {
fun from(spAction: ActionType): RNSourcepointActionType =
when (spAction) {
ActionType.ACCEPT_ALL -> acceptAll
ActionType.REJECT_ALL -> rejectAll
ActionType.SHOW_OPTIONS -> showPrivacyManager
ActionType.SAVE_AND_EXIT -> saveAndExit
ActionType.MSG_CANCEL -> dismiss
ActionType.PM_DISMISS -> pmCancel
ACCEPT_ALL -> acceptAll
REJECT_ALL -> rejectAll
SHOW_OPTIONS -> showPrivacyManager
SAVE_AND_EXIT -> saveAndExit
MSG_CANCEL -> dismiss
PM_DISMISS -> pmCancel
else -> unknown
}
}
}

fun ReadableMap.SPCampaign() = SPCampaign(
rawTargetingParam = this.getMap("targetingParams"),
supportLegacyUSPString = if(this.hasKey("supportLegacyUSPString")) this.getBoolean("supportLegacyUSPString") else false
rawTargetingParam = getMap("targetingParams"),
supportLegacyUSPString = if(hasKey("supportLegacyUSPString")) getBoolean("supportLegacyUSPString") else false,
groupPmId = getString("id")
)

fun ReadableMap.SPCampaigns() = SPCampaigns(
gdpr = this.getMap("gdpr")?.SPCampaign(),
usnat = this.getMap("usnat")?.SPCampaign(),
preferences = this.getMap("preferences")?.SPCampaign(),
environment = campaignsEnvFrom(rawValue = this.getString("environment"))
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import com.sourcepoint.cmplibrary.creation.ConfigOption
import com.sourcepoint.cmplibrary.creation.SpConfigDataBuilder
import com.sourcepoint.cmplibrary.creation.makeConsentLib
import com.sourcepoint.cmplibrary.data.network.util.CampaignType
import com.sourcepoint.cmplibrary.model.CampaignsEnv
import com.sourcepoint.cmplibrary.model.ConsentAction
import com.sourcepoint.cmplibrary.model.exposed.SPConsents
import com.sourcepoint.cmplibrary.util.clearAllData
Expand All @@ -38,31 +37,29 @@ class ReactNativeCmpModule(reactContext: ReactApplicationContext) : NativeReactN
override fun build(
accountId: Double,
propertyId: Double,
propertyName: String?,
campaigns: ReadableMap?
propertyName: String,
campaigns: ReadableMap
) {
val convertedCampaigns = campaigns?.SPCampaigns() ?: SPCampaigns(
gdpr = null,
usnat = null,
environment = CampaignsEnv.PUBLIC
)

val convertedCampaigns = campaigns.SPCampaigns()
val config = SpConfigDataBuilder().apply {
addAccountId(accountId.toInt())
addPropertyName(propertyName ?: "")
addPropertyName(propertyName)
addPropertyId(propertyId.toInt())
addMessageTimeout(30000)
convertedCampaigns.gdpr?.let {
addCampaign(campaignType = CampaignType.GDPR, params = it.targetingParams, groupPmId = null)
addCampaign(campaignType = CampaignType.GDPR, params = it.targetingParams, groupPmId = it.groupPmId)
}
convertedCampaigns.usnat?.let {
addCampaign(
campaignType = CampaignType.USNAT,
params = it.targetingParams,
groupPmId = null,
groupPmId = it.groupPmId,
configParams = if(it.supportLegacyUSPString) setOf(ConfigOption.SUPPORT_LEGACY_USPSTRING) else emptySet()
)
}
convertedCampaigns.preferences?.let {
addCampaign(campaignType = CampaignType.PREFERENCES, params = it.targetingParams, groupPmId = it.groupPmId)
}
}.build()

reactApplicationContext.currentActivity?.let {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.sourcepoint.reactnativecmp.consents

import com.facebook.react.bridge.Arguments.createArray
import com.facebook.react.bridge.Arguments.createMap
import com.facebook.react.bridge.ReadableMap
import com.sourcepoint.cmplibrary.model.exposed.PreferencesConsent

data class RNSPPreferencesConsent(
val dateCreated: String?,
val uuid: String?,
val status: List<Status>,
val rejectedStatus: List<Status>
): RNMappable {
data class Status(
val categoryId: Int,
val channels: List<Channel>,
val changed: Boolean?,
val dateConsented: String?,
val subType: String?
): RNMappable {
data class Channel(val id: Int, val status: Boolean): RNMappable {
override fun toRN(): ReadableMap = createMap().apply {
putInt("id", id)
putBoolean("status", status)
}
}

override fun toRN(): ReadableMap = createMap().apply {
putInt("categoryId", categoryId)
putArray("channels", createArray().apply { channels.forEach { pushMap(it.toRN()) } })
changed?.let { putBoolean("changed", it) }
putString("dateConsented", dateConsented)
putString("subType", subType)
}
}

constructor(preferences: PreferencesConsent) : this(
dateCreated = preferences.dateCreated?.toString(),
uuid = preferences.uuid,
status = preferences.status?.map { status ->
Status(
categoryId = status.categoryId,
channels = status.channels?.map { channel ->
Status.Channel(id = channel.id, status = channel.status)
} ?: emptyList(),
changed = status.changed,
dateConsented = status.dateConsented?.toString(),
subType = status.subType?.toString()
)
} ?: emptyList(),
rejectedStatus = preferences.rejectedStatus?.map { status ->
Status(
categoryId = status.categoryId,
channels = status.channels?.map { channel ->
Status.Channel(id = channel.id, status = channel.status)
} ?: emptyList(),
changed = status.changed,
dateConsented = status.dateConsented?.toString(),
subType = status.subType?.toString()
)
} ?: emptyList()
)

override fun toRN(): ReadableMap = createMap().apply {
putString("dateCreated", dateCreated)
putString("uuid", uuid)
putArray("status", createArray().apply { status.forEach { pushMap(it.toRN()) } })
putArray("rejectedStatus", createArray().apply { rejectedStatus.forEach { pushMap(it.toRN()) } })
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.sourcepoint.reactnativecmp.consents

import com.facebook.react.bridge.Arguments.createArray
import com.facebook.react.bridge.Arguments.createMap
import com.facebook.react.bridge.ReadableMap
import com.sourcepoint.cmplibrary.model.exposed.PreferencesConsent
import com.sourcepoint.cmplibrary.model.exposed.SPConsents

interface RNMappable {
Expand All @@ -10,15 +12,18 @@ interface RNMappable {

data class RNSPUserData(
val gdpr: RNSPGDPRConsent?,
val usnat: RNSPUSNatConsent?
val usnat: RNSPUSNatConsent?,
val preferences: RNSPPreferencesConsent?
): RNMappable {
constructor(spData: SPConsents): this(
gdpr = spData.gdpr?.let { RNSPGDPRConsent(gdpr = it.consent)},
usnat = spData.usNat?.let { RNSPUSNatConsent(usnat = it.consent)}
usnat = spData.usNat?.let { RNSPUSNatConsent(usnat = it.consent)},
preferences = spData.preferences?.let { RNSPPreferencesConsent(preferences = it.consent) }
)

override fun toRN(): ReadableMap = createMap().apply {
gdpr?.let { putMap("gdpr", it.toRN()) }
usnat?.let { putMap("usnat", it.toRN()) }
preferences?.let { putMap("preferences", it.toRN()) }
}
}
8 changes: 6 additions & 2 deletions example/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,18 @@ android {
proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
}
}
compileOptions {
coreLibraryDesugaringEnabled = true
}
}

dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
androidTestImplementation "androidx.test:core:1.5.0"
androidTestImplementation "androidx.test:core:1.6.1"
androidTestImplementation('com.wix:detox:+')
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.appcompat:appcompat:1.7.1'
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")

if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
Expand Down
16 changes: 8 additions & 8 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
PODS:
- boost (1.84.0)
- ConsentViewController (7.9.0):
- ConsentViewController (7.9.1):
- Down (~> 0.11.0)
- SPMobileCore (= 0.1.6)
- SPMobileCore (= 0.1.7)
- DoubleConversion (1.1.6)
- fast_float (6.1.4)
- FBLazyVector (0.79.2)
Expand Down Expand Up @@ -1660,7 +1660,7 @@ PODS:
- React-perflogger (= 0.79.2)
- React-utils (= 0.79.2)
- ReactNativeCmp (1.0.0):
- ConsentViewController (= 7.9.0)
- ConsentViewController (= 7.9.1)
- DoubleConversion
- glog
- hermes-engine
Expand All @@ -1685,7 +1685,7 @@ PODS:
- ReactCommon/turbomodule/core
- Yoga
- SocketRocket (0.7.1)
- SPMobileCore (0.1.6)
- SPMobileCore (0.1.7)
- Yoga (0.0.0)

DEPENDENCIES:
Expand Down Expand Up @@ -1919,7 +1919,7 @@ EXTERNAL SOURCES:

SPEC CHECKSUMS:
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
ConsentViewController: 7da0b7f3bd74e363485206c319520dfbe883a96c
ConsentViewController: cdd57de154538b2240285cdb5480d3e2fe067fa0
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975
Expand Down Expand Up @@ -1989,11 +1989,11 @@ SPEC CHECKSUMS:
ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba
ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
ReactNativeCmp: 4bcdd0a68a21041dce201de86d75eb096dbb7043
ReactNativeCmp: 176df14602bf3363e3fe2e1c4bef16ab8ad91a6f
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
SPMobileCore: 984461b7c9a6a0dd27542113b20739c21ca14e1c
SPMobileCore: 880a2689597578811af343a9626311d34b462a50
Yoga: c758bfb934100bb4bf9cbaccb52557cee35e8bdf

PODFILE CHECKSUM: 4c1a09dd81fa25367b522651dd339c901af5b344
PODFILE CHECKSUM: decdc7519d77aa5eae65b167fa59bcfce25e15d2

COCOAPODS: 1.15.2
Loading
Loading