Skip to content

Commit 3a0e386

Browse files
committed
Add iOS implementation
- Add JWT and event listener to wrapper - Token added as parameter to login - updateUserJwt - UserJwtInvalidatedEvent - Add & Remove Listener methods - new methods updateUserJwt and addUserJwtInvalidatedListener added to the bridge
1 parent 0fa9e05 commit 3a0e386

File tree

7 files changed

+70
-6
lines changed

7 files changed

+70
-6
lines changed

ios/RCTOneSignal/RCTOneSignal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#import "../OneSignalFramework.h"
66
#endif
77

8-
@interface RCTOneSignal : NSObject <OSPushSubscriptionObserver, OSNotificationPermissionObserver, OSInAppMessageLifecycleListener, OSInAppMessageClickListener, OSNotificationClickListener, OSUserStateObserver>
8+
@interface RCTOneSignal : NSObject <OSPushSubscriptionObserver, OSNotificationPermissionObserver, OSInAppMessageLifecycleListener, OSInAppMessageClickListener, OSNotificationClickListener, OSUserStateObserver, OSUserJwtInvalidatedListener>
99
+ (RCTOneSignal *) sharedInstance;
1010

1111
@end

ios/RCTOneSignal/RCTOneSignal.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ - (void)onDidDismissInAppMessage:(OSInAppMessageDidDismissEvent * _Nonnull)event
150150
[self sendEvent:OSEventString(InAppMessageDidDismiss) withBody:[event jsonRepresentation]];
151151
}
152152

153+
- (void)onUserJwtInvalidated:(OSUserJwtInvalidatedEvent * _Nonnull)event {
154+
[self sendEvent:OSEventString(UserJwtInvalidated) withBody:[event jsonRepresentation]];
155+
}
156+
153157
- (void)dealloc {
154158
[[NSNotificationCenter defaultCenter] removeObserver:self];
155159
}

ios/RCTOneSignal/RCTOneSignalEventEmitter.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ typedef NS_ENUM(NSInteger, OSNotificationEventTypes) {
2323
InAppMessageDidDisplay,
2424
InAppMessageWillDismiss,
2525
InAppMessageDidDismiss,
26+
UserJwtInvalidated,
2627
};
2728

28-
#define OSNotificationEventTypesArray @[@"OneSignal-permissionChanged",@"OneSignal-subscriptionChanged",@"OneSignal-userStateChanged",@"OneSignal-notificationWillDisplayInForeground",@"OneSignal-notificationClicked",@"OneSignal-inAppMessageClicked", @"OneSignal-inAppMessageWillDisplay", @"OneSignal-inAppMessageDidDisplay", @"OneSignal-inAppMessageWillDismiss", @"OneSignal-inAppMessageDidDismiss"]
29+
#define OSNotificationEventTypesArray @[@"OneSignal-permissionChanged",@"OneSignal-subscriptionChanged",@"OneSignal-userStateChanged",@"OneSignal-notificationWillDisplayInForeground",@"OneSignal-notificationClicked",@"OneSignal-inAppMessageClicked", @"OneSignal-inAppMessageWillDisplay", @"OneSignal-inAppMessageDidDisplay", @"OneSignal-inAppMessageWillDismiss", @"OneSignal-inAppMessageDidDismiss", @"OneSignal-userJwtInvalidated"]
2930

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

ios/RCTOneSignal/RCTOneSignalEventEmitter.m

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ @implementation RCTOneSignalEventEmitter {
1515
BOOL _hasAddedNotificationForegroundLifecycleListener;
1616
BOOL _hasAddedInAppMessageClickListener;
1717
BOOL _hasAddedInAppMessageLifecycleListener;
18+
BOOL _hasAddedUserJwtInvalidatedListener;
1819
NSMutableDictionary* _preventDefaultCache;
1920
NSMutableDictionary* _notificationWillDisplayCache;
2021
}
@@ -104,14 +105,30 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
104105
[OneSignal initialize:appId withLaunchOptions:NULL];
105106
}
106107

