@ua/react-native-airship
Version:
Airship plugin for React Native apps.
74 lines (70 loc) • 2.03 kB
JavaScript
;
/* Copyright Airship and Contributors */
import { NativeEventEmitter, Platform, AppRegistry } from 'react-native';
/**
* SDK event emitter.
*
* @hidden
*/
export class UAEventEmitter {
listeners = new Map();
constructor(nativeModule) {
this.nativeModule = nativeModule;
this.eventEmitter = new NativeEventEmitter(nativeModule);
if (Platform.OS === 'android') {
AppRegistry.registerHeadlessTask('AirshipAndroidBackgroundEventTask', () => {
return () => this.dispatchEvents(true);
});
}
this.eventEmitter.addListener('com.airship.pending_events', async () => {
return this.dispatchEvents(false);
});
}
removeListener(eventType, listener) {
var typedListeners = this.listeners.get(eventType);
if (typedListeners) {
typedListeners = typedListeners.filter(obj => obj !== listener);
this.listeners.set(eventType, typedListeners);
}
}
addListener(eventType, listener) {
if (!this.listeners.get(eventType)) {
this.listeners.set(eventType, new Array());
}
this.listeners.get(eventType)?.push(listener);
this.nativeModule.airshipListenerAdded(eventType);
}
removeAllListeners(eventType) {
this.listeners.set(eventType, new Array());
}
async dispatchEvents(isHeadlessJS) {
let actions = Array.from(this.listeners.keys()).map(async key => {
let typedListeners = this.listeners.get(key);
if (typedListeners == null) {
return Promise.resolve();
}
let events = await this.nativeModule.takePendingEvents(key, isHeadlessJS);
return Promise.all(typedListeners.map(async listener => {
for (const event of events) {
await listener(event);
}
}));
});
return Promise.all(actions);
}
}
/**
* A listener subscription.
*/
export class Subscription {
constructor(onRemove) {
this.onRemove = onRemove;
}
/**
* Removes the listener.
*/
remove() {
this.onRemove();
}
}
//# sourceMappingURL=UAEventEmitter.js.map