Skip to content

Commit

Permalink
Merge pull request #1300 from OneSignal/feat/IAM-lifecycle-methods
Browse files Browse the repository at this point in the history
Add in app message lifecycle handler
nan-li authored Nov 15, 2021
2 parents 5046306 + bb60bbe commit 15cf476
Showing 11 changed files with 139 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -67,6 +67,8 @@ of this software and associated documentation files (the "Software"), to deal
import com.onesignal.OneSignal.EmailUpdateError;
import com.onesignal.OneSignal.EmailUpdateHandler;
import com.onesignal.OneSignal.OSInAppMessageClickHandler;
import com.onesignal.OSInAppMessageLifecycleHandler;
import com.onesignal.OSInAppMessage;
import com.onesignal.OneSignal.OSNotificationOpenedHandler;
import com.onesignal.OneSignal.OutcomeCallback;

@@ -130,6 +132,7 @@ private void removeHandlers() {
OneSignal.setInAppMessageClickHandler(null);
OneSignal.setNotificationOpenedHandler(null);
OneSignal.setNotificationWillShowInForegroundHandler(null);
OneSignal.setInAppMessageLifecycleHandler(null);
}

private void sendEvent(String eventName, Object params) {
@@ -627,6 +630,34 @@ public void inAppMessageClicked(OSInAppMessageAction result) {
}
this.sendEvent("OneSignal-inAppMessageClicked", RNUtils.jsonToWritableMap(result.toJSONObject()));
}

/* in app message lifecycle */

@ReactMethod
public void setInAppMessageLifecycleHandler() {
OneSignal.setInAppMessageLifecycleHandler(new OSInAppMessageLifecycleHandler() {
@Override
public void onWillDisplayInAppMessage(OSInAppMessage message) {
sendEvent("OneSignal-inAppMessageWillDisplay",
RNUtils.jsonToWritableMap(message.toJSONObject()));
}
@Override
public void onDidDisplayInAppMessage(OSInAppMessage message) {
sendEvent("OneSignal-inAppMessageDidDisplay",
RNUtils.jsonToWritableMap(message.toJSONObject()));
}
@Override
public void onWillDismissInAppMessage(OSInAppMessage message) {
sendEvent("OneSignal-inAppMessageWillDismiss",
RNUtils.jsonToWritableMap(message.toJSONObject()));
}
@Override
public void onDidDismissInAppMessage(OSInAppMessage message) {
sendEvent("OneSignal-inAppMessageDidDismiss",
RNUtils.jsonToWritableMap(message.toJSONObject()));
}
});
}

/* other IAM functions */

Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray;
import com.facebook.react.bridge.WritableNativeMap;
import com.onesignal.OSInAppMessage;

