mirror of
https://github.com/zhigang1992/react-native-notifications.git
synced 2026-06-12 17:18:11 +08:00
185 lines
6.1 KiB
JavaScript
185 lines
6.1 KiB
JavaScript
/**
|
|
* @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<NotificationCategory>) {
|
|
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: string) {
|
|
NativeRNNotifications.log(message);
|
|
}
|
|
|
|
/**
|
|
* Presenting local notification
|
|
*
|
|
* notification is an object containing:
|
|
*
|
|
* - `alertBody` : The message displayed in the notification alert.
|
|
* - `alertTitle` : The message title displayed in the notification.
|
|
* - `alertAction` : The "action" displayed beneath an actionable notification. Defaults to "view";
|
|
* - `soundName` : The sound played when the notification is fired (optional).
|
|
* - `category` : The category of this notification, required for actionable notifications (optional).
|
|
* - `userInfo` : An optional object containing additional notification data.
|
|
* - `fireDate` : The date and time when the system should deliver the notification. if not specified, the notification will be dispatched immediately.
|
|
*/
|
|
static localNotification(notification: Object) {
|
|
NativeRNNotifications.localNotification(notification);
|
|
}
|
|
}
|