Skip to content

Commit 1613fcd

Browse files
authored
Merge pull request #1838 from OneSignal/fadi/sdk-2947-add-custom-events-for-react-native-package
feat: add custom events support
2 parents 82462fa + 17c5156 commit 1613fcd

File tree

10 files changed

+171
-75
lines changed

10 files changed

+171
-75
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencies {
3131

3232
// api is used instead of implementation so the parent :app project can access any of the OneSignal Java
3333
// classes if needed. Such as com.onesignal.NotificationExtenderService
34-
api 'com.onesignal:OneSignal:5.1.35'
34+
api 'com.onesignal:OneSignal:5.3.0-alpha-01'
3535

3636
testImplementation 'junit:junit:4.12'
3737
}

android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ of this software and associated documentation files (the "Software"), to deal
3535

3636
package com.onesignal.rnonesignalandroid;
3737

38+
import java.util.HashMap;
39+
import java.util.Map;
40+
3841
import android.content.Context;
39-
import android.content.pm.ApplicationInfo;
40-
import android.os.Bundle;
41-
import com.onesignal.debug.internal.logging.Logging;
42-
import com.facebook.react.bridge.Callback;
42+
43+
import org.jetbrains.annotations.Nullable;
44+
import org.json.JSONException;
45+
46+
import com.facebook.react.bridge.Arguments;
4347
import com.facebook.react.bridge.LifecycleEventListener;
4448
import com.facebook.react.bridge.Promise;
4549
import com.facebook.react.bridge.ReactApplicationContext;
@@ -48,39 +52,31 @@ of this software and associated documentation files (the "Software"), to deal
4852
import com.facebook.react.bridge.ReactMethod;
4953
import com.facebook.react.bridge.ReadableArray;
5054
import com.facebook.react.bridge.ReadableMap;
51-
import com.facebook.react.modules.core.DeviceEventManagerModule;
5255
import com.facebook.react.bridge.WritableMap;
53-
import com.facebook.react.bridge.Arguments;
56+
import com.facebook.react.modules.core.DeviceEventManagerModule;
5457
import com.onesignal.Continue;
5558
import com.onesignal.OneSignal;
56-
import com.onesignal.debug.LogLevel;
5759
import com.onesignal.common.OneSignalWrapper;
58-
import com.onesignal.inAppMessages.IInAppMessage;
59-
import com.onesignal.inAppMessages.IInAppMessageClickListener;
60+
import com.onesignal.debug.LogLevel;
61+
import com.onesignal.debug.internal.logging.Logging;
6062
import com.onesignal.inAppMessages.IInAppMessageClickEvent;
61-
import com.onesignal.inAppMessages.IInAppMessageClickResult;
62-
import com.onesignal.inAppMessages.IInAppMessageLifecycleListener;
63-
import com.onesignal.inAppMessages.IInAppMessageWillDisplayEvent;
63+
import com.onesignal.inAppMessages.IInAppMessageClickListener;
64+
import com.onesignal.inAppMessages.IInAppMessageDidDismissEvent;
6465
import com.onesignal.inAppMessages.IInAppMessageDidDisplayEvent;
66+
import com.onesignal.inAppMessages.IInAppMessageLifecycleListener;
6567
import com.onesignal.inAppMessages.IInAppMessageWillDismissEvent;
66-
import com.onesignal.inAppMessages.IInAppMessageDidDismissEvent;
68+
import com.onesignal.inAppMessages.IInAppMessageWillDisplayEvent;
6769
import com.onesignal.notifications.INotification;
68-
import com.onesignal.notifications.INotificationClickListener;
6970
import com.onesignal.notifications.INotificationClickEvent;
71+
import com.onesignal.notifications.INotificationClickListener;
7072
import com.onesignal.notifications.INotificationLifecycleListener;
7173
import com.onesignal.notifications.INotificationWillDisplayEvent;
7274
import com.onesignal.notifications.IPermissionObserver;
75+
import com.onesignal.user.state.IUserStateObserver;
76+
import com.onesignal.user.state.UserChangedState;
7377
import com.onesignal.user.subscriptions.IPushSubscription;
7478
import com.onesignal.user.subscriptions.IPushSubscriptionObserver;
75-
import com.onesignal.user.subscriptions.PushSubscriptionState;
7679
import com.onesignal.user.subscriptions.PushSubscriptionChangedState;
77-
import com.onesignal.user.state.UserState;
78-
import com.onesignal.user.state.UserChangedState;
79-
import com.onesignal.user.state.IUserStateObserver;
80-
import org.json.JSONException;
81-
82-
import java.util.HashMap;
83-
import java.util.Map;
8480

