/** * @providesModule RNNotifications * @flow */ "use strict"; import { NativeModules, DeviceEventEmitter, NativeAppEventEmitter } from "react-native"; import Map from "core-js/library/es6/map"; const NativeRNNotifications = NativeModules.RNNotifications; // eslint-disable-line no-unused-vars import IOSNotification from "./notification.ios"; export const DEVICE_REMOTE_NOTIFICATIONS_REGISTERED_EVENT = "remoteNotificationsRegistered"; export const DEVICE_PUSH_KIT_REGISTERED_EVENT = "pushKitRegistered"; export const DEVICE_NOTIFICATION_RECEIVED_FOREGROUND_EVENT = "notificationReceivedForeground"; export const DEVICE_NOTIFICATION_RECEIVED_BACKGROUND_EVENT = "notificationReceivedBackground"; export const DEVICE_NOTIFICATION_OPENED_EVENT = "notificationOpened"; const DEVICE_NOTIFICATION_ACTION_RECEIVED = "notificationActionReceived"; const _exportedEvents = [ DEVICE_REMOTE_NOTIFICATIONS_REGISTERED_EVENT, DEVICE_PUSH_KIT_REGISTERED_EVENT, DEVICE_NOTIFICATION_RECEIVED_FOREGROUND_EVENT, DEVICE_NOTIFICATION_RECEIVED_BACKGROUND_EVENT, DEVICE_NOTIFICATION_OPENED_EVENT ]; let _notificationHandlers = new Map(); let _actionHandlers = new Map(); let _actionListener; export class NotificationAction { constructor(options: Object, handler: Function) { this.options = options; this.handler = handler; } } export class NotificationCategory { constructor(options: Object) { this.options = options; } } export default class NotificationsIOS { /** * Attaches a listener to remote notification events while the app is running * in the foreground or the background. * * Valid events are: * * - `remoteNotificationsRegistered` : Fired when the user registers for remote notifications. The handler will be invoked with a hex string representing the deviceToken. * - `notificationReceivedForeground` : Fired when a notification (local / remote) is received when app is on foreground state. * - `notificationReceivedBackground`: Fired when a background notification is received. * - `notificationOpened`: Fired when a notification (local / remote) is opened. */ static addEventListener(type: string, handler: Function) { if (_exportedEvents.indexOf(type) !== -1) { let listener; if (type === DEVICE_REMOTE_NOTIFICATIONS_REGISTERED_EVENT) { listener = DeviceEventEmitter.addListener( DEVICE_REMOTE_NOTIFICATIONS_REGISTERED_EVENT, registration => handler(registration.deviceToken) ); } else if (type === DEVICE_PUSH_KIT_REGISTERED_EVENT) { listener = DeviceEventEmitter.addListener( DEVICE_PUSH_KIT_REGISTERED_EVENT, registration => handler(registration.pushKitToken) ); } else { listener = DeviceEventEmitter.addListener( type, notification => handler(new IOSNotification(notification)) ); } _notificationHandlers.set(handler, listener); } } /** * Removes the event listener. Do this in `componentWillUnmount` to prevent * memory leaks */ static removeEventListener(type: string, handler: Function) { if (_exportedEvents.indexOf(type) !== -1) { let listener = _notificationHandlers.get(handler); if (!listener) { return; } listener.remove(); _notificationHandlers.delete(handler); } } static _actionHandlerDispatcher(action: Object) { let actionHandler = _actionHandlers.get(action.identifier); if (actionHandler) { action.notification = new IOSNotification(action.notification); actionHandler(action, () => { NativeRNNotifications.completionHandler(action.completionKey); }); } } /** * Sets the notification categories */ static requestPermissions(categories: Array) { let notificationCategories = []; if (categories) { // subscribe once for all actions _actionListener = NativeAppEventEmitter.addListener(DEVICE_NOTIFICATION_ACTION_RECEIVED, this._actionHandlerDispatcher.bind(this)); notificationCategories = categories.map(category => { return Object.assign({}, category.options, { actions: category.options.actions.map(action => { // subscribe to action event _actionHandlers.set(action.options.identifier, action.handler); return action.options; }) }); }); } NativeRNNotifications.requestPermissionsWithCategories(notificationCategories); } /** * Unregister for all remote notifications received via Apple Push Notification service. */ static abandonPermissions() { NativeRNNotifications.abandonPermissions(); } /** * Removes the event listener. Do this in `componentWillUnmount` to prevent * memory leaks */ static resetCategories() { if (_actionListener) { _actionListener.remove(); } _actionHandlers.clear(); } static registerPushKit() { NativeRNNotifications.registerPushKit(); } static backgroundTimeRemaining(callback: Function) { NativeRNNotifications.backgroundTimeRemaining(callback); } static consumeBackgroundQueue() { NativeRNNotifications.consumeBackgroundQueue(); } static log(message) { NativeRNNotifications.log(message); } }