Skip to content

Commit 1328f1b

Browse files
Merge pull request #7 from SourcePointUSA/DIA-4070_standard_action_name
DIA-4070 standard action name
2 parents 1d7d91e + 0222261 commit 1328f1b

File tree

9 files changed

+77
-13
lines changed

9 files changed

+77
-13
lines changed

android/src/main/java/com/sourcepoint/reactnativecmp/RNSourcepointCmpModule.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ class RNSourcepointCmpModule internal constructor(context: ReactApplicationConte
111111
}
112112

113113
override fun onAction(view: View, consentAction: ConsentAction): ConsentAction {
114-
sendEvent(SDKEvent.onAction, createMap().apply { putString("actionType", consentAction.actionType.name) })
114+
sendEvent(SDKEvent.onAction, createMap().apply {
115+
putString("actionType", RNSourcepointActionType.from(consentAction.actionType).name)
116+
})
115117
return consentAction
116118
}
117119

android/src/main/java/com/sourcepoint/reactnativecmp/RNSourcepointCmpTypes.kt

+18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.sourcepoint.reactnativecmp
22

33
import com.facebook.react.bridge.ReadableMap
44
import com.sourcepoint.cmplibrary.data.network.util.CampaignsEnv
5+
import com.sourcepoint.cmplibrary.model.exposed.ActionType
56
import com.sourcepoint.cmplibrary.model.exposed.TargetingParam
67

78
fun campaignsEnvFrom(rawValue: String?): CampaignsEnv? =
@@ -24,6 +25,23 @@ data class SPCampaigns(
2425
val environment: CampaignsEnv?
2526
)
2627