8581
public class RNOneSignal extends ReactContextBaseJavaModule implements
8682
IPushSubscriptionObserver,
@@ -739,4 +735,10 @@ public void addListener(String eventName) {
739735
public void removeListeners(int count) {
740736
// Keep: Required for RN built in Event Emitter Calls.
741737
}
738+
739+
740+
@ReactMethod
741+
public void trackEvent(String name, @Nullable ReadableMap properties) {
742+
OneSignal.getUser().trackEvent(name, properties != null ? RNUtils.convertReadableMapToMap(properties) : null);
743+
}
742744
}

android/src/main/java/com/onesignal/rnonesignalandroid/RNUtils.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,52 @@ public static HashMap<String, String> convertReadableMapIntoStringMap(ReadableMa
284284
return stringMap;
285285
}
286286

287+
public static Map<String, Object> convertReadableMapToMap(ReadableMap readableMap) {
288+
Map<String, Object> map = new HashMap<>();
289+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
290+
291+
while (iterator.hasNextKey()) {
292+
String key = iterator.nextKey();
293+
ReadableType type = readableMap.getType(key);
294+
map.put(key, convertValue(type, readableMap, key));
295+
}
296+
297+
return map;
298+
}
299+
300+
public static List<Object> convertReadableArrayToList(ReadableArray readableArray) {
301+
List<Object> list = new ArrayList<>();
302+
303+
for (int i = 0; i < readableArray.size(); i++) {
304+
ReadableType type = readableArray.getType(i);
305+
list.add(convertValue(type, readableArray, i));
306+
}
307+
308+
return list;
309+
}
310+
311+
private static Object convertValue(ReadableType type, ReadableMap map, String key) {
312+
switch (type) {
313+
case Boolean: return map.getBoolean(key);
314+
case Number: return map.getDouble(key);
315+
case String: return map.getString(key);
316+
case Map: return convertReadableMapToMap(map.getMap(key));
317+
case Array: return convertReadableArrayToList(map.getArray(key));
318+
default: return null;
319+
}
320+
}
321+
322+
private static Object convertValue(ReadableType type, ReadableArray array, int index) {
323+
switch (type) {
324+
case Boolean: return array.getBoolean(index);
325+
case Number: return array.getDouble(index);
326+
case String: return array.getString(index);
327+
case Map: return convertReadableMapToMap(array.getMap(index));
328+
case Array: return convertReadableArrayToList(array.getArray(index));
329+
default: return null;
330+
}
331+
}
332+
287333
public static HashMap<String, Object> convertPermissionToMap(boolean granted) {
288334
HashMap<String, Object> hash = new HashMap<>();
289335

examples/RNOneSignalTS/OSButtons.tsx

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { StyleSheet, Text, View } from 'react-native';
2+
import { Platform, StyleSheet, Text, View } from 'react-native';
33
import { OneSignal } from 'react-native-onesignal';
44
import { renderButtonView } from './Helpers';
55
// Remove: import {Text, Divider} from '@react-native-material/core';
@@ -431,11 +431,33 @@ class OSButtons extends React.Component<Props> {
431431
},
432432
);
433433