import org.json.JSONArray;
import org.json.JSONException;
14 changes: 14 additions & 0 deletions examples/RNOneSignalTS/src/OSDemo.tsx
Original file line number Diff line number Diff line change
@@ -63,6 +63,20 @@ class OSDemo extends React.Component<Props, State> {
OneSignal.setInAppMessageClickHandler(event => {
this.OSLog("OneSignal IAM clicked:", event);
});
OneSignal.setInAppMessageLifecycleHandler({
onWillDisplayInAppMessage: message => {
this.OSLog("OneSignal: will display IAM: ", message.messageId)
},
onDidDisplayInAppMessage: message => {
this.OSLog("OneSignal: did display IAM: ", message.messageId)
},
onWillDismissInAppMessage: message => {
this.OSLog("OneSignal: will dismiss IAM: ", message.messageId)
},
onDidDismissInAppMessage: message => {
this.OSLog("OneSignal: did dismiss IAM: ", message.messageId)
}
});
OneSignal.addEmailSubscriptionObserver((event) => {
this.OSLog("OneSignal: email subscription changed: ", event);
});
2 changes: 1 addition & 1 deletion ios/RCTOneSignal/RCTOneSignal.h
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@

#define INIT_DEPRECATION_NOTICE "Objective-C Initialization of the OneSignal SDK has been deprecated. Use JavaScript init instead."

@interface RCTOneSignal : NSObject <OSSubscriptionObserver, OSEmailSubscriptionObserver, OSPermissionObserver, OSSMSSubscriptionObserver>
@interface RCTOneSignal : NSObject <OSSubscriptionObserver, OSEmailSubscriptionObserver, OSPermissionObserver, OSSMSSubscriptionObserver, OSInAppMessageLifecycleHandler>

+ (RCTOneSignal *) sharedInstance;

16 changes: 16 additions & 0 deletions ios/RCTOneSignal/RCTOneSignal.m
Original file line number Diff line number Diff line change
@@ -90,6 +90,22 @@ - (void)onOSPermissionChanged:(OSPermissionStateChanges *)stateChanges {
[self sendEvent:OSEventString(PermissionChanged) withBody:stateChanges.toDictionary];
}

- (void)onWillDisplayInAppMessage:(OSInAppMessage * _Nonnull)message {
[self sendEvent:OSEventString(InAppMessageWillDisplay) withBody:[message jsonRepresentation]];
}

- (void)onDidDisplayInAppMessage:(OSInAppMessage * _Nonnull)message {
[self sendEvent:OSEventString(InAppMessageDidDisplay) withBody:[message jsonRepresentation]];
}

- (void)onWillDismissInAppMessage:(OSInAppMessage * _Nonnull)message {
[self sendEvent:OSEventString(InAppMessageWillDismiss) withBody:[message jsonRepresentation]];
}

- (void)onDidDismissInAppMessage:(OSInAppMessage * _Nonnull)message {
[self sendEvent:OSEventString(InAppMessageDidDismiss) withBody:[message jsonRepresentation]];
}

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
6 changes: 5 additions & 1 deletion ios/RCTOneSignal/RCTOneSignalEventEmitter.h
Original file line number Diff line number Diff line change
@@ -20,9 +20,13 @@ typedef NS_ENUM(NSInteger, OSNotificationEventTypes) {
InAppMessageClicked,
EmailSubscriptionChanged,
SMSSubscriptionChanged,
InAppMessageWillDisplay,
InAppMessageDidDisplay,
InAppMessageWillDismiss,
InAppMessageDidDismiss,
};

#define OSNotificationEventTypesArray @[@"OneSignal-permissionChanged",@"OneSignal-subscriptionChanged",@"OneSignal-notificationWillShowInForeground",@"OneSignal-remoteNotificationOpened",@"OneSignal-inAppMessageClicked",@"OneSignal-emailSubscriptionChanged", @"OneSignal-smsSubscriptionChanged"]
#define OSNotificationEventTypesArray @[@"OneSignal-permissionChanged",@"OneSignal-subscriptionChanged",@"OneSignal-notificationWillShowInForeground",@"OneSignal-remoteNotificationOpened",@"OneSignal-inAppMessageClicked",@"OneSignal-emailSubscriptionChanged", @"OneSignal-smsSubscriptionChanged", @"OneSignal-inAppMessageWillDisplay", @"OneSignal-inAppMessageDidDisplay", @"OneSignal-inAppMessageWillDismiss", @"OneSignal-inAppMessageDidDismiss"]

#define OSEventString(enum) [OSNotificationEventTypesArray objectAtIndex:enum]

8 changes: 8 additions & 0 deletions ios/RCTOneSignal/RCTOneSignalEventEmitter.m
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ @implementation RCTOneSignalEventEmitter {
BOOL _hasSetPermissionObserver;
BOOL _hasSetEmailSubscriptionObserver;
BOOL _hasSetSMSSubscriptionObserver;
BOOL _hasSetInAppMessageLifecycleHandler;
NSMutableDictionary* _notificationCompletionCache;
NSMutableDictionary* _receivedNotificationCache;
}
@@ -162,6 +163,13 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
}
}

RCT_EXPORT_METHOD(setInAppMessageLifecycleHandler) {
if (!_hasSetInAppMessageLifecycleHandler) {
[OneSignal setInAppMessageLifecycleHandler:[RCTOneSignal sharedInstance]];
_hasSetInAppMessageLifecycleHandler = true;
}
}

