react-native-notificare-push
Version:
Notificare Push React Native module.
392 lines (364 loc) • 13.7 kB
text/typescript
import {
type EmitterSubscription,
NativeEventEmitter,
NativeModules,
Platform,
} from 'react-native';
import type {
NotificareNotification,
NotificareNotificationAction,
} from 'react-native-notificare';
import type { NotificareSystemNotification } from './models/notificare-system-notification';
import type { NotificareNotificationDeliveryMechanism } from './models/notificare-notification-delivery-mechanism';
import type { NotificareTransport } from './models/notificare-transport';
import type { NotificarePushSubscription } from './models/notificare-push-subscription';
const LINKING_ERROR =
`The package 'react-native-notificare-push' doesn't seem to be linked. Make sure: \n\n` +
Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
'- You rebuilt the app after installing the package\n' +
'- You are not using Expo Go\n';
// @ts-expect-error
const isTurboModuleEnabled = global.__turboModuleProxy != null;
const NotificarePushModule = isTurboModuleEnabled
? require('./NativeNotificarePushModule').default
: NativeModules.NotificarePushModule;
const NativeModule = NotificarePushModule
? NotificarePushModule
: new Proxy(
{},
{
get() {
throw new Error(LINKING_ERROR);
},
}
);
export class NotificarePush {
private static readonly eventEmitter = new NativeEventEmitter(NativeModule);
//
// Methods
//
/**
* Defines the authorization options used when requesting push notification
* permissions.
*
* **Note**: This method is only supported on iOS.
*
* @param {string[]} options - The authorization options to be set.
* @returns {Promise<void>} - A promise that resolves when the authorization
* options have been successfully set.
*/
public static async setAuthorizationOptions(
options: string[]
): Promise<void> {
if (Platform.OS === 'ios') {
await NativeModule.setAuthorizationOptions(options);
}
}
/**
* Defines the notification category options for custom notification actions.
*
* **Note**: This method is only supported on iOS.
*
* @param {string[]} options - The category options to be set.
* @returns {Promise<void>} - A promise that resolves when the category options
* have been successfully set.
*/
public static async setCategoryOptions(options: string[]): Promise<void> {
if (Platform.OS === 'ios') {
await NativeModule.setCategoryOptions(options);
}
}
/**
* Defines the presentation options for displaying notifications while the app
* is in the foreground.
*
* **Note**: This method is only supported on iOS.
*
* @param {string[]} options - The presentation options to be set.
* @returns {Promise<void>} - A promise that resolves when the presentation
* options have been successfully set.
*/
public static async setPresentationOptions(options: string[]): Promise<void> {
if (Platform.OS === 'ios') {
await NativeModule.setPresentationOptions(options);
}
}
/**
* Indicates whether remote notifications are enabled.
*
* @returns {Promise<boolean>} - A promise that resolves to `true` if remote
* notifications are enabled for the application, and `false` otherwise.
*/
public static async hasRemoteNotificationsEnabled(): Promise<boolean> {
return await NativeModule.hasRemoteNotificationsEnabled();
}
/**
* Provides the current push transport information.
*
* @returns {Promise<NotificareTransport | null>} - A promise that resolves to
* the {@link NotificareTransport} assigned to the device, or `null` if no transport
* has been set.
*/
public static async getTransport(): Promise<NotificareTransport | null> {
return await NativeModule.getTransport();
}
/**
* Provides the current push subscription.
*
* @returns {Promise<NotificarePushSubscription | null>} - A promise that
* resolves to the device's current {@link NotificarePushSubscription}, or
* `null` if no {@link NotificarePushSubscription} is available.
*/
public static async getSubscription(): Promise<NotificarePushSubscription | null> {
return await NativeModule.getSubscription();
}
/**
* Indicates whether the device is capable of receiving remote notifications.
*
* This function returns `true` if the user has granted permission to receive
* push notifications and the device has successfully obtained a push token
* from the notification service. It reflects whether the app can present
* notifications as allowed by the system and user settings.
*
* @return {Promise<boolean>} - A promise that resolves to `true` if the device
* can receive remote notifications, `false` otherwise.
*/
public static async allowedUI(): Promise<boolean> {
return await NativeModule.allowedUI();
}
/**
* Enables remote notifications.
*
* This function enables remote notifications for the application,
* allowing push notifications to be received.
*
* **Note**: Starting with Android 13 (API level 33), this function requires
* the developer to explicitly request the `POST_NOTIFICATIONS` permission from
* the user.
*
* @returns {Promise<void>} - A promise that resolves when remote notifications
* have been successfully enabled.
*/
public static async enableRemoteNotifications(): Promise<void> {
await NativeModule.enableRemoteNotifications();
}
/**
* Disables remote notifications.
*
* This function disables remote notifications for the application, preventing
* push notifications from being received.
*
* @returns {Promise<void>} - A promise that resolves when remote notifications
* have been successfully disabled.
*/
public static async disableRemoteNotifications(): Promise<void> {
await NativeModule.disableRemoteNotifications();
}
//
// Events
//
/**
* Called when a push notification is received.
*
* @param callback - A callback that will be invoked with the result of the
* onNotificationInfoReceived event. It will provide the
* {@link NotificareNotification} received and the
* {@link NotificareNotificationDeliveryMechanism} used for its delivery.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onNotificationInfoReceived event.
*/
public static onNotificationInfoReceived(
callback: (data: {
notification: NotificareNotification;
deliveryMechanism: NotificareNotificationDeliveryMechanism;
}) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.notification_info_received',
callback
);
}
/**
* Called when a custom system notification is received.
*
* @param callback - A callback that will be invoked with the result of the
* onSystemNotificationReceived event. It will provide the
* {@link NotificareSystemNotification} received.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onSystemNotificationReceived event.
*/
public static onSystemNotificationReceived(
callback: (notification: NotificareSystemNotification) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.system_notification_received',
callback
);
}
/**
* Called when an unknown notification is received.
*
* @param callback - A callback that will be invoked with the result of the
* onUnknownNotificationReceived event. It will provide the unknown
* notification received.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onUnknownNotificationReceived event.
*/
public static onUnknownNotificationReceived(
callback: (notification: Record<string, any>) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.unknown_notification_received',
callback
);
}
/**
* Called when a push notification is opened by the user.
*
* @param callback - A callback that will be invoked with the result of the
* onNotificationOpened event. It will provide the
* {@link NotificareNotification} that was opened.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onNotificationOpened event.
*/
public static onNotificationOpened(
callback: (notification: NotificareNotification) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.notification_opened',
callback
);
}
/**
* Called when an unknown push notification is opened by the user.
*
* @param callback - A callback that will be invoked with the result of the
* onUnknownNotificationOpened event. It will provide the unknown notification
* that was opened.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onUnknownNotificationOpened event.
*/
public static onUnknownNotificationOpened(
callback: (notification: Record<string, any>) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.unknown_notification_opened',
callback
);
}
/**
* Called when a push notification action is opened by the user.
*
* @param callback - A callback that will be invoked with the result of the
* onNotificationActionOpened event. It will provide the
* {@link NotificareNotificationAction} opened by the user and the
* {@link NotificareNotification} containing it.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onNotificationActionOpened event.
*/
public static onNotificationActionOpened(
callback: (data: {
notification: NotificareNotification;
action: NotificareNotificationAction;
}) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.notification_action_opened',
callback
);
}
/**
* Called when an unknown push notification action is opened by the user.
*
* @param callback - A callback that will be invoked with the result of the
* onUnknownNotificationActionOpened event. It will provide the
* action opened by the user and the unknown notification containing it. It
* will also provide a response text, if it exists.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onUnknownNotificationActionOpened event.
*/
public static onUnknownNotificationActionOpened(
callback: (data: {
notification: Record<string, any>;
action: string;
responseText: string | null;
}) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.unknown_notification_action_opened',
callback
);
}
/**
* Called when the notification settings are changed.
*
* @param callback - A callback that will be invoked with the result of the
* onNotificationSettingsChanged event. It will provide a boolean indicating
* whether the app is permitted to display notifications. `true` if
* notifications are allowed, `false` if they are restricted by the user.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onNotificationSettingsChanged event.
*/
public static onNotificationSettingsChanged(
callback: (granted: boolean) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.notification_settings_changed',
callback
);
}
/**
* Called when the device's push subscription changes.
*
* @param callback - A callback that will be invoked with the result of the
* onSubscriptionChanged event. It will provide the updated
* {@link NotificarePushSubscription}, or `null` if the subscription token is
* unavailable.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onSubscriptionChanged event.
*/
public static onSubscriptionChanged(
callback: (subscription?: NotificarePushSubscription | null) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.subscription_changed',
callback
);
}
/**
* Called when a notification prompts the app to open its settings screen.
*
* @param callback - A callback that will be invoked with the result of the
* onShouldOpenNotificationSettings event. It will provide the
* {@link NotificareNotification} that prompted the app to open its settings
* screen.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onShouldOpenNotificationSettings event.
*/
public static onShouldOpenNotificationSettings(
callback: (notification: NotificareNotification | null) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.should_open_notification_settings',
callback
);
}
/**
* Called when the app encounters an error during the registration process for
* push notifications.
*
* @param callback - A callback that will be invoked with the result of the
* onFailedToRegisterForRemoteNotifications event. IT will provide the error
* that caused the registration to fail.
* @returns {EmitterSubscription} - The {@link EmitterSubscription} for the
* onFailedToRegisterForRemoteNotifications event.
*/
public static onFailedToRegisterForRemoteNotifications(
callback: (error: string) => void
): EmitterSubscription {
return this.eventEmitter.addListener(
're.notifica.push.failed_to_register_for_remote_notifications',
callback
);
}
}