@ua/react-native-airship
Version:
Airship plugin for React Native apps.
1,119 lines (989 loc) • 23.2 kB
text/typescript
export type JsonValue =
| string
| number
| boolean
| null
| JsonObject
| JsonArray;
export type JsonObject = {
[]: JsonValue | undefined;
};
export type JsonArray = JsonValue[];
export interface ChannelCreatedEvent {
/**
* The channel ID.
*/
channelId: string;
}
export interface PushTokenReceivedEvent {
/**
* The push token.
*/
pushToken: string;
}
/**
* Event fired when a push is received.
*/
export interface PushReceivedEvent {
pushPayload: PushPayload;
}
/**
* Event fired whenever any of the Live Activities update, create, or end.
*/
export interface LiveActivitiesUpdatedEvent {
/**
* The Live Activities.
*/
activities: LiveActivity[];
}
/**
* The push payload.
*/
export interface PushPayload {
/**
* The alert.
*/
alert?: string;
/**
* The title.
*/
title?: string;
/**
* The subtitle.
*/
subtitle?: string;
/**
* The notification ID.
*/
notificationId?: string;
/**
* The notification extras.
*/
extras: JsonObject;
}
/**
* Event fired when the user initiates a notification response.
*/
export interface NotificationResponseEvent {
/**
* The push notification.
*/
pushPayload: PushPayload;
/**
* The action button ID, if available.
*/
actionId?: string;
/**
* Indicates whether the response was a foreground action.
* This value is always if the user taps the main notification,
* otherwise it is defined by the notification action button.
*/
isForeground: boolean;
}
/**
* Push notification status.
*/
export interface PushNotificationStatus {
/**
* If user notifications are enabled on [Airship.push].
*/
isUserNotificationsEnabled: boolean;
/**
* If notifications are allowed at the system level for the application.
*/
areNotificationsAllowed: boolean;
/**
* If the push feature is enabled on [Airship.privacyManager].
*/
isPushPrivacyFeatureEnabled: boolean;
/*
* If push registration was able to generate a token.
*/
isPushTokenRegistered: boolean;
/*
* If Airship is able to send and display a push notification.
*/
isOptedIn: boolean;
/*
* Checks for isUserNotificationsEnabled, areNotificationsAllowed, and isPushPrivacyFeatureEnabled. If this flag
* is true but `isOptedIn` is false, that means push token was not able to be registered.
*/
isUserOptedIn: boolean;
/**
* The notification permission status.
*/
notificationPermissionStatus: PermissionStatus;
}
/**
* Enum of permission status.
*/
export enum PermissionStatus {
/**
* Permission is granted.
*/
Granted = 'granted',
/**
* Permission is denied.
*/
Denied = 'denied',
/**
* Permission has not yet been requested.
*/
NotDetermined = 'not_determined',
}
/**
* Fallback when prompting for permission and the permission is
* already denied on iOS or is denied silently on Android.
*/
export enum PromptPermissionFallback {
/**
* Take the user to the system settings to enable the permission.
*/
SystemSettings = 'systemSettings',
}
/**
* Event fired when the notification status changes.
*/
export interface PushNotificationStatusChangedEvent {
/**
* The push notification status.
*/
status: PushNotificationStatus;
}
/**
* Event fired when the Message Center is updated.
*/
export interface MessageCenterUpdatedEvent {
/**
* The unread message count.
*/
messageUnreadCount: number;
/**
* The total message count.
*/
messageCount: number;
}
/**
* Event fired when the Message Center is requested to be displayed.
*/
export interface DisplayMessageCenterEvent {
/**
* The message ID, if available.
*/
messageId?: string;
}
/**
* Event fired when a deep link is opened.
*/
export interface DeepLinkEvent {
/**
* The deep link string.
*/
deepLink: string;
}
/**
* Event fired when a preference center is requested to be displayed.
*/
export interface DisplayPreferenceCenterEvent {
/**
* The preference center Id.
*/
preferenceCenterId: string;
}
export enum EventType {
ChannelCreated = 'com.airship.channel_created',
NotificationResponse = 'com.airship.notification_response',
PushReceived = 'com.airship.push_received',
DeepLink = 'com.airship.deep_link',
MessageCenterUpdated = 'com.airship.message_center_updated',
PushNotificationStatusChangedStatus = 'com.airship.notification_status_changed',
DisplayMessageCenter = 'com.airship.display_message_center',
DisplayPreferenceCenter = 'com.airship.display_preference_center',
PushTokenReceived = 'com.airship.push_token_received',
IOSAuthorizedNotificationSettingsChanged = 'com.airship.authorized_notification_settings_changed',
IOSLiveActivitiesUpdated = 'com.airship.live_activities_updated',
}
export interface EventTypeMap {
[]: ChannelCreatedEvent;
[]: NotificationResponseEvent;
[]: PushReceivedEvent;
[]: DeepLinkEvent;
[]: MessageCenterUpdatedEvent;
[]: PushNotificationStatusChangedEvent;
[]: iOS.AuthorizedNotificationSettingsChangedEvent;
[]: DisplayMessageCenterEvent;
[]: DisplayPreferenceCenterEvent;
[]: PushTokenReceivedEvent;
[]: LiveActivitiesUpdatedEvent;
}
/**
* iOS options
*/
export namespace iOS {
/**
* Enum of notification options. iOS only.
*/
export enum NotificationOption {
/**
* Alerts.
*/
Alert = 'alert',
/**
* Sounds.
*/
Sound = 'sound',
/**
* Badges.
*/
Badge = 'badge',
/**
* Car play.
*/
CarPlay = 'car_play',
/**
* Critical Alert.
*/
CriticalAlert = 'critical_alert',
/**
* Provides app notification settings.
*/
ProvidesAppNotificationSettings = 'provides_app_notification_settings',
/**
* Provisional.
*/
Provisional = 'provisional',
}
/**
* Enum of foreground notification options.
*/
export enum ForegroundPresentationOption {
/**
* Play the sound associated with the notification.
*/
Sound = 'sound',
/**
* Apply the notification's badge value to the app’s icon.
*/
Badge = 'badge',
/**
* Show the notification in Notification Center. On iOS 13 an older,
* this will also show the notification as a banner.
*/
List = 'list',
/**
* Present the notification as a banner. On iOS 13 an older,
* this will also show the notification in the Notification Center.
*/
Banner = 'banner',
}
/**
* Enum of authorized notification options.
*/
export enum AuthorizedNotificationSetting {
/**
* Alerts.
*/
Alert = 'alert',
/**
* Sounds.
*/
Sound = 'sound',
/**
* Badges.
*/
Badge = 'badge',
/**
* CarPlay.
*/
CarPlay = 'car_play',
/**
* Lock screen.
*/
LockScreen = 'lock_screen',
/**
* Notification center.
*/
NotificationCenter = 'notification_center',
/**
* Critical alert.
*/
CriticalAlert = 'critical_alert',
/**
* Announcement.
*/
Announcement = 'announcement',
/**
* Scheduled delivery.
*/
ScheduledDelivery = 'scheduled_delivery',
/**
* Time sensitive.
*/
TimeSensitive = 'time_sensitive',
}
/**
* Enum of authorized status.
*/
export enum AuthorizedNotificationStatus {
/**
* Not determined.
*/
NotDetermined = 'not_determined',
/**
* Denied.
*/
Denied = 'denied',
/**
* Authorized.
*/
Authorized = 'authorized',
/**
* Provisional.
*/
Provisional = 'provisional',
/**
* Ephemeral.
*/
Ephemeral = 'ephemeral',
}
export interface AuthorizedNotificationSettingsChangedEvent {
/**
* Authorized settings.
*/
authorizedSettings: AuthorizedNotificationSetting[];
}
}
/**
* Airship config environment
*/
export interface ConfigEnvironment {
/**
* App key.
*/
appKey: string;
/**
* App secret.
*/
appSecret: string;
/**
* Optional log level.
*/
logLevel?: LogLevel;
/**
* Optional iOS config
*/
ios?: {
/**
* Log privacy level. By default it logs at `private`, not logging anything lower than info to the console
* and redacting logs with string interpolation. `public` will log all configured log levels to the console
* without redacting any of the log lines.
*/
logPrivacyLevel?: 'private' | 'public';
};
/**
* Optional Android config
*/
android?: {
/**
* Log privacy level. By default it logs at `private`, not logging anything lower than info to the console
* and redacting logs with string interpolation. `public` will log all configured log levels to the console
* without redacting any of the log lines.
*/
logPrivacyLevel?: 'private' | 'public';
};
}
/**
* Possible sites.
*/
export type Site = 'us' | 'eu';
/**
* Log levels.
*/
export type LogLevel =
| 'verbose'
| 'debug'
| 'info'
| 'warning'
| 'error'
| 'none';
/**
* Airship config
*/
export interface AirshipConfig {
/**
* Default environment.
*/
default?: ConfigEnvironment;
/**
* Development environment. Overrides default environment if inProduction is false.
*/
development?: ConfigEnvironment;
/**
* Production environment. Overrides default environment if inProduction is true.
*/
production?: ConfigEnvironment;
/**
* Cloud site.
*/
site?: Site;
/**
* Switches the environment from development or production. If the value is not
* set, Airship will determine the value at runtime.
*/
inProduction?: boolean;
/**
* URL allow list.
*/
urlAllowList?: string[];
/**
* URL allow list for open URL scope.
*/
urlAllowListScopeOpenUrl?: string[];
/**
* URL allow list for JS bridge injection.
*/
urlAllowListScopeJavaScriptInterface?: string[];
/**
* Enables delayed channel creation.
* Deprecated. Use the Private Manager to disable all features instead.
*/
isChannelCreationDelayEnabled?: boolean;
/**
* Initial config URL for custom Airship domains. The URL
* should also be added to the urlAllowList.
*/
initialConfigUrl?: string;
/**
* Enabled features. Defaults to all.
*/
enabledFeatures?: Feature[];
/**
* Enables channel capture feature.
* This config is enabled by default.
*/
isChannelCaptureEnabled?: boolean;
/**
* Whether to suppress console error messages about missing allow list entries during takeOff.
* This config is disabled by default.
*/
suppressAllowListError?: boolean;
/**
* Pauses In-App Automation on launch.
*/
autoPauseInAppAutomationOnLaunch?: boolean;
/**
* iOS config.
*/
ios?: {
/**
* itunesId for rate app and app store deep links.
*/
itunesId?: string;
/**
* If set to `true`, the SDK will use the preferred locale. Otherwise it will use the app's locale.
*/
useUserPreferredLocale?: boolean;
/**
* Allows the WebViews to be inspected in Safari.
*/
isWebViewInspectionEnabled?: boolean;
};
/**
* Android config.
*/
android?: {
/**
* App store URI
*/
appStoreUri?: string;
/**
* Fcm app name if using multiple FCM projects.
*/
fcmFirebaseAppName?: string;
/**
* Notification config.
*/
notificationConfig?: Android.NotificationConfig;
/**
* Log privacy level. By default it logs at `private`, not logging anything lower than info to the console
* and redacting logs with string interpolation. `public` will log all configured log levels to the console
* without redacting any of the log lines.
*/
logPrivacyLevel?: 'private' | 'public';
};
}
export namespace Android {
/**
* Android notification config.
*/
export interface NotificationConfig {
/**
* The icon resource name.
*/
icon?: string;
/**
* The large icon resource name.
*/
largeIcon?: string;
/**
* The default android notification channel ID.
*/
defaultChannelId?: string;
/**
* The accent color. Must be a hex value #AARRGGBB.
*/
accentColor?: string;
}
}
/**
* Enum of authorized Features.
*/
export enum Feature {
InAppAutomation = 'in_app_automation',
MessageCenter = 'message_center',
Push = 'push',
Analytics = 'analytics',
TagsAndAttributes = 'tags_and_attributes',
Contacts = 'contacts',
FeatureFlags = 'feature_flags',
Location = 'location', // No longer used. To be removed in version 20.0.0.
Chat = 'chat', // No longer used. To be removed in version 20.0.0.
}
/**
* All available features.
*/
export const FEATURES_ALL = Object.values(Feature).filter(
(feature) => feature !== Feature.Location && feature !== Feature.Chat
);
/**
* Subscription Scope types.
*/
export enum SubscriptionScope {
App = 'app',
Web = 'web',
Sms = 'sms',
Email = 'email',
}
/**
* Custom event
*/
export interface CustomEvent {
/**
* Event name
*/
eventName: string;
/**
* Event value
*/
eventValue?: number;
/**
* Event properties
*/
properties: JsonObject;
/**
* Transaction ID
*/
transactionId?: string;
/**
* Interaction ID
*/
interactionId?: string;
/**
* Interaction type
*/
interactionType?: string;
}
export interface InboxMessage {
/**
* The message ID. Needed to display, mark as read, or delete the message.
*/
id: string;
/**
* The message title.
*/
title: string;
/**
* The message sent date in milliseconds.
*/
sentDate: number;
/**
* Optional - The message expiration date in milliseconds.
*/
expirationDate?: number;
/**
* Optional - The icon url for the message.
*/
listIconUrl?: string;
/**
* The unread / read status of the message.
*/
isRead: boolean;
/**
* String to String map of any message extras.
*/
extras: Record<string, string>;
}
// ---
// See: https://github.com/urbanairship/web-push-sdk/blob/master/src/remote-data/preference-center.ts
// ---
/**
* A preference center definition.
*
* @typedef {object} PreferenceCenter
* @property {string} id the ID of the preference center
* @property {Array<PreferenceCenter.CommonSection>} sections a list of sections
* @property {?CommonDisplay} display display information
*/
export type PreferenceCenter = {
id: string;
sections: Section[];
display?: CommonDisplay;
};
/**
* Preference center display information.
* @typedef {object} CommonDisplay
* @property {string} name
* @property {?string} description
*/
export type CommonDisplay = {
name: string;
description?: string;
};
export type Icon = {
icon: string;
};
export type IconDisplay = CommonDisplay & Partial<Icon>;
export interface ItemBase {
type: unknown;
id: string;
display: CommonDisplay;
conditions?: Condition[];
}
/**
* A channel subscription item.
* @typedef {object} ChannelSubscriptionItem
* @memberof PreferenceCenter
* @property {"channel_subscription"} type
* @property {string} id the item identifier
* @property {?CommonDisplay} display display information
* @property {string} subscription_id the subscription list id
*/
export interface ChannelSubscriptionItem extends ItemBase {
type: 'channel_subscription';
subscription_id: string;
}
export interface ContactSubscriptionGroupItem extends ItemBase {
type: 'contact_subscription_group';
id: string;
subscription_id: string;
components: ContactSubscriptionGroupItemComponent[];
}
export interface ContactSubscriptionGroupItemComponent {
scopes: SubscriptionScope[];
display: Omit<CommonDisplay, 'description'>;
}
export interface ContactSubscriptionItem extends ItemBase {
type: 'contact_subscription';
scopes: SubscriptionScope[];
subscription_id: string;
}
export interface AlertItem extends ItemBase {
type: 'alert';
display: IconDisplay;
button?: Button;
}
export interface ConditionBase {
type: unknown;
}
export interface NotificationOptInCondition extends ConditionBase {
type: 'notification_opt_in';
when_status: 'opt_in' | 'opt_out';
}
export type Condition = NotificationOptInCondition;
// Changed from `unknown` in spec
export type Actions = {
[]: JsonValue;
};
export interface Button {
text: string;
content_description?: string;
actions: Actions;
}
export interface SectionBase {
type: unknown;
id: string;
display?: CommonDisplay;
items: Item[];
}
/**
* @typedef {object} CommonSection
* @memberof PreferenceCenter
* @property {"section"} type
* @property {string} id the section identifier
* @property {?CommonDisplay} display display information
* @property {Array<PreferenceCenter.ChannelSubscriptionItem>} items list of
* section items
*/
export interface CommonSection extends SectionBase {
type: 'section';
}
export interface LabeledSectionBreak extends SectionBase {
type: 'labeled_section_break';
items: never;
}
export type Item =
| ChannelSubscriptionItem
| ContactSubscriptionGroupItem
| ContactSubscriptionItem
| AlertItem;
export type Section = CommonSection | LabeledSectionBreak;
/**
* An interface representing the eligibility status of a flag, and optional
* variables associated with the flag.
*/
export interface FeatureFlag {
/**
* A boolean representing flag eligibility; will be `true` if the current
* contact is eligible for the flag.
*/
readonly isEligible: boolean;
/**
* A variables associated with the flag, if any. Will be `null` if no data
* is associated with the flag, or if the flag does not exist.
*/
readonly variables: unknown | null;
/**
* A boolean representing if the flag exists or not. For ease of use and
* deployment, asking for a flag by any name will return a `FeatureFlag`
* interface, even if the flag was not found to exist. However this property
* may be checked to determine if the flag was actually resolved to a known
* flag name.
*/
readonly exists: boolean;
/**
* Reporting Metadata, the shape of which is private and not to be relied
* upon. When not provided, an interaction cannot be tracked on the flag.
* @ignore
*/
readonly _internal: unknown;
}
/**
* Live Activity info.
*/
export interface LiveActivity {
/**
* The activity ID.
*/
id: string;
/**
* The attribute types.
*/
attributeTypes: string;
/**
* The content.
*/
content: LiveActivityContent;
/**
* The attributes.
*/
attributes: JsonObject;
}
/**
* Live Activity content.
*/
export interface LiveActivityContent {
/**
* The content state.
*/
state: JsonObject;
/**
* Optional ISO 8601 date string that defines when the Live Activity will be stale.
*/
staleDate?: string;
/**
* The relevance score.
*/
relevanceScore: number;
}
/**
* Base Live Activity request.
*/
export interface LiveActivityRequest {
/**
* Attributes types. This should match the Activity type of your Live Activity.
*/
attributesType: string;
}
/**
* Live Activity list request.
*/
export interface LiveActivityListRequest extends LiveActivityRequest {}
/**
* Live Activity start request.
*/
export interface LiveActivityStartRequest extends LiveActivityRequest {
/**
* Dynamic content.
*/
content: LiveActivityContent;
/**
* Fixed attributes.
*/
attributes: JsonObject;
}
/**
* Live Activity update request.
*/
export interface LiveActivityUpdateRequest extends LiveActivityRequest {
/**
* The Live Activity ID to update.
*/
activityId: string;
/**
* Dynamic content.
*/
content: LiveActivityContent;
}
/**
* Live Activity end request.
*/
export interface LiveActivityEndRequest extends LiveActivityRequest {
/**
* The Live Activity ID to update.
*/
activityId: string;
/**
* Dynamic content.
*/
content?: LiveActivityContent;
/**
* Dismissal policy. Defaults to `LiveActivityDismissalPolicyDefault`.
*/
dismissalPolicy?: LiveActivityDismissalPolicy;
}
export type LiveActivityDismissalPolicy =
| LiveActivityDismissalPolicyImmediate
| LiveActivityDismissalPolicyDefault
| LiveActivityDismissalPolicyAfterDate;
/**
* Dismissal policy to immediately dismiss the Live Activity on end.
*/
export interface LiveActivityDismissalPolicyImmediate {
type: 'immediate';
}
/**
* Dismissal policy to dismiss the Live Activity after the expiration.
*/
export interface LiveActivityDismissalPolicyDefault {
type: 'default';
}
/**
* Dismissal policy to dismiss the Live Activity after a given date.
*/
export interface LiveActivityDismissalPolicyAfterDate {
type: 'after';
// ISO 8601 date string.
date: string;
}
/**
* Live Update info.
*/
export interface LiveUpdate {
/**
* The Live Update name.
*/
name: string;
/**
* The Live Update type.
*/
type: string;
/**
* Dynamic content.
*/
content: JsonObject;
/**
* ISO 8601 date string of the last content update.
*/
lastContentUpdateTimestamp: string;
/**
* ISO 8601 date string of the last state update.
*/
lastStateChangeTimestamp: string;
/**
* Optional ISO 8601 date string that defines when to end this Live Update.
*/
dismissTimestamp?: string;
}
/**
* Live Update list request.
*/
export interface LiveUpdateListRequest {
type: string;
}
/**
* Live Update update request.
*/
export interface LiveUpdateUpdateRequest {
/**
* The Live Update name.
*/
name: string;
/**
* Dynamic content.
*/
content: JsonObject;
/**
* Optional ISO 8601 date string, used to filter out of order updates/
*/
timestamp?: string;
/**
* Optional ISO 8601 date string that defines when to end this Live Update.
*/
dismissTimestamp?: string;
}
/**
* Live Update end request.
*/
export interface LiveUpdateEndRequest {
/**
* The Live Update name.
*/
name: string;
/**
* Dynamic content.
*/
content?: JsonObject;
/**
* Optional ISO 8601 date string, used to filter out of order updates/
*/
timestamp?: string;
/**
* Optional ISO 8601 date string that defines when to end this Live Update.
*/
dismissTimestamp?: string;
}
/**
* Live Update start request.
*/
export interface LiveUpdateStartRequest {
/**
* The Live Update name.
*/
name: string;
/**
* The Live Update type.
*/
type: string;
/**
* Dynamic content.
*/
content: JsonObject;
/**
* Optional ISO 8601 date string, used to filter out of order updates/
*/
timestamp?: string;
/**
* Optional ISO 8601 date string that defines when to end this Live Update.
*/
dismissTimestamp?: string;
}