107-
RCT_EXPORT_METHOD(login:(NSString *)externalId) {
108-
[OneSignal login:externalId];
108+
RCT_EXPORT_METHOD(login:(NSString *)externalId jwtToken:(NSString *)jwtToken) {
109+
// Pass nil if jwtToken is not provided
110+
if (jwtToken == (id)[NSNull null]) {
111+
jwtToken = nil;
112+
}
113+
114+
[OneSignal login:externalId withToken:jwtToken];
109115
}
110116

111117
RCT_EXPORT_METHOD(logout) {
112118
[OneSignal logout];
113119
}
114120

121+
RCT_EXPORT_METHOD(updateUserJwt:(NSString *)externalId token:(NSString *)token) {
122+
[OneSignal updateUserJwt:externalId withToken:token];
123+
}
124+
125+
RCT_EXPORT_METHOD(addUserJwtInvalidatedListener) {
126+
if (!_hasAddedUserJwtInvalidatedListener) {
127+
[OneSignal addUserJwtInvalidatedListener:[RCTOneSignal sharedInstance]];
128+
_hasAddedUserJwtInvalidatedListener = true;
129+
}
130+
}
131+
115132
RCT_EXPORT_METHOD(enterLiveActivity:(NSString *)activityId
116133
withToken:(NSString *)token
117134
withResponse:(RCTResponseSenderBlock)callback) {

src/events/EventManager.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
IN_APP_MESSAGE_WILL_DISMISS,
1616
IN_APP_MESSAGE_DID_DISMISS,
1717
IN_APP_MESSAGE_DID_DISPLAY,
18+
USER_JWT_INVALIDATED,
1819
} from './events';
1920
import OSNotification from '../OSNotification';
2021

@@ -29,6 +30,7 @@ const eventList = [
2930
IN_APP_MESSAGE_WILL_DISMISS,
3031
IN_APP_MESSAGE_DID_DISMISS,
3132
IN_APP_MESSAGE_DID_DISPLAY,
33+
USER_JWT_INVALIDATED,
3234
];
3335

3436
export default class EventManager {

src/events/events.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ export const IN_APP_MESSAGE_DID_DISMISS = 'OneSignal-inAppMessageDidDismiss';
99
export const PERMISSION_CHANGED = 'OneSignal-permissionChanged';
1010
export const SUBSCRIPTION_CHANGED = 'OneSignal-subscriptionChanged';
1111
export const USER_STATE_CHANGED = 'OneSignal-userStateChanged';
12+
export const USER_JWT_INVALIDATED = 'OneSignal-userJwtInvalidated';

src/index.ts

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
NOTIFICATION_WILL_DISPLAY,
1313
PERMISSION_CHANGED,
1414
SUBSCRIPTION_CHANGED,
15+
USER_JWT_INVALIDATED,
1516
USER_STATE_CHANGED,
1617
} from './events/events';
1718
import {
@@ -53,6 +54,10 @@ export enum LogLevel {
5354
Verbose,
5455
}
5556

57+
export interface UserJwtInvalidatedEvent {
58+
externalId: string;
59+
}
60+
5661
// Internal wrapper notification permission state that is being updated by the permission change handler.
5762
let notificationPermission = false;
5863

@@ -99,10 +104,10 @@ export namespace OneSignal {
99104
* If your integration is user-centric, or you want the ability to identify the user beyond the current device, the
100105
* login method should be called to identify the user.
101106
*/
102-
export function login(externalId: string) {
107+
export function login(externalId: string, jwtToken?: string) {
103108
if (!isNativeModuleLoaded(RNOneSignal)) return;
104109

105-
RNOneSignal.login(externalId);
110+
RNOneSignal.login(externalId, jwtToken || null);
106111
}
107112

108113
/**
@@ -115,6 +120,40 @@ export namespace OneSignal {
115120
RNOneSignal.logout();
116121
}
117122

123+
/**
124+
* Update the JWT token for a user.
125+
*/
126+
export function updateUserJwt(externalId: string, token: string) {
127+
if (!isNativeModuleLoaded(RNOneSignal)) return;
128+
129+
RNOneSignal.updateUserJwt(externalId, token);
130+
}
131+
132+
/** Add a callback that fires when the user's JWT is invalidated. */
133+
export function addEventListener(
134+
event: 'userJwtInvalidated',
135+
listener: (event: UserJwtInvalidatedEvent) => void,
136+
) {
137+
if (!isNativeModuleLoaded(RNOneSignal)) return;
138+
139+
isValidCallback(listener);
140+
RNOneSignal.addUserJwtInvalidatedListener();
141+
eventManager.addEventListener<UserJwtInvalidatedEvent>(
142+
USER_JWT_INVALIDATED,
143+
listener,
144+
);
145+
}
146+
147+
/** Clears current UserJwtInvalidated listeners. */
148+
export function removeEventListener(
149+
event: 'userJwtInvalidated',
150+
listener: (event: UserJwtInvalidatedEvent) => void,
151+
) {
152+
if (!isNativeModuleLoaded(RNOneSignal)) return;
153+
154+
eventManager.removeEventListener(USER_JWT_INVALIDATED, listener);
155+
}
156+
118157
/** For GDPR users, your application should call this method before setting the App ID. */
119158
export function setConsentRequired(required: boolean) {
120159
if (!isNativeModuleLoaded(RNOneSignal)) return;

0 commit comments

Comments
 (0)