diff --git a/src/core/classes/Iterable.ts b/src/core/classes/Iterable.ts index 440f65e25..33b0118a0 100644 --- a/src/core/classes/Iterable.ts +++ b/src/core/classes/Iterable.ts @@ -13,7 +13,7 @@ import { IterableAuthResponseResult } from '../enums/IterableAuthResponseResult' import { IterableEventName } from '../enums/IterableEventName'; // Add this type-only import to avoid circular dependency -import type { IterableInAppManager } from '../../inApp/classes/IterableInAppManager'; +import { IterableInAppManager } from '../../inApp/classes/IterableInAppManager'; import { IterableAction } from './IterableAction'; import { IterableActionContext } from './IterableActionContext'; @@ -23,9 +23,15 @@ import type { IterableCommerceItem } from './IterableCommerceItem'; import { IterableConfig } from './IterableConfig'; import { IterableLogger } from './IterableLogger'; import type { IterableAuthFailure } from '../types/IterableAuthFailure'; +import { IterableAuthManager } from './IterableAuthManager'; const RNEventEmitter = new NativeEventEmitter(RNIterableAPI); +const defaultConfig = new IterableConfig(); +const defaultLogger = new IterableLogger(defaultConfig); +const defaultAuthManager = new IterableAuthManager(defaultLogger); +const defaultInAppManager = new IterableInAppManager(defaultLogger); + /* eslint-disable tsdoc/syntax */ /** * The main class for the Iterable React Native SDK. @@ -49,12 +55,25 @@ export class Iterable { * Logger for the Iterable SDK * Log level is set with {@link IterableLogLevel} */ - static logger: IterableLogger = new IterableLogger(new IterableConfig()); + static logger: IterableLogger = defaultLogger; /** * Current configuration of the Iterable SDK */ - static savedConfig: IterableConfig = new IterableConfig(); + static savedConfig: IterableConfig = defaultConfig; + + /** + * Auth manager for the Iterable SDK + * + * This property is set to an instance of provides access to authentication functionality including + * pausing authentication retries. + * + * @example + * ```typescript + * Iterable.authManager.pauseAuthRetries(true); + * ``` + */ + static authManager: IterableAuthManager = defaultAuthManager; /** * In-app message manager for the current user. @@ -73,21 +92,7 @@ export class Iterable { * Iterable.inAppManager.showMessage(message, true); * ``` */ - static get inAppManager() { - // Lazy initialization to avoid circular dependency - if (!this._inAppManager) { - // Import here to avoid circular dependency at module level - - const { - IterableInAppManager, - // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-require-imports - } = require('../../inApp/classes/IterableInAppManager'); - this._inAppManager = new IterableInAppManager(); - } - return this._inAppManager; - } - - private static _inAppManager: IterableInAppManager | undefined; + static inAppManager: IterableInAppManager = defaultInAppManager; /** * Initializes the Iterable React Native SDK in your app's Javascript or Typescript code. @@ -124,13 +129,7 @@ export class Iterable { apiKey: string, config: IterableConfig = new IterableConfig() ): Promise { - Iterable.savedConfig = config; - - Iterable.logger = new IterableLogger(Iterable.savedConfig); - - Iterable?.logger?.log('initialize: ' + apiKey); - - this.setupEventHandlers(); + this.setupIterable(config); const version = this.getVersionFromPackageJson(); @@ -148,13 +147,8 @@ export class Iterable { config: IterableConfig = new IterableConfig(), apiEndPoint: string ): Promise { - Iterable.savedConfig = config; + this.setupIterable(config); - Iterable.logger = new IterableLogger(Iterable.savedConfig); - - Iterable?.logger?.log('initialize2: ' + apiKey); - - this.setupEventHandlers(); const version = this.getVersionFromPackageJson(); return RNIterableAPI.initialize2WithApiKey( @@ -165,6 +159,18 @@ export class Iterable { ); } + private static setupIterable(config: IterableConfig = new IterableConfig()) { + Iterable.savedConfig = config; + + const logger = new IterableLogger(Iterable.savedConfig); + + Iterable.logger = logger; + Iterable.authManager = new IterableAuthManager(logger); + Iterable.inAppManager = new IterableInAppManager(logger); + + this.setupEventHandlers(); + } + /** * Associate the current user with the passed in email parameter. * diff --git a/src/core/classes/IterableAuthManager.ts b/src/core/classes/IterableAuthManager.ts new file mode 100644 index 000000000..a81549667 --- /dev/null +++ b/src/core/classes/IterableAuthManager.ts @@ -0,0 +1,29 @@ +import RNIterableAPI from '../../api'; +import { IterableConfig } from './IterableConfig'; +import { IterableLogger } from './IterableLogger'; + +export class IterableAuthManager { + /** + * The logger for the Iterable SDK. + */ + private _logger: IterableLogger = new IterableLogger(new IterableConfig()); + + constructor(logger: IterableLogger) { + this._logger = logger; + } + + /** + * Pause the authentication retry mechanism. + * + * @param pauseRetry - Whether to pause the authentication retry mechanism + * + * @example + * ```typescript + * Iterable.pauseAuthRetries(true); + * ``` + */ + pauseAuthRetries(pauseRetry: boolean) { + this._logger?.log('pauseAuthRetries'); + RNIterableAPI.pauseAuthRetries(pauseRetry); + } +} diff --git a/src/inApp/classes/IterableInAppManager.ts b/src/inApp/classes/IterableInAppManager.ts index 2d555727f..29c99deed 100644 --- a/src/inApp/classes/IterableInAppManager.ts +++ b/src/inApp/classes/IterableInAppManager.ts @@ -1,5 +1,6 @@ import { RNIterableAPI } from '../../api'; -import { Iterable } from '../../core/classes/Iterable'; +import { IterableConfig } from '../../core/classes/IterableConfig'; +import { IterableLogger } from '../../core/classes/IterableLogger'; import type { IterableInAppDeleteSource, IterableInAppLocation, @@ -16,6 +17,15 @@ import { IterableInAppMessage } from './IterableInAppMessage'; * The `inAppManager` property of an `Iterable` instance is set to an instance of this class. */ export class IterableInAppManager { + /** + * The logger for the Iterable SDK. + */ + private _logger: IterableLogger = new IterableLogger(new IterableConfig()); + + constructor(logger: IterableLogger) { + this._logger = logger; + } + /** * Retrieve the current user's list of in-app messages stored in the local queue. * @@ -33,9 +43,11 @@ export class IterableInAppManager { * @returns A Promise that resolves to an array of in-app messages. */ getMessages(): Promise { - Iterable?.logger?.log('InAppManager.getMessages'); + this._logger?.log('InAppManager.getMessages'); - return RNIterableAPI.getInAppMessages() as unknown as Promise; + return RNIterableAPI.getInAppMessages() as unknown as Promise< + IterableInAppMessage[] + >; } /** @@ -56,9 +68,11 @@ export class IterableInAppManager { * @returns A Promise that resolves to an array of messages marked as `saveToInbox`. */ getInboxMessages(): Promise { - Iterable?.logger?.log('InAppManager.getInboxMessages'); + this?._logger?.log('InAppManager.getInboxMessages'); - return RNIterableAPI.getInboxMessages() as unknown as Promise; + return RNIterableAPI.getInboxMessages() as unknown as Promise< + IterableInAppMessage[] + >; } /** @@ -83,7 +97,7 @@ export class IterableInAppManager { message: IterableInAppMessage, consume: boolean ): Promise { - Iterable?.logger?.log('InAppManager.show'); + this?._logger?.log('InAppManager.show'); return RNIterableAPI.showMessage(message.messageId, consume); } @@ -111,7 +125,7 @@ export class IterableInAppManager { location: IterableInAppLocation, source: IterableInAppDeleteSource ): void { - Iterable?.logger?.log('InAppManager.remove'); + this?._logger?.log('InAppManager.remove'); return RNIterableAPI.removeMessage(message.messageId, location, source); } @@ -128,7 +142,7 @@ export class IterableInAppManager { * ``` */ setReadForMessage(message: IterableInAppMessage, read: boolean) { - Iterable?.logger?.log('InAppManager.setRead'); + this?._logger?.log('InAppManager.setRead'); RNIterableAPI.setReadForMessage(message.messageId, read); } @@ -148,9 +162,11 @@ export class IterableInAppManager { getHtmlContentForMessage( message: IterableInAppMessage ): Promise { - Iterable?.logger?.log('InAppManager.getHtmlContentForMessage'); + this?._logger?.log('InAppManager.getHtmlContentForMessage'); - return RNIterableAPI.getHtmlInAppContentForMessage(message.messageId) as unknown as Promise; + return RNIterableAPI.getHtmlInAppContentForMessage( + message.messageId + ) as unknown as Promise; } /** @@ -168,7 +184,7 @@ export class IterableInAppManager { * ``` */ setAutoDisplayPaused(paused: boolean) { - Iterable?.logger?.log('InAppManager.setAutoDisplayPaused'); + this?._logger?.log('InAppManager.setAutoDisplayPaused'); RNIterableAPI.setAutoDisplayPaused(paused); }