react-native-onesignal
Version:
React Native OneSignal SDK
1,022 lines (869 loc) • 34.7 kB
text/typescript
import { NativeModules, Platform } from 'react-native';
import EventManager from './events/EventManager';
import {
IN_APP_MESSAGE_CLICKED,
IN_APP_MESSAGE_DID_DISMISS,
IN_APP_MESSAGE_DID_DISPLAY,
IN_APP_MESSAGE_WILL_DISMISS,
IN_APP_MESSAGE_WILL_DISPLAY,
NOTIFICATION_CLICKED,
NOTIFICATION_WILL_DISPLAY,
PERMISSION_CHANGED,
SUBSCRIPTION_CHANGED,
USER_STATE_CHANGED,
} from './events/events';
import {
NotificationEventName,
NotificationEventTypeMap,
NotificationClickEvent,
} from './models/NotificationEvents';
import {
PushSubscriptionState,
OSNotificationPermission,
PushSubscriptionChangedState,
} from './models/Subscription';
import { UserState, UserChangedState } from './models/User';
import NotificationWillDisplayEvent from './events/NotificationWillDisplayEvent';
import { LiveActivitySetupOptions } from './models/LiveActivities';
import {
InAppMessage,
InAppMessageEventTypeMap,
InAppMessageEventName,
InAppMessageClickEvent,
InAppMessageWillDisplayEvent,
InAppMessageDidDisplayEvent,
InAppMessageWillDismissEvent,
InAppMessageDidDismissEvent,
} from './models/InAppMessage';
import { isValidCallback, isNativeModuleLoaded } from './helpers';
const RNOneSignal = NativeModules.OneSignal;
const eventManager = new EventManager(RNOneSignal);
/// An enum that declares different types of log levels you can use with the OneSignal SDK, going from the least verbose (none) to verbose (print all comments).
export enum LogLevel {
None,
Fatal,
Error,
Warn,
Info,
Debug,
Verbose,
}
// Internal wrapper notification permission state that is being updated by the permission change handler.
let notificationPermission = false;
// Internal wrapper push subscription state that is being updated by the subscription change handler.
let pushSub: PushSubscriptionState = {
id: '',
token: '',
optedIn: false,
};
async function _addPermissionObserver() {
OneSignal.Notifications.addEventListener('permissionChange', (granted) => {
notificationPermission = granted;
});
notificationPermission = await RNOneSignal.hasNotificationPermission();
}
async function _addPushSubscriptionObserver() {
OneSignal.User.pushSubscription.addEventListener(
'change',
(subscriptionChange) => {
pushSub = subscriptionChange.current;
},
);
pushSub.id = await RNOneSignal.getPushSubscriptionId();
pushSub.token = await RNOneSignal.getPushSubscriptionToken();
pushSub.optedIn = await RNOneSignal.getOptedIn();
}
export namespace OneSignal {
/** Initializes the OneSignal SDK. This should be called during startup of the application. */
export function initialize(appId: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.initialize(appId);
_addPermissionObserver();
_addPushSubscriptionObserver();
}
/**
* If your integration is user-centric, or you want the ability to identify the user beyond the current device, the
* login method should be called to identify the user.
*/
export function login(externalId: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.login(externalId);
}
/**
* Once (or if) the user is no longer identifiable in your app (i.e. they logged out), the logout method should be
* called.
*/
export function logout() {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.logout();
}
/** For GDPR users, your application should call this method before setting the App ID. */
export function setConsentRequired(required: boolean) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.setPrivacyConsentRequired(required);
}
/**
* If your application is set to require the user's privacy consent, you can provide this consent using this method.
* Indicates whether privacy consent has been granted. This field is only relevant when the application has opted
* into data privacy protections.
*/
export function setConsentGiven(granted: boolean) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.setPrivacyConsentGiven(granted);
}
export namespace Debug {
/**
* Enable logging to help debug if you run into an issue setting up OneSignal.
* @param {LogLevel} nsLogLevel - Sets the logging level to print to the Android LogCat log or Xcode log.
*/
export function setLogLevel(nsLogLevel: LogLevel) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.setLogLevel(nsLogLevel);
}
/**
* Enable logging to help debug if you run into an issue setting up OneSignal.
* @param {LogLevel} visualLogLevel - Sets the logging level to show as alert dialogs.
*/
export function setAlertLevel(visualLogLevel: LogLevel) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.setAlertLevel(visualLogLevel);
}
}
export namespace LiveActivities {
/**
* Indicate this device has exited a live activity, identified within OneSignal by the `activityId`.
*
* Only applies to iOS
*
* @param activityId: The activity identifier the live activity on this device will receive updates for.
* @param token: The activity's update token to receive the updates.
**/
export function enter(
activityId: string,
token: string,
handler?: Function,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (!handler) {
handler = () => {};
}
// Only Available on iOS
if (Platform.OS === 'ios') {
RNOneSignal.enterLiveActivity(activityId, token, handler);
}
}
/**
* Indicate this device has exited a live activity, identified within OneSignal by the `activityId`.
*
* Only applies to iOS
*
* @param activityId: The activity identifier the live activity on this device will no longer receive updates for.
**/
export function exit(activityId: string, handler?: Function) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (!handler) {
handler = () => {};
}
if (Platform.OS === 'ios') {
RNOneSignal.exitLiveActivity(activityId, handler);
}
}
/**
* Indicate this device is capable of receiving pushToStart live activities for the
* `activityType`. The `activityType` **must** be the name of the struct conforming
* to `ActivityAttributes` that will be used to start the live activity.
*
* Only applies to iOS
*
* @param activityType: The name of the specific `ActivityAttributes` structure tied
* to the live activity.
* @param token: The activity type's pushToStart token.
*/
export function setPushToStartToken(activityType: string, token: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'ios') {
RNOneSignal.setPushToStartToken(activityType, token);
}
}
/**
* Indicate this device is no longer capable of receiving pushToStart live activities
* for the `activityType`. The `activityType` **must** be the name of the struct conforming
* to `ActivityAttributes` that will be used to start the live activity.
*
* Only applies to iOS
*
* @param activityType: The name of the specific `ActivityAttributes` structure tied
* to the live activity.
*/
export function removePushToStartToken(activityType: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'ios') {
RNOneSignal.removePushToStartToken(activityType);
}
}
/**
* Enable the OneSignalSDK to setup the default`DefaultLiveActivityAttributes` structure,
* which conforms to the `OneSignalLiveActivityAttributes`. When using this function, the
* widget attributes are owned by the OneSignal SDK, which will allow the SDK to handle the
* entire lifecycle of the live activity. All that is needed from an app-perspective is to
* create a Live Activity widget in a widget extension, with a `ActivityConfiguration` for
* `DefaultLiveActivityAttributes`. This is most useful for users that (1) only have one Live
* Activity widget and (2) are using a cross-platform framework and do not want to create the
* cross-platform <-> iOS native bindings to manage ActivityKit.
*
* Only applies to iOS
*
* @param options: An optional structure to provide for more granular setup options.
*/
export function setupDefault(options?: LiveActivitySetupOptions) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'ios') {
RNOneSignal.setupDefaultLiveActivity(options);
}
}
/**
* Start a new LiveActivity that is modelled by the default`DefaultLiveActivityAttributes`
* structure. The `DefaultLiveActivityAttributes` is initialized with the dynamic `attributes`
* and `content` passed in.
*
* Only applies to iOS
*
* @param activityId: The activity identifier the live activity on this device will be started
* and eligible to receive updates for.
* @param attributes: A dynamic type containing the static attributes passed into `DefaultLiveActivityAttributes`.
* @param content: A dynamic type containing the content attributes passed into `DefaultLiveActivityAttributes`.
*/
export function startDefault(
activityId: string,
attributes: object,
content: object,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'ios') {
RNOneSignal.startDefaultLiveActivity(activityId, attributes, content);
}
}
}
export namespace User {
export namespace pushSubscription {
/** Add a callback that fires when the OneSignal subscription state changes. */
export function addEventListener(
event: 'change',
listener: (event: PushSubscriptionChangedState) => void,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
isValidCallback(listener);
RNOneSignal.addPushSubscriptionObserver();
eventManager.addEventListener<PushSubscriptionChangedState>(
SUBSCRIPTION_CHANGED,
listener,
);
}
/** Clears current subscription observers. */
export function removeEventListener(
event: 'change',
listener: (event: PushSubscriptionChangedState) => void,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
eventManager.removeEventListener(SUBSCRIPTION_CHANGED, listener);
}
/**
* @deprecated This method is deprecated. It has been replaced by {@link getIdAsync}.
*/
export function getPushSubscriptionId(): string {
if (!isNativeModuleLoaded(RNOneSignal)) {
return '';
}
console.warn(
'OneSignal: This method has been deprecated. Use getIdAsync instead for getting push subscription id.',
);
return pushSub.id ? pushSub.id : '';
}
export async function getIdAsync(): Promise<string | null> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(
new Error('OneSignal native module not loaded'),
);
}
return await RNOneSignal.getPushSubscriptionId();
}
/**
* @deprecated This method is deprecated. It has been replaced by {@link getTokenAsync}.
*/
export function getPushSubscriptionToken(): string {
if (!isNativeModuleLoaded(RNOneSignal)) {
return '';
}
console.warn(
'OneSignal: This method has been deprecated. Use getTokenAsync instead for getting push subscription token.',
);
return pushSub.token ? pushSub.token : '';
}
/** The readonly push subscription token */
export async function getTokenAsync(): Promise<string | null> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(
new Error('OneSignal native module not loaded'),
);
}
return await RNOneSignal.getPushSubscriptionToken();
}
/**
* @deprecated This method is deprecated. It has been replaced by {@link getOptedInAsync}.
*/
export function getOptedIn(): boolean {
if (!isNativeModuleLoaded(RNOneSignal)) {
return false;
}
console.warn(
'OneSignal: This method has been deprecated. Use getOptedInAsync instead for getting push subscription opted in status.',
);
return pushSub.optedIn;
}
/**
* Gets a boolean value indicating whether the current user is opted in to push notifications.
* This returns true when the app has notifications permission and optOut is not called.
* Note: Does not take into account the existence of the subscription ID and push token.
* This boolean may return true but push notifications may still not be received by the user.
*/
export async function getOptedInAsync(): Promise<boolean> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(
new Error('OneSignal native module not loaded'),
);
}
return await RNOneSignal.getOptedIn();
}
/** Disable the push notification subscription to OneSignal. */
export function optOut() {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.optOut();
}
/** Enable the push notification subscription to OneSignal. */
export function optIn() {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.optIn();
}
}
/**
* Add a callback that fires when the OneSignal user state changes.
* Important: When using the observer to retrieve the onesignalId, check the externalId as well to confirm the values are associated with the expected user.
*/
export function addEventListener(
event: 'change',
listener: (event: UserChangedState) => void,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
isValidCallback(listener);
RNOneSignal.addUserStateObserver();
eventManager.addEventListener<UserChangedState>(
USER_STATE_CHANGED,
listener,
);
}
/** Clears current user state observers. */
export function removeEventListener(
event: 'change',
listener: (event: UserChangedState) => void,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
eventManager.removeEventListener(USER_STATE_CHANGED, listener);
}
/** Get the nullable OneSignal Id associated with the user. */
export async function getOnesignalId(): Promise<string | null> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.getOnesignalId();
}
/** Get the nullable External Id associated with the user. */
export async function getExternalId(): Promise<string | null> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.getExternalId();
}
/** Explicitly set a 2-character language code for the user. */
export function setLanguage(language: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.setLanguage(language);
}
/** Set an alias for the current user. If this alias label already exists on this user, it will be overwritten with the new alias id. */
export function addAlias(label: string, id: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addAlias(label, id);
}
/** Set aliases for the current user. If any alias already exists, it will be overwritten to the new values. */
export function addAliases(aliases: object) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addAliases(aliases);
}
/** Remove an alias from the current user. */
export function removeAlias(label: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.removeAlias(label);
}
/** Remove aliases from the current user. */
export function removeAliases(labels: string[]) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.removeAliases(labels);
}
/** Add a new email subscription to the current user. */
export function addEmail(email: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addEmail(email);
}
/**
* Remove an email subscription from the current user. Returns false if the specified email does not exist on the user within the SDK,
* and no request will be made.
*/
export function removeEmail(email: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.removeEmail(email);
}
/** Add a new SMS subscription to the current user. */
export function addSms(smsNumber: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addSms(smsNumber);
}
/**
* Remove an SMS subscription from the current user. Returns false if the specified SMS number does not exist on the user within the SDK,
* and no request will be made.
*/
export function removeSms(smsNumber: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.removeSms(smsNumber);
}
/**
* Add a tag for the current user. Tags are key:value pairs used as building blocks for targeting specific users and/or personalizing
* messages. If the tag key already exists, it will be replaced with the value provided here.
*/
export function addTag(key: string, value: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (!key || value === undefined || value === null) {
console.error('OneSignal: addTag: must include a key and a value');
return;
}
// forces values to be string types
if (typeof value !== 'string') {
console.warn(
'OneSignal: addTag: tag value must be of type string; attempting to convert',
);
value = String(value);
}
RNOneSignal.addTag(key, value);
}
/**
* Add multiple tags for the current user. Tags are key:value pairs used as building blocks for targeting
* specific users and/or personalizing messages. If the tag key already exists, it will be replaced with
* the value provided here.
*/
export function addTags(tags: object) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (!tags || Object.keys(tags).length === 0) {
console.error(
'OneSignal: addTags: argument must be of type object of the form { key : "value" }',
);
return;
}
const convertedTags = tags as { [key: string]: any };
Object.keys(tags).forEach(function (key) {
if (typeof convertedTags[key] !== 'string') {
console.warn(
'OneSignal: addTags: tag value for key ' +
key +
' must be of type string; attempting to convert',
);
convertedTags[key] = String(convertedTags[key]);
}
});
RNOneSignal.addTags(tags);
}
/** Remove the data tag with the provided key from the current user. */
export function removeTag(key: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (typeof key !== 'string') {
console.error(
'OneSignal: removeTag: key argument must be of type string',
);
return;
}
RNOneSignal.removeTags([key]);
}
/** Remove multiple tags with the provided keys from the current user. */
export function removeTags(keys: string[]) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (!Array.isArray(keys)) {
console.error('OneSignal: removeTags: argument must be of array type');
return;
}
RNOneSignal.removeTags(keys);
}
/** Returns the local tags for the current user. */
export function getTags(): Promise<{ [key: string]: string }> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.getTags();
}
}
export namespace Notifications {
/**
* @deprecated This method is deprecated. It has been replaced by {@link getPermissionAsync}.
*/
export function hasPermission(): boolean {
console.warn(
'OneSignal: This method has been deprecated. Use getPermissionAsync instead for getting notification permission status.',
);
return notificationPermission;
}
/**
* Whether this app has push notification permission. Returns true if the user has accepted permissions,
* or if the app has ephemeral or provisional permission.
*/
export async function getPermissionAsync(): Promise<boolean> {
return RNOneSignal.hasNotificationPermission();
}
/**
* Prompt the user for permission to receive push notifications. This will display the native system prompt to request push
* notification permission. Use the fallbackToSettings parameter to prompt to open the settings app if a user has already
* declined push permissions.
*/
export function requestPermission(
fallbackToSettings: boolean,
): Promise<boolean> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.requestNotificationPermission(fallbackToSettings);
}
/**
* Whether attempting to request notification permission will show a prompt. Returns true if the device has not been prompted for push
* notification permission already.
*/
export function canRequestPermission(): Promise<boolean> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.canRequestNotificationPermission();
}
/**
* Instead of having to prompt the user for permission to send them push notifications, your app can request provisional authorization.
* For more information: https://documentation.onesignal.com/docs/ios-customizations#provisional-push-notifications
* @param {(response:{accepted:boolean})=>void} handler
*/
export function registerForProvisionalAuthorization(
handler: (response: boolean) => void,
) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'ios') {
isValidCallback(handler);
RNOneSignal.registerForProvisionalAuthorization(handler);
} else {
console.log(
'registerForProvisionalAuthorization: this function is not supported on Android',
);
}
}
/** iOS Only.
* Returns the enum for the native permission of the device. It will be one of:
* OSNotificationPermissionNotDetermined,
* OSNotificationPermissionDenied,
* OSNotificationPermissionAuthorized,
* OSNotificationPermissionProvisional - only available in iOS 12,
* OSNotificationPermissionEphemeral - only available in iOS 14
* */
export function permissionNative(): Promise<OSNotificationPermission> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.permissionNative();
}
/**
* Add listeners for notification click and/or lifecycle events. */
export function addEventListener<K extends NotificationEventName>(
event: K,
listener: (event: NotificationEventTypeMap[K]) => void,
): void {
if (!isNativeModuleLoaded(RNOneSignal)) return;
isValidCallback(listener);
if (event === 'click') {
RNOneSignal.addNotificationClickListener();
eventManager.addEventListener<NotificationClickEvent>(
NOTIFICATION_CLICKED,
listener as (event: NotificationClickEvent) => void,
);
} else if (event === 'foregroundWillDisplay') {
RNOneSignal.addNotificationForegroundLifecycleListener();
eventManager.addEventListener<NotificationWillDisplayEvent>(
NOTIFICATION_WILL_DISPLAY,
listener as (event: NotificationWillDisplayEvent) => void,
);
} else if (event === 'permissionChange') {
isValidCallback(listener);
RNOneSignal.addPermissionObserver();
eventManager.addEventListener<boolean>(
PERMISSION_CHANGED,
listener as (event: boolean) => void,
);
}
}
/**
* Remove listeners for notification click and/or lifecycle events. */
export function removeEventListener<K extends NotificationEventName>(
event: K,
listener: (event: NotificationEventTypeMap[K]) => void,
): void {
if (event === 'click') {
eventManager.removeEventListener(NOTIFICATION_CLICKED, listener);
} else if (event === 'foregroundWillDisplay') {
eventManager.removeEventListener(NOTIFICATION_WILL_DISPLAY, listener);
} else if (event === 'permissionChange') {
eventManager.removeEventListener(PERMISSION_CHANGED, listener);
} else {
return;
}
}
/**
* Removes all OneSignal notifications.
*/
export function clearAll() {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.clearAllNotifications();
}
/**
* Android Only.
* Removes a single OneSignal notification based on its Android notification integer id.
*/
export function removeNotification(id: number) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'android') {
RNOneSignal.removeNotification(id);
} else {
console.log(
'removeNotification: this function is not supported on iOS',
);
}
}
/**
* Android Only.
* Removes all OneSignal notifications based on its Android notification group Id.
* @param {string} id - notification group id to cancel
*/
export function removeGroupedNotifications(id: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
if (Platform.OS === 'android') {
RNOneSignal.removeGroupedNotifications(id);
} else {
console.log(
'removeGroupedNotifications: this function is not supported on iOS',
);
}
}
}
export namespace InAppMessages {
/**
* Add listeners for In-App Message click and/or lifecycle events.
*/
export function addEventListener<K extends InAppMessageEventName>(
event: K,
listener: (event: InAppMessageEventTypeMap[K]) => void,
): void {
if (!isNativeModuleLoaded(RNOneSignal)) {
return;
}
if (event === 'click') {
isValidCallback(listener);
RNOneSignal.addInAppMessageClickListener();
eventManager.addEventListener<InAppMessageClickEvent>(
IN_APP_MESSAGE_CLICKED,
listener as (event: InAppMessageClickEvent) => void,
);
} else {
if (event === 'willDisplay') {
isValidCallback(listener);
eventManager.addEventListener<InAppMessageWillDisplayEvent>(
IN_APP_MESSAGE_WILL_DISPLAY,
listener as (event: InAppMessageWillDisplayEvent) => void,
);
} else if (event === 'didDisplay') {
isValidCallback(listener);
eventManager.addEventListener<InAppMessageDidDisplayEvent>(
IN_APP_MESSAGE_DID_DISPLAY,
listener as (event: InAppMessageDidDisplayEvent) => void,
);
} else if (event === 'willDismiss') {
isValidCallback(listener);
eventManager.addEventListener<InAppMessageWillDismissEvent>(
IN_APP_MESSAGE_WILL_DISMISS,
listener as (event: InAppMessageWillDismissEvent) => void,
);
} else if (event === 'didDismiss') {
isValidCallback(listener);
eventManager.addEventListener<InAppMessageDidDismissEvent>(
IN_APP_MESSAGE_DID_DISMISS,
listener as (event: InAppMessageDidDismissEvent) => void,
);
} else {
return;
}
RNOneSignal.addInAppMessagesLifecycleListener();
}
}
/**
* Remove listeners for In-App Message click and/or lifecycle events.
*/
export function removeEventListener<K extends InAppMessageEventName>(
event: K,
listener: (obj: InAppMessageEventTypeMap[K]) => void,
): void {
if (event === 'click') {
eventManager.removeEventListener(IN_APP_MESSAGE_CLICKED, listener);
} else {
if (event === 'willDisplay') {
eventManager.removeEventListener(
IN_APP_MESSAGE_WILL_DISPLAY,
listener,
);
} else if (event === 'didDisplay') {
eventManager.removeEventListener(
IN_APP_MESSAGE_DID_DISPLAY,
listener,
);
} else if (event === 'willDismiss') {
eventManager.removeEventListener(
IN_APP_MESSAGE_WILL_DISMISS,
listener,
);
} else if (event === 'didDismiss') {
eventManager.removeEventListener(
IN_APP_MESSAGE_DID_DISMISS,
listener,
);
} else {
return;
}
}
}
/**
* Add a trigger for the current user. Triggers are currently explicitly used to determine whether a specific IAM should be
* displayed to the user.
*/
export function addTrigger(key: string, value: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
// value can be assigned to `false` so we cannot just check `!value`
if (!key || value == null) {
console.error('OneSignal: addTrigger: must include a key and a value');
}
let trigger: { [key: string]: string } = {};
trigger[key] = value;
RNOneSignal.addTriggers(trigger);
}
/**
* Add multiple triggers for the current user. Triggers are currently explicitly used to determine whether a specific IAM should
* be displayed to the user.
*/
export function addTriggers(triggers: { [key: string]: string }) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
let keys = Object.keys(triggers);
if (keys.length === 0) {
console.error(
"OneSignal: addTriggers: argument must be an object of the form { key : 'value' }",
);
}
RNOneSignal.addTriggers(triggers);
}
/** Remove the trigger with the provided key from the current user. */
export function removeTrigger(key: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.removeTrigger(key);
}
/** Remove multiple triggers from the current user. */
export function removeTriggers(keys: string[]) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.removeTriggers(keys);
}
/** Clear all triggers from the current user. */
export function clearTriggers() {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.clearTriggers();
}
/**
* Set whether in-app messaging is currently paused.
* When set to true no IAM will be presented to the user regardless of whether they qualify for them.
* When set to 'false` any IAMs the user qualifies for will be presented to the user at the appropriate time.
*/
export function setPaused(pause: boolean) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.paused(pause);
}
/** Whether in-app messaging is currently paused. */
export function getPaused(): Promise<boolean> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.getPaused();
}
}
export namespace Location {
/** Prompts the user for location permissions to allow geotagging from the OneSignal dashboard. */
export function requestPermission() {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.requestLocationPermission();
}
/** Disable or enable location collection (defaults to enabled if your app has location permission). */
export function setShared(shared: boolean) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.setLocationShared(shared);
}
/**
* Checks if location collection is enabled or disabled.
* @param {(value: boolean) => void} handler
*/
export function isShared(): Promise<boolean> {
if (!isNativeModuleLoaded(RNOneSignal)) {
return Promise.reject(new Error('OneSignal native module not loaded'));
}
return RNOneSignal.isLocationShared();
}
}
export namespace Session {
/** Increases the "Count" of this Outcome by 1 and will be counted each time sent. */
export function addOutcome(name: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addOutcome(name);
}
/** Increases "Count" by 1 only once. This can only be attributed to a single notification. */
export function addUniqueOutcome(name: string) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addUniqueOutcome(name);
}
/**
* Increases the "Count" of this Outcome by 1 and the "Sum" by the value. Will be counted each time sent.
* If the method is called outside of an attribution window, it will be unattributed until a new session occurs.
*/
export function addOutcomeWithValue(name: string, value: string | number) {
if (!isNativeModuleLoaded(RNOneSignal)) return;
RNOneSignal.addOutcomeWithValue(name, Number(value));
}
}
}
export {
NotificationWillDisplayEvent,
NotificationClickEvent,
InAppMessage,
InAppMessageClickEvent,
InAppMessageWillDisplayEvent,
InAppMessageDidDisplayEvent,
InAppMessageWillDismissEvent,
InAppMessageDidDismissEvent,
PushSubscriptionState,
PushSubscriptionChangedState,
UserState,
UserChangedState,
OSNotificationPermission,
};
export { default as OSNotification } from './OSNotification';
export { NotificationClickResult } from './models/NotificationEvents';
export { InAppMessageClickResult } from './models/InAppMessage';
;