RCT_REMAP_METHOD(requiresUserPrivacyConsent, requiresPrivacyConsentResolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject) {
resolve(@(OneSignal.requiresUserPrivacyConsent));
12 changes: 10 additions & 2 deletions src/EventManager.js
Original file line number Diff line number Diff line change
@@ -8,7 +8,11 @@ import {
NOTIFICATION_OPENED,
IN_APP_MESSAGE_CLICKED,
EMAIL_SUBSCRIPTION_CHANGED,
SMS_SUBSCRIPTION_CHANGED
SMS_SUBSCRIPTION_CHANGED,
IN_APP_MESSAGE_WILL_DISPLAY,
IN_APP_MESSAGE_WILL_DISMISS,
IN_APP_MESSAGE_DID_DISMISS,
IN_APP_MESSAGE_DID_DISPLAY,
} from './events';

const eventList = [
@@ -18,7 +22,11 @@ const eventList = [
NOTIFICATION_OPENED,
IN_APP_MESSAGE_CLICKED,
EMAIL_SUBSCRIPTION_CHANGED,
SMS_SUBSCRIPTION_CHANGED
SMS_SUBSCRIPTION_CHANGED,
IN_APP_MESSAGE_WILL_DISPLAY,
IN_APP_MESSAGE_WILL_DISMISS,
IN_APP_MESSAGE_DID_DISMISS,
IN_APP_MESSAGE_DID_DISPLAY,
]

export default class EventManager {
7 changes: 7 additions & 0 deletions src/events.js
Original file line number Diff line number Diff line change
@@ -2,6 +2,13 @@
export const NOTIFICATION_WILL_SHOW = 'OneSignal-notificationWillShowInForeground';
export const NOTIFICATION_OPENED = 'OneSignal-remoteNotificationOpened'
export const IN_APP_MESSAGE_CLICKED = 'OneSignal-inAppMessageClicked';

// In-App Message lifecycle events
export const IN_APP_MESSAGE_WILL_DISPLAY = 'OneSignal-inAppMessageWillDisplay';
export const IN_APP_MESSAGE_DID_DISPLAY = 'OneSignal-inAppMessageDidDisplay';
export const IN_APP_MESSAGE_WILL_DISMISS = 'OneSignal-inAppMessageWillDismiss';
export const IN_APP_MESSAGE_DID_DISMISS = 'OneSignal-inAppMessageDidDismiss';

export const PERMISSION_CHANGED = 'OneSignal-permissionChanged';
export const SUBSCRIPTION_CHANGED = 'OneSignal-subscriptionChanged';
export const EMAIL_SUBSCRIPTION_CHANGED = 'OneSignal-emailSubscriptionChanged';
18 changes: 18 additions & 0 deletions src/index.d.ts
Original file line number Diff line number Diff line change
@@ -103,6 +103,17 @@ declare module 'react-native-onesignal' {
tags ?: object;
}

export interface InAppMessage {
messageId : string
}

export interface InAppMessageLifecycleHandlerObject {
onWillDisplayInAppMessage ?: (message: InAppMessage) => void;
onDidDisplayInAppMessage ?: (message: InAppMessage) => void;
onWillDismissInAppMessage ?: (message: InAppMessage) => void;
onDidDismissInAppMessage ?: (message: InAppMessage) => void;
}

export interface OutcomeEvent {
session : string;
id : string;
@@ -383,6 +394,13 @@ declare module 'react-native-onesignal' {
*/
setInAppMessageClickHandler(handler: (action: InAppMessageAction) => void): void;

/**
* Sets the In-App Message lifecycle handler object to run on displaying and/or dismissing an In-App Message.
* @param {InAppMessageLifecycleHandlerObject} handlerObject
* @returns void
*/
setInAppMessageLifecycleHandler(handlerObject: InAppMessageLifecycleHandlerObject) : void;

/**
* Add an In-App Message Trigger.
* @param {string} key
29 changes: 28 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
@@ -9,7 +9,11 @@ import {
NOTIFICATION_WILL_SHOW,
NOTIFICATION_OPENED,
EMAIL_SUBSCRIPTION_CHANGED,
SMS_SUBSCRIPTION_CHANGED
SMS_SUBSCRIPTION_CHANGED,
IN_APP_MESSAGE_WILL_DISPLAY,
IN_APP_MESSAGE_WILL_DISMISS,
IN_APP_MESSAGE_DID_DISMISS,
IN_APP_MESSAGE_DID_DISPLAY,
} from './events';
import { isValidCallback, isObjectNonNull } from './helpers';

@@ -373,6 +377,29 @@ export default class OneSignal {
eventManager.setEventHandler(IN_APP_MESSAGE_CLICKED, handler);
}

static setInAppMessageLifecycleHandler(handlerObject) {
if (!isObjectNonNull(RNOneSignal)) return;

if (handlerObject.onWillDisplayInAppMessage) {
isValidCallback(handlerObject.onWillDisplayInAppMessage);
eventManager.setEventHandler(IN_APP_MESSAGE_WILL_DISPLAY, handlerObject.onWillDisplayInAppMessage);
}
if (handlerObject.onDidDisplayInAppMessage) {
isValidCallback(handlerObject.onDidDisplayInAppMessage);
eventManager.setEventHandler(IN_APP_MESSAGE_DID_DISPLAY, handlerObject.onDidDisplayInAppMessage);
}
if (handlerObject.onWillDismissInAppMessage) {
isValidCallback(handlerObject.onWillDismissInAppMessage);
eventManager.setEventHandler(IN_APP_MESSAGE_WILL_DISMISS, handlerObject.onWillDismissInAppMessage);
}
if (handlerObject.onDidDismissInAppMessage) {
isValidCallback(handlerObject.onDidDismissInAppMessage);
eventManager.setEventHandler(IN_APP_MESSAGE_DID_DISMISS, handlerObject.onDidDismissInAppMessage);
}

RNOneSignal.setInAppMessageLifecycleHandler();
}

// Pass a String key and any value and creates a trigger map to pass to addTriggers()
static addTrigger(key, value) {
if (!isObjectNonNull(RNOneSignal)) return;

0 comments on commit 15cf476

Please sign in to comment.