28+
enum class RNSourcepointActionType {
29+
acceptAll, rejectAll, showPrivacyManager, saveAndExit, dismiss, pmCancel, unknown;
30+
31+
companion object {
32+
fun from(spAction: ActionType): RNSourcepointActionType =
33+
when (spAction) {
34+
ActionType.ACCEPT_ALL -> acceptAll
35+
ActionType.REJECT_ALL -> rejectAll
36+
ActionType.SHOW_OPTIONS -> showPrivacyManager
37+
ActionType.SAVE_AND_EXIT -> saveAndExit
38+
ActionType.MSG_CANCEL -> dismiss
39+
ActionType.PM_DISMISS -> pmCancel
40+
else -> unknown
41+
}
42+
}
43+
}
44+
2745
fun ReadableMap.SPCampaign() = SPCampaign(
2846
rawTargetingParam = this.getMap("targetingParams"),
2947
supportLegacyUSPString = if(this.hasKey("supportLegacyUSPString")) this.getBoolean("supportLegacyUSPString") else false

e2e/full.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ const app = {
5555
await this.forSDKToBeFinished();
5656
},
5757

58+
assertActionWarnWith: async function (actionType: string) {
59+
await expect(element(by.text(`action: ${actionType}`))).toExist();
60+
},
61+
5862
reloadMessages: async function ({ clearData }: { clearData: boolean }) {
5963
if (clearData) await this.clearData();
6064
await this.loadMessagesButton.tap();
@@ -97,7 +101,9 @@ describe('SourcepointSDK', () => {
97101
it('Accepting All, works', async () => {
98102
await launchApp();
99103
await app.acceptAll(); // GDPR
104+
await app.assertActionWarnWith('acceptAll');
100105
await app.acceptAll(); // USNAT
106+
await app.assertActionWarnWith('saveAndExit'); // USNAT uses saveAndExit for accepting/rejecting all
101107
await app.forSDKToBeFinished();
102108
await assertUUIDsDontChangeAfterReloadingMessages();
103109
await expect(app.gdprConsentStatusLabel).toHaveText('consentedAll');
@@ -107,7 +113,9 @@ describe('SourcepointSDK', () => {
107113
it('Rejecting All, works', async () => {
108114
await launchApp();
109115
await app.rejectAll(); // GDPR
116+
await app.assertActionWarnWith('rejectAll');
110117
await app.rejectAll(); // USNAT
118+
await app.assertActionWarnWith('saveAndExit'); // USNAT uses saveAndExit for accepting/rejecting all
111119
await app.forSDKToBeFinished();
112120
await assertUUIDsDontChangeAfterReloadingMessages();
113121
await expect(app.gdprConsentStatusLabel).toHaveText('rejectedAll');

example/src/App.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ export default function App() {
7474
consentManager.current?.getUserData().then(setUserData);
7575
});
7676

77-
consentManager.current?.onAction((actionType) => console.log(actionType));
77+
consentManager.current?.onAction(({ actionType }) =>
78+
console.warn(`action: ${actionType}`)
79+
);
7880

7981
consentManager.current?.onError((description) => {
8082
setSDKStatus(SDKStatus.Errored);

ios/RNSourcepointActionType.swift

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// RNSourcepointActionType.swift
3+
// sourcepoint-react-native-cmp
4+
//
5+
// Created by Andre Herculano on 31/5/24.
6+
//
7+
8+
import Foundation
9+
import ConsentViewController
10+
11+
enum RNSourcepointActionType: String, Codable {
12+
case acceptAll, rejectAll, showPrivacyManager, saveAndExit, dismiss, pmCancel, unknown
13+
14+
init(from actionType: SPActionType){
15+
switch actionType {
16+
case .AcceptAll: self = .acceptAll
17+
case .RejectAll: self = .rejectAll
18+
case .SaveAndExit: self = .saveAndExit
19+
case .ShowPrivacyManager: self = .showPrivacyManager
20+
case .Dismiss: self = .dismiss
21+
case .PMCancel: self = .pmCancel
22+
default: self = .unknown
23+
}
24+
}
25+
}

ios/RNSourcepointCmp.h

-4
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,11 @@ RCT_EXTERN_METHOD(supportedEvents)
2525
return YES;
2626
}
2727

28-
/// TODO: check if this really can be here or need fixing in the SDK
29-
/// https://reactnative.dev/docs/native-modules-ios
30-
/// https://github.com/OneSignal/react-native-onesignal/issues/749
3128
- (dispatch_queue_t)methodQueue
3229
{
3330
return dispatch_get_main_queue();
3431
}
3532

36-
// Don't compile this code when we build for the old architecture.
3733
#ifdef RCT_NEW_ARCH_ENABLED
3834
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
3935
(const facebook::react::ObjCTurboModule::InitParams &)params

ios/RNSourcepointCmp.swift

+1-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ import React
4141
}
4242

4343
func loadMessage(_ params: SPLoadMessageParams) {
44-
print("calling loadMessage with: ", params.authId as Any)
4544
consentManager?.loadMessage(forAuthId: params.authId, pubData: nil)
4645
}
4746

@@ -67,11 +66,10 @@ extension RNSourcepointCmp: SPDelegate {
6766
UIApplication.shared.delegate?.window??.rootViewController
6867
}
6968

70-
// TODO: standardize action names
7169
func onAction(_ action: SPAction, from controller: UIViewController) {
7270
RNSourcepointCmp.shared?.sendEvent(
7371
withName: "onAction",
74-
body: ["actionType": action.type.description]
72+
body: ["actionType": RNSourcepointActionType(from: action.type).rawValue]
7573
)
7674
}
7775

src/index.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import { NativeModules, Platform, NativeEventEmitter } from 'react-native';
2-
import type { Spec, SPCampaigns, SPUserData, LoadMessageParams } from './types';
2+
import type {
3+
Spec,
4+
SPCampaigns,
5+
SPUserData,
6+
LoadMessageParams,
7+
SPActionType,
8+
} from './types';
39

410
const LINKING_ERROR =
511
`The package '@sourcepoint/react-native-cmp' doesn't seem to be linked. Make sure: \n\n` +
@@ -61,7 +67,7 @@ export class SPConsentManager implements Spec {
6167
RNSourcepointCmp.loadUSNatPrivacyManager(pmId);
6268
}
6369

64-
onAction(callback: (action: string) => void): void {
70+
onAction(callback: (body: { actionType: SPActionType }) => void): void {
6571
this.emitter.removeAllListeners('onAction');
6672
this.emitter.addListener('onAction', callback);
6773
}

src/types.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ export const enum SPCampaignEnvironment {
1010
Stage = 'Stage',
1111
}
1212

13+
export const enum SPActionType {
14+
acceptAll = 'acceptAll',
15+
rejectAll = 'rejectAll',
16+
saveAndExit = 'saveAndExit',
17+
showOptions = 'showOptions',
18+
dismiss = 'dismiss',
19+
pmCancel = 'pmCancel',
20+
unknown = 'unknown',
21+
}
22+
1323
export type SPCampaigns = {
1424
gdpr?: SPCampaign;
1525
usnat?: SPCampaign;
@@ -103,8 +113,7 @@ export interface Spec extends TurboModule {
103113
loadGDPRPrivacyManager(pmId: string): void;
104114
loadUSNatPrivacyManager(pmId: string): void;
105115

106-
// TODO: change action from string to enum
107-
onAction(callback: (action: string) => void): void;
116+
onAction(callback: (body: { actionType: SPActionType }) => void): void;
108117
onSPUIReady(callback: () => void): void;
109118
onSPUIFinished(callback: () => void): void;
110119
onFinished(callback: () => void): void;

0 commit comments

Comments
 (0)