From 4635e08f6a6b39571b0b1f5106aeed860f128bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herculano?= Date: Fri, 18 Jul 2025 15:50:10 +0200 Subject: [PATCH 1/5] feat: implement messageLanguage build option --- .../reactnativecmp/ReactNativeCmpModule.kt | 6 +- .../reactnativecmp/arguments/Arguments.kt | 8 +++ .../reactnativecmp/arguments/BuildOptions.kt | 13 ++++ example/src/App.tsx | 20 +++--- example/src/LaunchArgs.ts | 6 +- ios/RNSourcepointCmp.swift | 18 +++++- ios/ReactNativeCmp.mm | 10 ++- src/NativeReactNativeCmp.ts | 61 ++++++++++++++++++- src/index.tsx | 12 +++- 9 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 android/src/main/java/com/sourcepoint/reactnativecmp/arguments/BuildOptions.kt diff --git a/android/src/main/java/com/sourcepoint/reactnativecmp/ReactNativeCmpModule.kt b/android/src/main/java/com/sourcepoint/reactnativecmp/ReactNativeCmpModule.kt index 4418bda..8f20997 100644 --- a/android/src/main/java/com/sourcepoint/reactnativecmp/ReactNativeCmpModule.kt +++ b/android/src/main/java/com/sourcepoint/reactnativecmp/ReactNativeCmpModule.kt @@ -19,6 +19,7 @@ import com.sourcepoint.cmplibrary.model.ConsentAction import com.sourcepoint.cmplibrary.model.exposed.SPConsents import com.sourcepoint.cmplibrary.util.clearAllData import com.sourcepoint.cmplibrary.util.userConsents +import com.sourcepoint.reactnativecmp.arguments.BuildOptions import com.sourcepoint.reactnativecmp.consents.RNSPUserData import org.json.JSONObject @@ -38,14 +39,17 @@ class ReactNativeCmpModule(reactContext: ReactApplicationContext) : NativeReactN accountId: Double, propertyId: Double, propertyName: String, - campaigns: ReadableMap + campaigns: ReadableMap, + options: ReadableMap?, ) { val convertedCampaigns = campaigns.SPCampaigns() + val parsedOptions = BuildOptions(options) val config = SpConfigDataBuilder().apply { addAccountId(accountId.toInt()) addPropertyName(propertyName) addPropertyId(propertyId.toInt()) addMessageTimeout(30000) + addMessageLanguage(parsedOptions.language) convertedCampaigns.gdpr?.let { addCampaign(campaignType = GDPR, params = it.targetingParams, groupPmId = it.groupPmId) } diff --git a/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/Arguments.kt b/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/Arguments.kt index 06c971a..7efd7e6 100644 --- a/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/Arguments.kt +++ b/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/Arguments.kt @@ -1,6 +1,7 @@ package com.sourcepoint.reactnativecmp.arguments import com.facebook.react.bridge.Arguments +import com.facebook.react.bridge.ReadableMap import com.facebook.react.bridge.WritableArray import com.facebook.react.bridge.WritableMap import kotlinx.serialization.json.JsonArray @@ -158,3 +159,10 @@ fun WritableMap.putArray(name: String, value: Iterable<*>) { value.forEach { this.pushAny(it) } }) } + +fun ReadableMap.getLongOrNull(name: String) = + if (hasKey(name) && !isNull(name)) { + getLong(name) + } else { + null + } diff --git a/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/BuildOptions.kt b/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/BuildOptions.kt new file mode 100644 index 0000000..b9fabb8 --- /dev/null +++ b/android/src/main/java/com/sourcepoint/reactnativecmp/arguments/BuildOptions.kt @@ -0,0 +1,13 @@ +package com.sourcepoint.reactnativecmp.arguments + +import com.facebook.react.bridge.ReadableMap +import com.sourcepoint.cmplibrary.model.MessageLanguage +import com.sourcepoint.cmplibrary.model.MessageLanguage.ENGLISH + +data class BuildOptions( + val language: MessageLanguage, +) { + constructor(options: ReadableMap?) : this( + language = MessageLanguage.entries.find { it.value == options?.getString("language") } ?: ENGLISH, + ) +} diff --git a/example/src/App.tsx b/example/src/App.tsx index 2602b2b..2217fa1 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -11,6 +11,7 @@ import { LaunchArguments } from 'react-native-launch-arguments'; import SPConsentManager, { SPCampaignEnvironment, + SPMessageLanguage, } from '@sourcepoint/react-native-cmp'; import type { SPCampaigns, SPUserData } from '@sourcepoint/react-native-cmp'; import type { LaunchArgs } from './LaunchArgs'; @@ -31,12 +32,15 @@ const config = { accountId: 22, propertyId: 16893, propertyName: 'mobile.multicampaign.demo', + buildOptions: { + language: SPMessageLanguage.SPANISH, // in order to override the message language, make sure the option "Use Browser Default" is disabled in the Sourcepoint dashboard + }, gdprPMId: '488393', usnatPMId: '988851', globalCmpPMId: '1323762', preferencesCenterId: '1306779', campaigns: { - gdpr: {}, + gdpr: { targetingParams: { withoutBrowserDefault: 'true' } }, // this targeting param is used to test a scenario where the browser default language is not used, allowing the SDK to override it with the language set in the build options usnat: { supportLegacyUSPString: true }, preferences: {}, globalcmp: {}, @@ -58,7 +62,8 @@ export default function App() { config.accountId, config.propertyId, config.propertyName, - config.campaigns + config.campaigns, + config.buildOptions ); if (launchArgs.clearData === true) { @@ -127,7 +132,8 @@ export default function App() { config.accountId, config.propertyId, config.propertyName, - config.campaigns + config.campaigns, + config.buildOptions ); setUserData({}); }, []); @@ -159,22 +165,22 @@ export default function App() {