UNPKG

nativescript-plugin-firebase-ssi

Version:
505 lines (504 loc) 22.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var nativescript_shared_notification_delegate_1 = require("nativescript-shared-notification-delegate"); var applicationSettings = require("tns-core-modules/application-settings"); var application = require("tns-core-modules/application/application"); var platform_1 = require("tns-core-modules/platform/platform"); var firebase_common_1 = require("../firebase-common"); var utils_1 = require("../utils"); var _notificationActionTakenCallback; var _pendingNotifications = []; var _pendingActionTakenNotifications = []; var _pushToken; var _receivedPushTokenCallback; var _receivedNotificationCallback; var _registerForRemoteNotificationsRanThisSession = false; var _userNotificationCenterDelegateObserver; var _firebaseRemoteMessageDelegate; var _showNotifications = true; var _showNotificationsWhenInForeground = false; var _autoClearBadge = true; var _resolveWhenDidRegisterForNotifications; var _rejectWhenDidFailToRegisterForNotifications; var NOTIFICATIONS_REGISTRATION_KEY = "Firebase-RegisterForRemoteNotifications"; function initFirebaseMessaging(options) { if (!options) { return; } _showNotifications = options.showNotifications === undefined ? _showNotifications : !!options.showNotifications; _showNotificationsWhenInForeground = options.showNotificationsWhenInForeground === undefined ? _showNotificationsWhenInForeground : !!options.showNotificationsWhenInForeground; _autoClearBadge = options.autoClearBadge === undefined ? _autoClearBadge : !!options.autoClearBadge; if (options.onMessageReceivedCallback !== undefined) { addOnMessageReceivedCallback(options.onMessageReceivedCallback); } if (options.onPushTokenReceivedCallback !== undefined) { addOnPushTokenReceivedCallback(options.onPushTokenReceivedCallback); } } exports.initFirebaseMessaging = initFirebaseMessaging; function addOnMessageReceivedCallback(callback) { return new Promise(function (resolve, reject) { try { applicationSettings.setBoolean(NOTIFICATIONS_REGISTRATION_KEY, true); _receivedNotificationCallback = callback; _registerForRemoteNotifications(resolve, reject); _processPendingNotifications(); resolve(); } catch (ex) { console.log("Error in messaging.addOnMessageReceivedCallback: " + ex); reject(ex); } }); } exports.addOnMessageReceivedCallback = addOnMessageReceivedCallback; function getCurrentPushToken() { return new Promise(function (resolve, reject) { try { if (typeof (FIRMessaging) !== "undefined") { resolve(FIRMessaging.messaging().FCMToken); } else { resolve(_pushToken); } } catch (ex) { console.log("Error in messaging.getCurrentPushToken: " + ex); reject(ex); } }); } exports.getCurrentPushToken = getCurrentPushToken; function registerForPushNotifications(options) { return new Promise(function (resolve, reject) { try { initFirebaseMessaging(options); _registerForRemoteNotificationsRanThisSession = false; _registerForRemoteNotifications(resolve, reject); } catch (ex) { console.log("Error in messaging.registerForPushNotifications: " + ex); reject(ex); } }); } exports.registerForPushNotifications = registerForPushNotifications; function unregisterForPushNotifications() { return new Promise(function (resolve, reject) { try { UIApplication.sharedApplication.unregisterForRemoteNotifications(); resolve(); } catch (ex) { console.log("Error in messaging.unregisterForPushNotifications: " + ex); reject(ex); } }); } exports.unregisterForPushNotifications = unregisterForPushNotifications; function handleRemoteNotification(app, userInfo) { var userInfoJSON = utils_1.firebaseUtils.toJsObject(userInfo); var aps = userInfo.objectForKey("aps"); if (aps !== null) { var alrt = aps.objectForKey("alert"); if (alrt !== null && alrt.objectForKey) { userInfoJSON.title = alrt.objectForKey("title"); userInfoJSON.body = alrt.objectForKey("body"); } } userInfoJSON.foreground = app.applicationState === 0; updateUserInfo(userInfoJSON); _pendingNotifications.push(userInfoJSON); if (_receivedNotificationCallback) { _processPendingNotifications(); } } exports.handleRemoteNotification = handleRemoteNotification; function addOnPushTokenReceivedCallback(callback) { return new Promise(function (resolve, reject) { try { _receivedPushTokenCallback = callback; if (_pushToken) { callback(_pushToken); } applicationSettings.setBoolean(NOTIFICATIONS_REGISTRATION_KEY, true); _registerForRemoteNotifications(); _processPendingNotifications(); resolve(); } catch (ex) { console.log("Error in messaging.addOnPushTokenReceivedCallback: " + ex); reject(ex); } }); } exports.addOnPushTokenReceivedCallback = addOnPushTokenReceivedCallback; function addBackgroundRemoteNotificationHandler(appDelegate) { appDelegate.prototype.applicationDidRegisterForRemoteNotificationsWithDeviceToken = function (application, deviceToken) { if (areNotificationsEnabled()) { _resolveWhenDidRegisterForNotifications && _resolveWhenDidRegisterForNotifications(); } else { _rejectWhenDidFailToRegisterForNotifications && _rejectWhenDidFailToRegisterForNotifications(); } if (typeof (FIRMessaging) !== "undefined") { FIRMessaging.messaging().APNSToken = deviceToken; } else { var token = deviceToken.debugDescription.replace(/[< >]/g, ""); _pushToken = token; if (_receivedPushTokenCallback) { _receivedPushTokenCallback(token); } } }; appDelegate.prototype.applicationDidFailToRegisterForRemoteNotificationsWithError = function (application, error) { if (error.localizedDescription.indexOf("not supported in the simulator") > -1) { _resolveWhenDidRegisterForNotifications && _resolveWhenDidRegisterForNotifications(); } else { _rejectWhenDidFailToRegisterForNotifications && _rejectWhenDidFailToRegisterForNotifications(error.localizedDescription); } }; appDelegate.prototype.applicationDidReceiveRemoteNotificationFetchCompletionHandler = function (app, notification, completionHandler) { if (typeof (FIRAuth) !== "undefined") { if (firebase_common_1.firebase._configured && FIRAuth.auth().canHandleNotification(notification)) { completionHandler(1); return; } } completionHandler(0); handleRemoteNotification(app, notification); }; } exports.addBackgroundRemoteNotificationHandler = addBackgroundRemoteNotificationHandler; function registerForInteractivePush(model) { var nativeActions = []; model.iosSettings.interactiveSettings.actions.forEach((function (action) { var notificationActionOptions = action.options ? action.options.valueOf() : UNNotificationActionOptionNone; var actionType = action.type || "button"; var nativeAction; if (actionType === "input") { nativeAction = UNTextInputNotificationAction.actionWithIdentifierTitleOptionsTextInputButtonTitleTextInputPlaceholder(action.identifier, action.title, notificationActionOptions, action.submitLabel || "Submit", action.placeholder); } else if (actionType === "button") { nativeAction = UNNotificationAction.actionWithIdentifierTitleOptions(action.identifier, action.title, notificationActionOptions); } else { console.log("Unsupported action type: " + action.type); } nativeActions.push(nativeAction); })); var actions = NSArray.arrayWithArray(nativeActions); var nativeCategories = []; model.iosSettings.interactiveSettings.categories.forEach(function (category) { var nativeCategory = UNNotificationCategory.categoryWithIdentifierActionsIntentIdentifiersOptions(category.identifier, actions, null, null); nativeCategories.push(nativeCategory); }); var nsSetCategories = new NSSet(nativeCategories); UNUserNotificationCenter.currentNotificationCenter().setNotificationCategories(nsSetCategories); if (model.onNotificationActionTakenCallback) { _addOnNotificationActionTakenCallback(model.onNotificationActionTakenCallback); } } exports.registerForInteractivePush = registerForInteractivePush; function prepAppDelegate() { _addObserver("com.firebase.iid.notif.refresh-token", function (notification) { return exports.onTokenRefreshNotification(notification.object); }); _addObserver(UIApplicationDidFinishLaunchingNotification, function (appNotification) { if (applicationSettings.getBoolean(NOTIFICATIONS_REGISTRATION_KEY, false)) { _registerForRemoteNotifications(); } }); _addObserver(UIApplicationDidBecomeActiveNotification, function (appNotification) { _processPendingNotifications(); }); } exports.prepAppDelegate = prepAppDelegate; function subscribeToTopic(topicName) { return new Promise(function (resolve, reject) { try { if (typeof (FIRMessaging) === "undefined") { reject("Enable FIRMessaging in Podfile first"); return; } FIRMessaging.messaging().subscribeToTopicCompletion(topicName, function (error) { error ? reject(error.localizedDescription) : resolve(); }); } catch (ex) { console.log("Error in messaging.subscribeToTopic: " + ex); reject(ex); } }); } exports.subscribeToTopic = subscribeToTopic; function unsubscribeFromTopic(topicName) { return new Promise(function (resolve, reject) { try { if (typeof (FIRMessaging) === "undefined") { reject("Enable FIRMessaging in Podfile first"); return; } FIRMessaging.messaging().unsubscribeFromTopicCompletion(topicName, function (error) { error ? reject(error.localizedDescription) : resolve(); }); } catch (ex) { console.log("Error in messaging.unsubscribeFromTopic: " + ex); reject(ex); } }); } exports.unsubscribeFromTopic = unsubscribeFromTopic; exports.onTokenRefreshNotification = function (token) { _pushToken = token; if (_receivedPushTokenCallback) { _receivedPushTokenCallback(token); } }; var IosInteractivePushSettings = (function () { function IosInteractivePushSettings() { } return IosInteractivePushSettings; }()); exports.IosInteractivePushSettings = IosInteractivePushSettings; var IosInteractiveNotificationActionOptions; (function (IosInteractiveNotificationActionOptions) { IosInteractiveNotificationActionOptions[IosInteractiveNotificationActionOptions["authenticationRequired"] = 1] = "authenticationRequired"; IosInteractiveNotificationActionOptions[IosInteractiveNotificationActionOptions["destructive"] = 2] = "destructive"; IosInteractiveNotificationActionOptions[IosInteractiveNotificationActionOptions["foreground"] = 4] = "foreground"; })(IosInteractiveNotificationActionOptions = exports.IosInteractiveNotificationActionOptions || (exports.IosInteractiveNotificationActionOptions = {})); var IosPushSettings = (function () { function IosPushSettings() { } return IosPushSettings; }()); exports.IosPushSettings = IosPushSettings; var PushNotificationModel = (function () { function PushNotificationModel() { } return PushNotificationModel; }()); exports.PushNotificationModel = PushNotificationModel; var NotificationActionResponse = (function () { function NotificationActionResponse() { } return NotificationActionResponse; }()); exports.NotificationActionResponse = NotificationActionResponse; function areNotificationsEnabled() { return UIApplication.sharedApplication.currentUserNotificationSettings.types > 0; } exports.areNotificationsEnabled = areNotificationsEnabled; var updateUserInfo = function (userInfoJSON) { if (userInfoJSON.aps && userInfoJSON.aps.alert) { userInfoJSON.title = userInfoJSON.aps.alert.title; userInfoJSON.body = userInfoJSON.aps.alert.body; } if (!userInfoJSON.hasOwnProperty("data")) { userInfoJSON.data = {}; } Object.keys(userInfoJSON).forEach(function (key) { if (key !== "data") userInfoJSON.data[key] = userInfoJSON[key]; }); userInfoJSON.aps = undefined; }; function _registerForRemoteNotifications(resolve, reject) { var app = UIApplication.sharedApplication; if (!app) { application.on("launch", function () { return _registerForRemoteNotifications(resolve, reject); }); return; } if (_registerForRemoteNotificationsRanThisSession) { resolve && resolve(); return; } _registerForRemoteNotificationsRanThisSession = true; _resolveWhenDidRegisterForNotifications = resolve; _rejectWhenDidFailToRegisterForNotifications = reject; if (parseInt(platform_1.device.osVersion) >= 10) { var authorizationOptions = 4 | 2 | 1; UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptionsCompletionHandler(authorizationOptions, function (granted, error) { if (!error) { if (app === null) { app = UIApplication.sharedApplication; } if (app !== null) { utils_1.firebaseUtils.invokeOnRunLoop(function () { return app.registerForRemoteNotifications(); }); } } else { console.log("Error requesting push notification auth: " + error); reject && reject(error.localizedDescription); } }); if (_showNotifications) { _userNotificationCenterDelegateObserver = new FirebaseNotificationDelegateObserverImpl(function (unnotification, actionIdentifier, inputText) { var userInfo = unnotification.request.content.userInfo; var userInfoJSON = utils_1.firebaseUtils.toJsObject(userInfo); updateUserInfo(userInfoJSON); if (actionIdentifier) { _pendingActionTakenNotifications.push({ actionIdentifier: actionIdentifier, userInfoJSON: userInfoJSON, inputText: inputText }); if (_notificationActionTakenCallback) { _processPendingActionTakenNotifications(); } userInfoJSON.notificationTapped = actionIdentifier === UNNotificationDefaultActionIdentifier; } else { userInfoJSON.notificationTapped = false; } userInfoJSON.foreground = UIApplication.sharedApplication.applicationState === 0; _pendingNotifications.push(userInfoJSON); if (_receivedNotificationCallback) { _processPendingNotifications(); } }); nativescript_shared_notification_delegate_1.SharedNotificationDelegate.addObserver(_userNotificationCenterDelegateObserver); } if (typeof (FIRMessaging) !== "undefined") { _firebaseRemoteMessageDelegate = FIRMessagingDelegateImpl.new().initWithCallback(function (appDataDictionary) { var userInfoJSON = utils_1.firebaseUtils.toJsObject(appDataDictionary); updateUserInfo(userInfoJSON); _pendingNotifications.push(userInfoJSON); var asJs = utils_1.firebaseUtils.toJsObject(appDataDictionary.objectForKey("notification")); if (asJs) { userInfoJSON.title = asJs.title; userInfoJSON.body = asJs.body; } var app = UIApplication.sharedApplication; if (app.applicationState === 0) { userInfoJSON.foreground = true; if (_receivedNotificationCallback) { _processPendingNotifications(); } } else { userInfoJSON.foreground = false; } }); FIRMessaging.messaging().delegate = _firebaseRemoteMessageDelegate; } } else { var notificationTypes = 4 | 1 | 2 | 1; var notificationSettings = UIUserNotificationSettings.settingsForTypesCategories(notificationTypes, null); utils_1.firebaseUtils.invokeOnRunLoop(function () { app.registerForRemoteNotifications(); }); app.registerUserNotificationSettings(notificationSettings); } } function _addOnNotificationActionTakenCallback(callback) { return new Promise(function (resolve, reject) { try { _notificationActionTakenCallback = callback; _processPendingActionTakenNotifications(); resolve(); } catch (ex) { console.log("Error in messaging._addOnNotificationActionTakenCallback: " + ex); reject(ex); } }); } function _processPendingNotifications() { var app = UIApplication.sharedApplication; if (!app) { application.on("launch", function () { return _processPendingNotifications(); }); return; } if (_receivedNotificationCallback) { for (var p in _pendingNotifications) { _receivedNotificationCallback(_pendingNotifications[p]); } _pendingNotifications = []; if (app.applicationState === 0 && _autoClearBadge) { app.applicationIconBadgeNumber = 0; } } } function _processPendingActionTakenNotifications() { var app = UIApplication.sharedApplication; if (!app) { application.on("launch", function () { return _processPendingNotifications(); }); return; } if (_notificationActionTakenCallback) { for (var p in _pendingActionTakenNotifications) { _notificationActionTakenCallback(_pendingActionTakenNotifications[p].actionIdentifier, _pendingActionTakenNotifications[p].userInfoJSON, _pendingActionTakenNotifications[p].inputText); } _pendingActionTakenNotifications = []; if (app.applicationState === 0 && _autoClearBadge) { app.applicationIconBadgeNumber = 0; } } } function _addObserver(eventName, callback) { return NSNotificationCenter.defaultCenter.addObserverForNameObjectQueueUsingBlock(eventName, null, NSOperationQueue.mainQueue, callback); } var FirebaseNotificationDelegateObserverImpl = (function () { function FirebaseNotificationDelegateObserverImpl(callback) { this.observerUniqueKey = "firebase-messaging"; this.callback = callback; } FirebaseNotificationDelegateObserverImpl.prototype.userNotificationCenterWillPresentNotificationWithCompletionHandler = function (center, notification, completionHandler, next) { var userInfo = notification.request.content.userInfo; var userInfoJSON = utils_1.firebaseUtils.toJsObject(userInfo); if (!(notification.request.trigger instanceof UNPushNotificationTrigger)) { next(); return; } if (_showNotificationsWhenInForeground || userInfoJSON["gcm.notification.showWhenInForeground"] === "true" || userInfoJSON["showWhenInForeground"] === true || (userInfoJSON.aps && userInfoJSON.aps.showWhenInForeground === true)) { completionHandler(4 | 2 | 1); } else { completionHandler(0); } this.callback(notification); }; FirebaseNotificationDelegateObserverImpl.prototype.userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler = function (center, response, completionHandler, next) { if (!(response.notification.request.trigger instanceof UNPushNotificationTrigger)) { next(); return; } if (response && response.actionIdentifier === UNNotificationDismissActionIdentifier) { completionHandler(); return; } this.callback(response.notification, response.actionIdentifier, response.userText); completionHandler(); }; return FirebaseNotificationDelegateObserverImpl; }()); var FIRMessagingDelegateImpl = (function (_super) { __extends(FIRMessagingDelegateImpl, _super); function FIRMessagingDelegateImpl() { return _super !== null && _super.apply(this, arguments) || this; } FIRMessagingDelegateImpl.new = function () { if (FIRMessagingDelegateImpl.ObjCProtocols.length === 0 && typeof (FIRMessagingDelegate) !== "undefined") { FIRMessagingDelegateImpl.ObjCProtocols.push(FIRMessagingDelegate); } return _super.new.call(this); }; FIRMessagingDelegateImpl.prototype.initWithCallback = function (callback) { this.callback = callback; return this; }; FIRMessagingDelegateImpl.prototype.messagingDidReceiveMessage = function (messaging, remoteMessage) { this.callback(remoteMessage.appData); }; FIRMessagingDelegateImpl.prototype.messagingDidReceiveRegistrationToken = function (messaging, fcmToken) { exports.onTokenRefreshNotification(fcmToken); }; FIRMessagingDelegateImpl.ObjCProtocols = []; return FIRMessagingDelegateImpl; }(NSObject));