Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,19 +178,22 @@ private void removeObservers() {
}

private void removeHandlers() {
if (!oneSignalInitDone) {
Logging.debug("OneSignal React-Native SDK not initialized yet. Could not remove handlers.", null);
return;
if (hasAddedInAppMessageClickListener) {
OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener);
hasAddedInAppMessageClickListener = false;
}
if (hasAddedInAppMessageLifecycleListener) {
OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener);
hasAddedInAppMessageLifecycleListener = false;
}
if (hasAddedNotificationClickListener) {
OneSignal.getNotifications().removeClickListener(rnNotificationClickListener);
hasAddedNotificationClickListener = false;
}
if (hasAddedNotificationForegroundListener) {
OneSignal.getNotifications().removeForegroundLifecycleListener(this);
hasAddedNotificationForegroundListener = false;
}

OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener);
hasAddedInAppMessageClickListener = false;
OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener);
hasAddedInAppMessageLifecycleListener = false;
OneSignal.getNotifications().removeClickListener(rnNotificationClickListener);
hasAddedNotificationClickListener = false;
OneSignal.getNotifications().removeForegroundLifecycleListener(this);
hasAddedNotificationForegroundListener = false;
}

private void sendEvent(String eventName, Object params) {
Expand Down
44 changes: 44 additions & 0 deletions ios/RCTOneSignal/RCTOneSignalEventEmitter.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ @implementation RCTOneSignalEventEmitter {
}

static BOOL _didStartObserving = false;
// Static reference to track current instance for cleanup on reload
static RCTOneSignalEventEmitter *_currentInstance = nil;

+ (BOOL)hasSetBridge {
return _didStartObserving;
Expand Down Expand Up @@ -48,6 +50,13 @@ - (instancetype)init {
selector:@selector(emitEvent:)
name:eventName
object:nil];

// Clean up previous instance if it exists (handles reload scenario)
if (_currentInstance != nil && _currentInstance != self) {
[_currentInstance removeHandlers];
[_currentInstance removeObservers];
}
_currentInstance = self;
}

return self;
Expand All @@ -64,6 +73,8 @@ - (void)startObserving {

- (void)stopObserving {
_hasListeners = false;
[self removeHandlers];
[self removeObservers];
}

- (NSArray<NSString *> *)supportedEvents {
Expand Down Expand Up @@ -584,4 +595,37 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
// iOS Stub
}

- (void)removeObservers {
[self removePermissionObserver];
[self removePushSubscriptionObserver];
[self removeUserStateObserver];
}

- (void)removeHandlers {
if (_hasAddedInAppMessageClickListener) {
[OneSignal.InAppMessages removeClickListener:[RCTOneSignal sharedInstance]];
_hasAddedInAppMessageClickListener = false;
}
if (_hasAddedInAppMessageLifecycleListener) {
[OneSignal.InAppMessages
removeLifecycleListener:[RCTOneSignal sharedInstance]];
_hasAddedInAppMessageLifecycleListener = false;
}
if (_hasAddedNotificationClickListener) {
[OneSignal.Notifications removeClickListener:[RCTOneSignal sharedInstance]];
_hasAddedNotificationClickListener = false;
}
if (_hasAddedNotificationForegroundLifecycleListener) {
[OneSignal.Notifications removeForegroundLifecycleListener:self];
_hasAddedNotificationForegroundLifecycleListener = false;
}
}

- (void)removeUserStateObserver {
if (_hasSetUserStateObserver) {
[OneSignal.User removeObserver:[RCTOneSignal sharedInstance]];
_hasSetUserStateObserver = false;
}
}

@end
Loading