434+
const trackEventButton = renderButtonView('Track Event', () => {
435+
loggingFunction('Tracking event: ', 'ReactNative');
436+
const platform = Platform.OS; // This will be 'ios' or 'android'
437+
OneSignal.User.trackEvent(`ReactNative-${platform}-noprops`);
438+
OneSignal.User.trackEvent(`ReactNative-${platform}`, {
439+
someNum: 123,
440+
someFloat: 3.14159,
441+
someString: 'abc',
442+
someBool: true,
443+
someObject: {
444+
abc: '123',
445+
nested: {
446+
def: '456',
447+
},
448+
},
449+
someArray: [1, 2, 3, 4],
450+
someMixedArray: [1, '2', { abc: '123' }],
451+
someNull: null,
452+
});
453+
});
454+
434455
return [
435456
loginButton,
436457
logoutButton,
437458
addEmailButton,
438459
removeEmailButton,
460+
trackEventButton,
439461
sendTagWithKeyButton,
440462
deleteTagWithKeyButton,
441463
addTagsButton,

examples/RNOneSignalTS/OSDemo.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class OSDemo extends React.Component<Props, State> {
3838

3939
async componentDidMount() {
4040
OneSignal.initialize(APP_ID);
41-
OneSignal.Debug.setLogLevel(LogLevel.None);
41+
OneSignal.Debug.setLogLevel(LogLevel.Verbose);
4242

4343
OneSignal.LiveActivities.setupDefault();
4444
// OneSignal.LiveActivities.setupDefault({

examples/RNOneSignalTS/ios/Podfile.lock

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,48 +8,48 @@ PODS:
88
- hermes-engine (0.81.4):
99
- hermes-engine/Pre-built (= 0.81.4)
1010
- hermes-engine/Pre-built (0.81.4)
11-
- OneSignalXCFramework (5.2.14):
12-
- OneSignalXCFramework/OneSignalComplete (= 5.2.14)
13-
- OneSignalXCFramework/OneSignal (5.2.14):
11+
- OneSignalXCFramework (5.4.0-alpha-01):
12+
- OneSignalXCFramework/OneSignalComplete (= 5.4.0-alpha-01)
13+
- OneSignalXCFramework/OneSignal (5.4.0-alpha-01):
1414
- OneSignalXCFramework/OneSignalCore
1515
- OneSignalXCFramework/OneSignalExtension
1616
- OneSignalXCFramework/OneSignalLiveActivities
1717
- OneSignalXCFramework/OneSignalNotifications
1818
- OneSignalXCFramework/OneSignalOSCore
1919
- OneSignalXCFramework/OneSignalOutcomes
2020
- OneSignalXCFramework/OneSignalUser
21-
- OneSignalXCFramework/OneSignalComplete (5.2.14):
21+
- OneSignalXCFramework/OneSignalComplete (5.4.0-alpha-01):
2222
- OneSignalXCFramework/OneSignal
2323
- OneSignalXCFramework/OneSignalInAppMessages
2424
- OneSignalXCFramework/OneSignalLocation
25-
- OneSignalXCFramework/OneSignalCore (5.2.14)
26-
- OneSignalXCFramework/OneSignalExtension (5.2.14):
25+
- OneSignalXCFramework/OneSignalCore (5.4.0-alpha-01)
26+
- OneSignalXCFramework/OneSignalExtension (5.4.0-alpha-01):
2727
- OneSignalXCFramework/OneSignalCore
2828
- OneSignalXCFramework/OneSignalOutcomes
29-
- OneSignalXCFramework/OneSignalInAppMessages (5.2.14):
29+
- OneSignalXCFramework/OneSignalInAppMessages (5.4.0-alpha-01):
3030
- OneSignalXCFramework/OneSignalCore
3131
- OneSignalXCFramework/OneSignalNotifications
3232
- OneSignalXCFramework/OneSignalOSCore
3333
- OneSignalXCFramework/OneSignalOutcomes
3434
- OneSignalXCFramework/OneSignalUser
35-
- OneSignalXCFramework/OneSignalLiveActivities (5.2.14):
35+
- OneSignalXCFramework/OneSignalLiveActivities (5.4.0-alpha-01):
3636
- OneSignalXCFramework/OneSignalCore
3737
- OneSignalXCFramework/OneSignalOSCore
3838
- OneSignalXCFramework/OneSignalUser
39-
- OneSignalXCFramework/OneSignalLocation (5.2.14):
39+
- OneSignalXCFramework/OneSignalLocation (5.4.0-alpha-01):
4040
- OneSignalXCFramework/OneSignalCore
4141
- OneSignalXCFramework/OneSignalNotifications
4242
- OneSignalXCFramework/OneSignalOSCore
4343
- OneSignalXCFramework/OneSignalUser
44-
- OneSignalXCFramework/OneSignalNotifications (5.2.14):
44+
- OneSignalXCFramework/OneSignalNotifications (5.4.0-alpha-01):
4545
- OneSignalXCFramework/OneSignalCore
4646
- OneSignalXCFramework/OneSignalExtension
4747
- OneSignalXCFramework/OneSignalOutcomes
48-
- OneSignalXCFramework/OneSignalOSCore (5.2.14):
48+
- OneSignalXCFramework/OneSignalOSCore (5.4.0-alpha-01):
4949
- OneSignalXCFramework/OneSignalCore
50-
- OneSignalXCFramework/OneSignalOutcomes (5.2.14):
50+
- OneSignalXCFramework/OneSignalOutcomes (5.4.0-alpha-01):
5151
- OneSignalXCFramework/OneSignalCore
52-
- OneSignalXCFramework/OneSignalUser (5.2.14):
52+
- OneSignalXCFramework/OneSignalUser (5.4.0-alpha-01):
5353
- OneSignalXCFramework/OneSignalCore
5454
- OneSignalXCFramework/OneSignalNotifications
5555
- OneSignalXCFramework/OneSignalOSCore
@@ -1795,7 +1795,7 @@ PODS:
17951795
- ReactCommon/turbomodule/core
17961796
- SocketRocket
17971797
- react-native-onesignal (5.2.13):
1798-
- OneSignalXCFramework (= 5.2.14)
1798+
- OneSignalXCFramework (= 5.4.0-alpha-01)
17991799
- React (< 1.0.0, >= 0.13.0)
18001800
- react-native-safe-area-context (5.6.1):
18011801
- boost
@@ -2631,7 +2631,7 @@ SPEC CHECKSUMS:
26312631
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
26322632
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
26332633
hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394
2634-
OneSignalXCFramework: 7112f3e89563e41ebc23fe807788f11985ac541c
2634+
OneSignalXCFramework: 689af4166ff7fb10349f0bbf93df75872fef1f8d
26352635
RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669
26362636
RCTDeprecation: c0ed3249a97243002615517dff789bf4666cf585
26372637
RCTRequired: 58719f5124f9267b5f9649c08bf23d9aea845b23
@@ -2665,7 +2665,7 @@ SPEC CHECKSUMS:
26652665
React-logger: a3cb5b29c32b8e447b5a96919340e89334062b48
26662666
React-Mapbuffer: 9d2434a42701d6144ca18f0ca1c4507808ca7696
26672667
React-microtasksnativemodule: 75b6604b667d297292345302cc5bfb6b6aeccc1b
2668-
react-native-onesignal: 0829ce2a504db26dd80eaf14d4e0211ea626fe62
2668+
react-native-onesignal: 372119089f89c208e3a68586e9f3c24f16d599da
26692669
react-native-safe-area-context: c6e2edd1c1da07bdce287fa9d9e60c5f7b514616
26702670
React-NativeModulesApple: 879fbdc5dcff7136abceb7880fe8a2022a1bd7c3
26712671
React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d

examples/RNOneSignalTS/ios/RNOneSignalTS.xcodeproj/project.pbxproj

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,14 +193,10 @@
193193
inputFileListPaths = (
194194
"${PODS_ROOT}/Target Support Files/Pods-RNOneSignalTS/Pods-RNOneSignalTS-frameworks-${CONFIGURATION}-input-files.xcfilelist",
195195
);
196-
inputPaths = (
197-
);
198196
name = "[CP] Embed Pods Frameworks";
199197
outputFileListPaths = (
200198
"${PODS_ROOT}/Target Support Files/Pods-RNOneSignalTS/Pods-RNOneSignalTS-frameworks-${CONFIGURATION}-output-files.xcfilelist",
201199
);
202-
outputPaths = (
203-
);
204200
runOnlyForDeploymentPostprocessing = 0;
205201
shellPath = /bin/sh;
206202
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNOneSignalTS/Pods-RNOneSignalTS-frameworks.sh\"\n";
@@ -236,14 +232,10 @@
236232
inputFileListPaths = (
237233
"${PODS_ROOT}/Target Support Files/Pods-RNOneSignalTS/Pods-RNOneSignalTS-resources-${CONFIGURATION}-input-files.xcfilelist",
238234
);
239-
inputPaths = (
240-
);
241235
name = "[CP] Copy Pods Resources";
242236
outputFileListPaths = (
243237
"${PODS_ROOT}/Target Support Files/Pods-RNOneSignalTS/Pods-RNOneSignalTS-resources-${CONFIGURATION}-output-files.xcfilelist",
244238
);
245-
outputPaths = (
246-
);
247239
runOnlyForDeploymentPostprocessing = 0;
248240
shellPath = /bin/sh;
249241
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RNOneSignalTS/Pods-RNOneSignalTS-resources.sh\"\n";

ios/RCTOneSignal/RCTOneSignalEventEmitter.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,4 +528,8 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
528528
// iOS Stub
529529
}
530530

531+
RCT_EXPORT_METHOD(trackEvent:(NSString *)name withProperties:(NSDictionary * _Nullable)properties) {
532+
[OneSignal.User trackEventWithName:name properties:properties];
533+
}
534+
531535
@end

react-native-onesignal.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ Pod::Spec.new do |s|
2222
# pod 'React', :path => '../node_modules/react-native/'
2323

2424
# The Native OneSignal-iOS-SDK XCFramework from cocoapods.
25-
s.dependency 'OneSignalXCFramework', '5.2.14'
25+
s.dependency 'OneSignalXCFramework', '5.4.0-alpha-01'
2626
end

0 commit comments

Comments
 (0)