diff --git a/examples/demo/bun.lock b/examples/demo/bun.lock index ba93fc12..82645ac6 100644 --- a/examples/demo/bun.lock +++ b/examples/demo/bun.lock @@ -1010,7 +1010,7 @@ "react-native-dotenv": ["react-native-dotenv@3.4.11", "", { "dependencies": { "dotenv": "^16.4.5" }, "peerDependencies": { "@babel/runtime": "^7.20.6" } }, "sha512-6vnIE+WHABSeHCaYP6l3O1BOEhWxKH6nHAdV7n/wKn/sciZ64zPPp2NUdEUf1m7g4uuzlLbjgr+6uDt89q2DOg=="], - "react-native-onesignal": ["react-native-onesignal@../../react-native-onesignal.tgz", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react-native": ">=0.76.0" } }, "sha512-gc/KSxGWHWszNWwjZXzRoP3iHiWO5ucpG1Uyj+Y/qiAfU44eXznmHzYZTb61sAJxPakI+yKd3dhAHhbjolGB1g=="], + "react-native-onesignal": ["react-native-onesignal@../../react-native-onesignal.tgz", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react-native": ">=0.76.0" } }, "sha512-0OG4WHEAUy3JoiBzV7pqUwSoWO+gqKwZO1LyZ/FCnjFOXYMAnYzqiizVnbfU5dr7hIXe5KO9EvT8wn5SVsDlzA=="], "react-native-safe-area-context": ["react-native-safe-area-context@5.6.2", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg=="], diff --git a/src/events/EventManager.test.ts b/src/events/EventManager.test.ts index 6edb6ba2..a27c7d08 100644 --- a/src/events/EventManager.test.ts +++ b/src/events/EventManager.test.ts @@ -93,6 +93,18 @@ describe('EventManager', () => { new EventManager(null as never); expect(freshModule.onPermissionChanged).not.toHaveBeenCalled(); }); + + test('should not crash when event emitters are unavailable (Old Architecture)', () => { + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + const moduleWithoutEmitters = {} as never; + + expect(() => new EventManager(moduleWithoutEmitters)).not.toThrow(); + expect(consoleSpy).toHaveBeenCalledWith( + expect.stringContaining('Native event emitters are not available'), + ); + + consoleSpy.mockRestore(); + }); }); describe('addEventListener', () => { diff --git a/src/events/EventManager.ts b/src/events/EventManager.ts index 86f5799e..bbe24e73 100644 --- a/src/events/EventManager.ts +++ b/src/events/EventManager.ts @@ -60,6 +60,14 @@ export default class EventManager { setupListeners() { if (this.RNOneSignal == null) return; + if (typeof this.RNOneSignal.onPermissionChanged !== 'function') { + console.error( + 'OneSignal: Native event emitters are not available. ' + + 'Ensure the New Architecture (TurboModules) is enabled and the native module is rebuilt.', + ); + return; + } + this.nativeSubscriptions.push( this.RNOneSignal.onPermissionChanged((payload) => { const typed = payload as { permission: boolean };