From d812d07e8dd642233642ba49d877192ac11efbc6 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 21 May 2025 15:41:34 -0600 Subject: [PATCH 1/9] feat: adds getEmbeddedPlacements to native layers --- .../reactnative/RNIterableAPIModule.java | 30 +++++++++++++++++++ ios/RNIterableAPI/ReactIterableAPI.swift | 18 ++++++++++- .../classes/IterableEmbeddedManager.ts | 10 +++++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index 9b0bed33a..65e75b9f9 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -482,6 +482,36 @@ public void updateVisibleRows(ReadableArray visibleRows) { // --------------------------------------------------------------------------------------- // endregion + // --------------------------------------------------------------------------------------- + // region Embedded APIs + + @ReactMethod + public void getEmbeddedPlacements(Promise promise) { + IterableLogger.d(TAG, "getEmbeddedPlacements"); + + // Create test data + JSONArray testPlacements = new JSONArray(); + try { + // Test placement 1 + JSONObject placement1 = new JSONObject(); + placement1.put("placementId", "test_placement_1"); + testPlacements.put(placement1); + + // Test placement 2 + JSONObject placement2 = new JSONObject(); + placement2.put("placementId", "test_placement_2"); + testPlacements.put(placement2); + + promise.resolve(Serialization.convertJsonToArray(testPlacements)); + } catch (JSONException e) { + + promise.reject("", "Failed to create test placements"); + } + } + + // --------------------------------------------------------------------------------------- + // endregion + // --------------------------------------------------------------------------------------- // region Private Serialization Functions diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 4db314f20..5831fd47e 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -470,6 +470,22 @@ class ReactIterableAPI: RCTEventEmitter { inboxSessionManager.updateVisibleRows(visibleRows: serializedRows) } + + // MARK: - SDK Embedded Manager Functions + + @objc(getEmbeddedPlacements:rejecter:) + func getEmbeddedPlacements(resolver: @escaping RCTPromiseResolveBlock, + rejecter: @escaping RCTPromiseRejectBlock) { + ITBInfo() + + // Create test data + let testPlacements: [[String: Any]] = [ + ["placementId": "test_placement_1"], + ["placementId": "test_placement_2"] + ] + + resolver(testPlacements) + } // MARK: - SDK Auth Manager Functions @@ -481,7 +497,7 @@ class ReactIterableAPI: RCTEventEmitter { authHandlerSemaphore.signal() } - + // MARK: Private private var shouldEmit = false private let _methodQueue = DispatchQueue(label: String(describing: ReactIterableAPI.self)) diff --git a/src/embedded/classes/IterableEmbeddedManager.ts b/src/embedded/classes/IterableEmbeddedManager.ts index 3d1a91686..e570d7500 100644 --- a/src/embedded/classes/IterableEmbeddedManager.ts +++ b/src/embedded/classes/IterableEmbeddedManager.ts @@ -5,7 +5,17 @@ import { IterableEmbeddedPlacement } from './IterableEmbeddedPlacement'; const RNIterableAPI = NativeModules.RNIterableAPI; +/** + * Manages embedded messages for the current user. + * + * This class provides methods to interact with embedded messages, including retrieving placements. + */ export class IterableEmbeddedManager { + /** + * Retrieve the current user's list of embedded placements. + * + * @returns A Promise that resolves to an array of embedded placements. + */ getPlacements(): Promise { Iterable?.logger?.log('EmbeddedManager.getPlacements'); From 8b16063b1f9f94adb5fb6e03330cd48d7ecfd422 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Wed, 21 May 2025 15:51:39 -0600 Subject: [PATCH 2/9] feat: adds getEmbeddedPlacements to RNIterableAPI --- ios/RNIterableAPI/RNIterableAPI.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ios/RNIterableAPI/RNIterableAPI.m b/ios/RNIterableAPI/RNIterableAPI.m index 8850c755a..68c90b76c 100644 --- a/ios/RNIterableAPI/RNIterableAPI.m +++ b/ios/RNIterableAPI/RNIterableAPI.m @@ -133,6 +133,11 @@ @interface RCT_EXTERN_REMAP_MODULE(RNIterableAPI, ReactIterableAPI, NSObject) RCT_EXTERN_METHOD(updateVisibleRows: (nonnull NSArray *) visibleRows) +// MARK: - SDK Embedded Manager Functions + +RCT_EXTERN_METHOD(getEmbeddedPlacements: (RCTPromiseResolveBlock) resolve + rejecter: (RCTPromiseRejectBlock) reject) + // MARK: - SDK Auth Manager Functions RCT_EXTERN_METHOD(passAlongAuthToken: (NSString *) authToken) From 22528f03d2f9b4695b9791774d587bd9473aa986 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Fri, 23 May 2025 09:32:15 -0600 Subject: [PATCH 3/9] feat: adds embedded manager to Iterable class --- .../reactnative/RNIterableAPIModule.java | 10 ++++- ios/RNIterableAPI/ReactIterableAPI.swift | 4 +- package.json | 2 +- src/core/classes/Iterable.ts | 7 ++++ .../classes/IterableEmbeddedPlacement.ts | 4 +- yarn.lock | 37 +++---------------- 6 files changed, 25 insertions(+), 39 deletions(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index 65e75b9f9..198d5a9eb 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -494,13 +494,19 @@ public void getEmbeddedPlacements(Promise promise) { try { // Test placement 1 JSONObject placement1 = new JSONObject(); - placement1.put("placementId", "test_placement_1"); + placement1.put("placementId", 808); testPlacements.put(placement1); // Test placement 2 JSONObject placement2 = new JSONObject(); - placement2.put("placementId", "test_placement_2"); + placement2.put("placementId", 1121); testPlacements.put(placement2); + + // Test placement 2 + JSONObject placement3 = new JSONObject(); + placement3.put("placementId", 112); + testPlacements.put(placement3); + promise.resolve(Serialization.convertJsonToArray(testPlacements)); } catch (JSONException e) { diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 5831fd47e..7c15becdc 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -480,8 +480,8 @@ class ReactIterableAPI: RCTEventEmitter { // Create test data let testPlacements: [[String: Any]] = [ - ["placementId": "test_placement_1"], - ["placementId": "test_placement_2"] + ["placementId": "meow"], + ["placementId": "woof woof"] ] resolver(testPlacements) diff --git a/package.json b/package.json index fb42dc80b..ba800c321 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "prettier": "^3.0.3", "react": "18.3.1", "react-native": "0.75.3", - "react-native-builder-bob": "^0.40.4", + "react-native-builder-bob": "^0.39.0", "react-native-safe-area-context": "^4.11.1", "react-native-vector-icons": "^10.2.0", "react-native-webview": "^13.12.3", diff --git a/src/core/classes/Iterable.ts b/src/core/classes/Iterable.ts index 6a30828aa..cc49293a5 100644 --- a/src/core/classes/Iterable.ts +++ b/src/core/classes/Iterable.ts @@ -22,6 +22,7 @@ import { IterableAuthResponse } from './IterableAuthResponse'; import type { IterableCommerceItem } from './IterableCommerceItem'; import { IterableConfig } from './IterableConfig'; import { IterableLogger } from './IterableLogger'; +import { IterableEmbeddedManager } from '../../embedded/classes/IterableEmbeddedManager'; const RNIterableAPI = NativeModules.RNIterableAPI; const RNEventEmitter = new NativeEventEmitter(RNIterableAPI); @@ -56,6 +57,12 @@ export class Iterable { */ static savedConfig: IterableConfig = new IterableConfig(); + /** + * Instantiates embedded manager + */ + static embeddedManager: IterableEmbeddedManager = + new IterableEmbeddedManager(); + /** * Initializes the Iterable React Native SDK in your app's Javascript or Typescript code. * diff --git a/src/embedded/classes/IterableEmbeddedPlacement.ts b/src/embedded/classes/IterableEmbeddedPlacement.ts index 268380322..6a02aabfe 100644 --- a/src/embedded/classes/IterableEmbeddedPlacement.ts +++ b/src/embedded/classes/IterableEmbeddedPlacement.ts @@ -3,9 +3,9 @@ * Contains placement id and the associated embedded messages */ export class IterableEmbeddedPlacement { - readonly placementId: string; + readonly placementId: number; - constructor(placementId: string) { + constructor(placementId: number) { this.placementId = placementId; } } diff --git a/yarn.lock b/yarn.lock index cf30f91fc..7ddc23acd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,22 +15,6 @@ __metadata: languageName: node linkType: hard -"@ark/schema@npm:0.45.9": - version: 0.45.9 - resolution: "@ark/schema@npm:0.45.9" - dependencies: - "@ark/util": 0.45.9 - checksum: 8d28c910ef6ae379c61a82db2f7e8160d96eb25fb73a56bda5f9c63cc86abca12552d2bb8cd3dd9aff010f5464f9834e33285eca51ea7da16f2143e050cc901a - languageName: node - linkType: hard - -"@ark/util@npm:0.45.9": - version: 0.45.9 - resolution: "@ark/util@npm:0.45.9" - checksum: ddd1fc89c45b61e5d52cb92203990492a5115aea58a8e8bf5ff24e28103fce331593e0c374a086554fb6feb375ddd759c07e751aadc7f3ab3c6138dc3ee362cf - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" @@ -3093,7 +3077,7 @@ __metadata: prettier: ^3.0.3 react: 18.3.1 react-native: 0.75.3 - react-native-builder-bob: ^0.40.4 + react-native-builder-bob: ^0.39.0 react-native-safe-area-context: ^4.11.1 react-native-vector-icons: ^10.2.0 react-native-webview: ^13.12.3 @@ -5148,16 +5132,6 @@ __metadata: languageName: node linkType: hard -"arktype@npm:^2.1.15": - version: 2.1.19 - resolution: "arktype@npm:2.1.19" - dependencies: - "@ark/schema": 0.45.9 - "@ark/util": 0.45.9 - checksum: cf656f9aa3797d56572d49a8499a4156fbbe25eacbd075f4c60770876fd1fbde6b6285f1b367de93e14858651f6a1df1db3de99d6a5f642e1fa61f421fae0712 - languageName: node - linkType: hard - "array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" @@ -12689,9 +12663,9 @@ __metadata: languageName: node linkType: hard -"react-native-builder-bob@npm:^0.40.4": - version: 0.40.4 - resolution: "react-native-builder-bob@npm:0.40.4" +"react-native-builder-bob@npm:^0.39.0": + version: 0.39.1 + resolution: "react-native-builder-bob@npm:0.39.1" dependencies: "@babel/core": ^7.25.2 "@babel/plugin-transform-strict-mode": ^7.24.7 @@ -12699,7 +12673,6 @@ __metadata: "@babel/preset-flow": ^7.24.7 "@babel/preset-react": ^7.24.7 "@babel/preset-typescript": ^7.24.7 - arktype: ^2.1.15 babel-plugin-module-resolver: ^5.0.2 browserslist: ^4.20.4 cross-spawn: ^7.0.3 @@ -12717,7 +12690,7 @@ __metadata: yargs: ^17.5.1 bin: bob: bin/bob - checksum: 2b3576a5b3afb142400427f51197485fd0a8d7611b2ca6edb610fbcf320279c5951846c3ebe00715904e808f91106367e1f95c4e32f29405a07fb517a87927bb + checksum: d17f017beae07455997c63e36ca28fee853c18308939f30f00b471b3beafafb98beb5dce9a5f1634da3c5fbbf2538666048a88bd144b374d3998c8763da064a0 languageName: node linkType: hard From f0b213892bb33ac12fd639d8efdcec5cce98d9ee Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Mon, 2 Jun 2025 09:40:53 -0600 Subject: [PATCH 4/9] feat: refactors getEmbeddedPlacements --- .../reactnative/RNIterableAPIModule.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index 198d5a9eb..bf9ad4cfc 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java @@ -489,32 +489,26 @@ public void updateVisibleRows(ReadableArray visibleRows) { public void getEmbeddedPlacements(Promise promise) { IterableLogger.d(TAG, "getEmbeddedPlacements"); - // Create test data JSONArray testPlacements = new JSONArray(); + int[] testPlacementIds = {808, 1121, 112}; + try { - // Test placement 1 - JSONObject placement1 = new JSONObject(); - placement1.put("placementId", 808); - testPlacements.put(placement1); - - // Test placement 2 - JSONObject placement2 = new JSONObject(); - placement2.put("placementId", 1121); - testPlacements.put(placement2); - - // Test placement 2 - JSONObject placement3 = new JSONObject(); - placement3.put("placementId", 112); - testPlacements.put(placement3); - + for (int placementId : testPlacementIds) { + testPlacements.put(createTestPlacement(placementId)); + } promise.resolve(Serialization.convertJsonToArray(testPlacements)); } catch (JSONException e) { - promise.reject("", "Failed to create test placements"); } } + private JSONObject createTestPlacement(int placementId) throws JSONException { + JSONObject placement = new JSONObject(); + placement.put("placementId", placementId); + return placement; + } + // --------------------------------------------------------------------------------------- // endregion From 265896d2f0e6a1beaa82167ddf81e37cc23aa32d Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Mon, 2 Jun 2025 10:57:19 -0600 Subject: [PATCH 5/9] feat: removes embeddedManager from Iterable --- src/core/classes/Iterable.ts | 7 ----- .../classes/IterableEmbeddedManager.ts | 18 +++++++++-- src/inApp/classes/IterableInAppManager.ts | 30 ++++++++++++++----- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/core/classes/Iterable.ts b/src/core/classes/Iterable.ts index cc49293a5..6a30828aa 100644 --- a/src/core/classes/Iterable.ts +++ b/src/core/classes/Iterable.ts @@ -22,7 +22,6 @@ import { IterableAuthResponse } from './IterableAuthResponse'; import type { IterableCommerceItem } from './IterableCommerceItem'; import { IterableConfig } from './IterableConfig'; import { IterableLogger } from './IterableLogger'; -import { IterableEmbeddedManager } from '../../embedded/classes/IterableEmbeddedManager'; const RNIterableAPI = NativeModules.RNIterableAPI; const RNEventEmitter = new NativeEventEmitter(RNIterableAPI); @@ -57,12 +56,6 @@ export class Iterable { */ static savedConfig: IterableConfig = new IterableConfig(); - /** - * Instantiates embedded manager - */ - static embeddedManager: IterableEmbeddedManager = - new IterableEmbeddedManager(); - /** * Initializes the Iterable React Native SDK in your app's Javascript or Typescript code. * diff --git a/src/embedded/classes/IterableEmbeddedManager.ts b/src/embedded/classes/IterableEmbeddedManager.ts index e570d7500..9e35ef660 100644 --- a/src/embedded/classes/IterableEmbeddedManager.ts +++ b/src/embedded/classes/IterableEmbeddedManager.ts @@ -1,6 +1,6 @@ import { NativeModules } from 'react-native'; -import { Iterable } from '../../core/classes/Iterable'; +import type { IterableLogger } from '../../core/classes/IterableLogger'; import { IterableEmbeddedPlacement } from './IterableEmbeddedPlacement'; const RNIterableAPI = NativeModules.RNIterableAPI; @@ -11,13 +11,27 @@ const RNIterableAPI = NativeModules.RNIterableAPI; * This class provides methods to interact with embedded messages, including retrieving placements. */ export class IterableEmbeddedManager { + private logger?: IterableLogger; + + constructor(logger?: IterableLogger) { + this.logger = logger; + } + + /** + * Sets the logger instance for this manager + * @param logger - The logger instance to use + */ + setLogger(logger: IterableLogger) { + this.logger = logger; + } + /** * Retrieve the current user's list of embedded placements. * * @returns A Promise that resolves to an array of embedded placements. */ getPlacements(): Promise { - Iterable?.logger?.log('EmbeddedManager.getPlacements'); + this.logger?.log('EmbeddedManager.getPlacements'); return RNIterableAPI.getEmbeddedPlacements(); } diff --git a/src/inApp/classes/IterableInAppManager.ts b/src/inApp/classes/IterableInAppManager.ts index 640b99d50..4f76c0336 100644 --- a/src/inApp/classes/IterableInAppManager.ts +++ b/src/inApp/classes/IterableInAppManager.ts @@ -1,6 +1,6 @@ import { NativeModules } from 'react-native'; -import { Iterable } from '../../core/classes/Iterable'; +import type { IterableLogger } from '../../core/classes/IterableLogger'; import type { IterableInAppDeleteSource, IterableInAppLocation, @@ -19,6 +19,20 @@ const RNIterableAPI = NativeModules.RNIterableAPI; * The `inAppManager` property of an `Iterable` instance is set to an instance of this class. */ export class IterableInAppManager { + private logger?: IterableLogger; + + constructor(logger?: IterableLogger) { + this.logger = logger; + } + + /** + * Sets the logger instance for this manager + * @param logger - The logger instance to use + */ + setLogger(logger: IterableLogger) { + this.logger = logger; + } + /** * Retrieve the current user's list of in-app messages stored in the local queue. * @@ -36,7 +50,7 @@ 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(); } @@ -59,7 +73,7 @@ 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(); } @@ -86,7 +100,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); } @@ -114,7 +128,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); } @@ -131,7 +145,7 @@ export class IterableInAppManager { * ``` */ setReadForMessage(message: IterableInAppMessage, read: boolean) { - Iterable?.logger?.log('InAppManager.setRead'); + this.logger?.log('InAppManager.setRead'); RNIterableAPI.setReadForMessage(message.messageId, read); } @@ -151,7 +165,7 @@ export class IterableInAppManager { getHtmlContentForMessage( message: IterableInAppMessage ): Promise { - Iterable?.logger?.log('InAppManager.getHtmlContentForMessage'); + this.logger?.log('InAppManager.getHtmlContentForMessage'); return RNIterableAPI.getHtmlInAppContentForMessage(message.messageId); } @@ -171,7 +185,7 @@ export class IterableInAppManager { * ``` */ setAutoDisplayPaused(paused: boolean) { - Iterable?.logger?.log('InAppManager.setAutoDisplayPaused'); + this.logger?.log('InAppManager.setAutoDisplayPaused'); RNIterableAPI.setAutoDisplayPaused(paused); } From 6450596d981a135dc3ee385b3f63e6ad5d4fddd3 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Mon, 2 Jun 2025 16:52:59 -0600 Subject: [PATCH 6/9] feat: reverts changes to package and managers --- package.json | 4 +- .../classes/IterableEmbeddedManager.ts | 18 +-- src/embedded/classes/index.ts | 2 + src/inApp/classes/IterableInAppManager.ts | 32 ++--- src/itblBuildInfo.ts | 2 +- yarn.lock | 122 ++++++++++++++++-- 6 files changed, 130 insertions(+), 50 deletions(-) create mode 100644 src/embedded/classes/index.ts diff --git a/package.json b/package.json index ba800c321..dcf8548b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iterable/react-native-sdk", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.1-rc.17", "description": "Iterable SDK for React Native.", "source": "./src/index.tsx", "main": "./lib/module/index.js", @@ -88,7 +88,7 @@ "prettier": "^3.0.3", "react": "18.3.1", "react-native": "0.75.3", - "react-native-builder-bob": "^0.39.0", + "react-native-builder-bob": "^0.40.4", "react-native-safe-area-context": "^4.11.1", "react-native-vector-icons": "^10.2.0", "react-native-webview": "^13.12.3", diff --git a/src/embedded/classes/IterableEmbeddedManager.ts b/src/embedded/classes/IterableEmbeddedManager.ts index 9e35ef660..e570d7500 100644 --- a/src/embedded/classes/IterableEmbeddedManager.ts +++ b/src/embedded/classes/IterableEmbeddedManager.ts @@ -1,6 +1,6 @@ import { NativeModules } from 'react-native'; -import type { IterableLogger } from '../../core/classes/IterableLogger'; +import { Iterable } from '../../core/classes/Iterable'; import { IterableEmbeddedPlacement } from './IterableEmbeddedPlacement'; const RNIterableAPI = NativeModules.RNIterableAPI; @@ -11,27 +11,13 @@ const RNIterableAPI = NativeModules.RNIterableAPI; * This class provides methods to interact with embedded messages, including retrieving placements. */ export class IterableEmbeddedManager { - private logger?: IterableLogger; - - constructor(logger?: IterableLogger) { - this.logger = logger; - } - - /** - * Sets the logger instance for this manager - * @param logger - The logger instance to use - */ - setLogger(logger: IterableLogger) { - this.logger = logger; - } - /** * Retrieve the current user's list of embedded placements. * * @returns A Promise that resolves to an array of embedded placements. */ getPlacements(): Promise { - this.logger?.log('EmbeddedManager.getPlacements'); + Iterable?.logger?.log('EmbeddedManager.getPlacements'); return RNIterableAPI.getEmbeddedPlacements(); } diff --git a/src/embedded/classes/index.ts b/src/embedded/classes/index.ts new file mode 100644 index 000000000..9b605f651 --- /dev/null +++ b/src/embedded/classes/index.ts @@ -0,0 +1,2 @@ +export * from './IterableEmbeddedManager'; +export * from './IterableEmbeddedPlacement'; diff --git a/src/inApp/classes/IterableInAppManager.ts b/src/inApp/classes/IterableInAppManager.ts index 4f76c0336..a96782b13 100644 --- a/src/inApp/classes/IterableInAppManager.ts +++ b/src/inApp/classes/IterableInAppManager.ts @@ -1,6 +1,6 @@ import { NativeModules } from 'react-native'; -import type { IterableLogger } from '../../core/classes/IterableLogger'; +import { Iterable } from '../../core/classes/Iterable'; import type { IterableInAppDeleteSource, IterableInAppLocation, @@ -19,20 +19,6 @@ const RNIterableAPI = NativeModules.RNIterableAPI; * The `inAppManager` property of an `Iterable` instance is set to an instance of this class. */ export class IterableInAppManager { - private logger?: IterableLogger; - - constructor(logger?: IterableLogger) { - this.logger = logger; - } - - /** - * Sets the logger instance for this manager - * @param logger - The logger instance to use - */ - setLogger(logger: IterableLogger) { - this.logger = logger; - } - /** * Retrieve the current user's list of in-app messages stored in the local queue. * @@ -50,7 +36,7 @@ export class IterableInAppManager { * @returns A Promise that resolves to an array of in-app messages. */ getMessages(): Promise { - this.logger?.log('InAppManager.getMessages'); + Iterable?.logger?.log('InAppManager.getMessages'); return RNIterableAPI.getInAppMessages(); } @@ -73,7 +59,7 @@ export class IterableInAppManager { * @returns A Promise that resolves to an array of messages marked as `saveToInbox`. */ getInboxMessages(): Promise { - this.logger?.log('InAppManager.getInboxMessages'); + Iterable?.logger?.log('InAppManager.getInboxMessages'); return RNIterableAPI.getInboxMessages(); } @@ -91,7 +77,7 @@ export class IterableInAppManager { * }); * ``` * - * @param message - The message to show (an {@link_IterableInAppMessage} object) + * @param message - The message to show (an {@link IterableInAppMessage} object) * @param consume - Whether or not the message should be consumed from the user's message queue after being shown. This should be defaulted to true. * * @returns A Promise that resolves to the URL of the button or link the user tapped to close the in-app message. @@ -100,7 +86,7 @@ export class IterableInAppManager { message: IterableInAppMessage, consume: boolean ): Promise { - this.logger?.log('InAppManager.show'); + Iterable?.logger?.log('InAppManager.show'); return RNIterableAPI.showMessage(message.messageId, consume); } @@ -128,7 +114,7 @@ export class IterableInAppManager { location: IterableInAppLocation, source: IterableInAppDeleteSource ): void { - this.logger?.log('InAppManager.remove'); + Iterable?.logger?.log('InAppManager.remove'); return RNIterableAPI.removeMessage(message.messageId, location, source); } @@ -145,7 +131,7 @@ export class IterableInAppManager { * ``` */ setReadForMessage(message: IterableInAppMessage, read: boolean) { - this.logger?.log('InAppManager.setRead'); + Iterable?.logger?.log('InAppManager.setRead'); RNIterableAPI.setReadForMessage(message.messageId, read); } @@ -165,7 +151,7 @@ export class IterableInAppManager { getHtmlContentForMessage( message: IterableInAppMessage ): Promise { - this.logger?.log('InAppManager.getHtmlContentForMessage'); + Iterable?.logger?.log('InAppManager.getHtmlContentForMessage'); return RNIterableAPI.getHtmlInAppContentForMessage(message.messageId); } @@ -185,7 +171,7 @@ export class IterableInAppManager { * ``` */ setAutoDisplayPaused(paused: boolean) { - this.logger?.log('InAppManager.setAutoDisplayPaused'); + Iterable?.logger?.log('InAppManager.setAutoDisplayPaused'); RNIterableAPI.setAutoDisplayPaused(paused); } diff --git a/src/itblBuildInfo.ts b/src/itblBuildInfo.ts index a14a1a9c0..e41d3c743 100644 --- a/src/itblBuildInfo.ts +++ b/src/itblBuildInfo.ts @@ -3,5 +3,5 @@ * It contains the version of the package */ export const buildInfo = { - version: '2.0.0-beta.1', + version: '2.0.0-beta.1-rc.17', }; diff --git a/yarn.lock b/yarn.lock index 7ddc23acd..94b937e20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,6 +15,22 @@ __metadata: languageName: node linkType: hard +"@ark/schema@npm:0.46.0": + version: 0.46.0 + resolution: "@ark/schema@npm:0.46.0" + dependencies: + "@ark/util": 0.46.0 + checksum: a4e7bc0e1c23009c7702ada7cfcbb1638af76f9721c43f96432844ec8616da6fc8121057fb87b0b80142558cf5c3e6141f40443cf43dd026ada8fd4acd635565 + languageName: node + linkType: hard + +"@ark/util@npm:0.46.0": + version: 0.46.0 + resolution: "@ark/util@npm:0.46.0" + checksum: 0c0ceeb10aa0806860f7a7922586a05cda2945f7f598b414b4ebf268a6b45b00f9a854d6afd6b59df58c733e90d00b230194dd6a180a3a23d0eb64612be1b0e0 + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" @@ -349,6 +365,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" + checksum: 5d715055301badab62bdb2336075a77f8dc8bd290cad2bc1b37ea3bf1b3efc40594d308082229f239deb4d6b5b80b0a73bce000e595ea74416e0339c11037047 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" @@ -825,6 +848,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-flow@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-flow@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7baca3171ed595d04c865b0ce46fca7f21900686df9d7fcd1017036ce78bb5483e33803de810831e68d39cf478953db69f49ae3f3de2e3207bc4ba49a96b6739 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-assertions@npm:^7.24.7": version: 7.25.6 resolution: "@babel/plugin-syntax-import-assertions@npm:7.25.6" @@ -1411,6 +1445,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-flow-strip-types@npm:^7.26.5": + version: 7.27.1 + resolution: "@babel/plugin-transform-flow-strip-types@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/plugin-syntax-flow": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0885028866fadefef35292d5a27f878d6a12b6f83778f8731481d4503b49c258507882a7de2aafda9b62d5f6350042f1a06355b998d5ed5e85d693bfcb77b939 + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.0.0, @babel/plugin-transform-for-of@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-for-of@npm:7.24.7" @@ -3077,7 +3123,7 @@ __metadata: prettier: ^3.0.3 react: 18.3.1 react-native: 0.75.3 - react-native-builder-bob: ^0.39.0 + react-native-builder-bob: ^0.40.4 react-native-safe-area-context: ^4.11.1 react-native-vector-icons: ^10.2.0 react-native-webview: ^13.12.3 @@ -5132,6 +5178,16 @@ __metadata: languageName: node linkType: hard +"arktype@npm:^2.1.15": + version: 2.1.20 + resolution: "arktype@npm:2.1.20" + dependencies: + "@ark/schema": 0.46.0 + "@ark/util": 0.46.0 + checksum: 5c02dda98606b83b35bbc66934259e3f30c4b4486c32e470e199da533c0af568951502173d7d7a5e64a2e53667eb36d10d772ce46c0bff204fab759430614c9b + languageName: node + linkType: hard + "array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" @@ -5415,6 +5471,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.28.0": + version: 0.28.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.28.1" + dependencies: + hermes-parser: 0.28.1 + checksum: 2cbc921e663463480ead9ccc8bb229a5196032367ba2b5ccb18a44faa3afa84b4dc493297749983b9a837a3d76b0b123664aecc06f9122618c3246f03e076a9d + languageName: node + linkType: hard + "babel-plugin-transform-flow-enums@npm:^0.0.2": version: 0.0.2 resolution: "babel-plugin-transform-flow-enums@npm:0.0.2" @@ -7859,6 +7924,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.8 + checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -8698,6 +8776,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.28.1": + version: 0.28.1 + resolution: "hermes-estree@npm:0.28.1" + checksum: 4f7b4e0491352012a6cb799315a0aae16abdcc894335e901552ee6c64732d0cf06f0913c579036f9f452b7c4ad9bb0b6ab14e510c13bd7e5997385f77633ab00 + languageName: node + linkType: hard + "hermes-parser@npm:0.22.0": version: 0.22.0 resolution: "hermes-parser@npm:0.22.0" @@ -8716,6 +8801,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.28.1": + version: 0.28.1 + resolution: "hermes-parser@npm:0.28.1" + dependencies: + hermes-estree: 0.28.1 + checksum: 0d95280d527e1ad46e8caacd56b24d07e4aec39704de86cf164600f2c4fb00f406dd74a37b2103433ef7ec388a549072da20438e224bd47def21f973c36aab7d + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^3.3.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -11209,7 +11303,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -12663,17 +12757,18 @@ __metadata: languageName: node linkType: hard -"react-native-builder-bob@npm:^0.39.0": - version: 0.39.1 - resolution: "react-native-builder-bob@npm:0.39.1" +"react-native-builder-bob@npm:^0.40.4": + version: 0.40.11 + resolution: "react-native-builder-bob@npm:0.40.11" dependencies: "@babel/core": ^7.25.2 + "@babel/plugin-transform-flow-strip-types": ^7.26.5 "@babel/plugin-transform-strict-mode": ^7.24.7 "@babel/preset-env": ^7.25.2 - "@babel/preset-flow": ^7.24.7 "@babel/preset-react": ^7.24.7 "@babel/preset-typescript": ^7.24.7 - babel-plugin-module-resolver: ^5.0.2 + arktype: ^2.1.15 + babel-plugin-syntax-hermes-parser: ^0.28.0 browserslist: ^4.20.4 cross-spawn: ^7.0.3 dedent: ^0.7.0 @@ -12686,11 +12781,12 @@ __metadata: kleur: ^4.1.4 metro-config: ^0.80.9 prompts: ^2.4.2 + react-native-monorepo-config: ^0.1.8 which: ^2.0.2 yargs: ^17.5.1 bin: bob: bin/bob - checksum: d17f017beae07455997c63e36ca28fee853c18308939f30f00b471b3beafafb98beb5dce9a5f1634da3c5fbbf2538666048a88bd144b374d3998c8763da064a0 + checksum: a165c284bb9a938238c7fee526399b06d831dc6ce01762db466f79f768708536f34f0c01e01f49fae732bc160d6198a5499200fdb254b317ce04b69e1c814fdc languageName: node linkType: hard @@ -12720,6 +12816,16 @@ __metadata: languageName: node linkType: hard +"react-native-monorepo-config@npm:^0.1.8": + version: 0.1.9 + resolution: "react-native-monorepo-config@npm:0.1.9" + dependencies: + escape-string-regexp: ^5.0.0 + fast-glob: ^3.3.3 + checksum: 6356c362c517c49e17d54ee764c3566ba71491fa0d755618ecf2ca548348668e84fe448c24066645983acbc2bd4c0ed47594f9b3ec9dcc0558c0fd9594d2391e + languageName: node + linkType: hard + "react-native-safe-area-context@npm:^4.11.1": version: 4.11.1 resolution: "react-native-safe-area-context@npm:4.11.1" From d34ad144afd1c09f92772b95d95d7f3d7fcdc2b2 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Mon, 2 Jun 2025 16:57:50 -0600 Subject: [PATCH 7/9] feat: revert changes to version number --- package.json | 2 +- src/itblBuildInfo.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dcf8548b7..fb42dc80b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iterable/react-native-sdk", - "version": "2.0.0-beta.1-rc.17", + "version": "2.0.0-beta.1", "description": "Iterable SDK for React Native.", "source": "./src/index.tsx", "main": "./lib/module/index.js", diff --git a/src/itblBuildInfo.ts b/src/itblBuildInfo.ts index e41d3c743..a14a1a9c0 100644 --- a/src/itblBuildInfo.ts +++ b/src/itblBuildInfo.ts @@ -3,5 +3,5 @@ * It contains the version of the package */ export const buildInfo = { - version: '2.0.0-beta.1-rc.17', + version: '2.0.0-beta.1', }; From 1169407e8d7287dc47d5dfdfbe359d31a8345f03 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Mon, 2 Jun 2025 18:29:57 -0600 Subject: [PATCH 8/9] feat: adds index files for exports --- package.json | 2 +- src/embedded/index.ts | 1 + src/index.tsx | 1 + src/itblBuildInfo.ts | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/embedded/index.ts diff --git a/package.json b/package.json index fb42dc80b..6098258ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@iterable/react-native-sdk", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.1-rc.19", "description": "Iterable SDK for React Native.", "source": "./src/index.tsx", "main": "./lib/module/index.js", diff --git a/src/embedded/index.ts b/src/embedded/index.ts new file mode 100644 index 000000000..d7d17c691 --- /dev/null +++ b/src/embedded/index.ts @@ -0,0 +1 @@ +export * from './classes'; diff --git a/src/index.tsx b/src/index.tsx index 885cd74bd..9a6da1347 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -25,6 +25,7 @@ export { type IterableDeviceOrientation, } from './core/hooks'; export { type IterableEdgeInsetDetails } from './core/types'; +export { IterableEmbeddedManager, IterableEmbeddedPlacement } from './embedded'; export { IterableHtmlInAppContent, IterableInAppCloseSource, diff --git a/src/itblBuildInfo.ts b/src/itblBuildInfo.ts index a14a1a9c0..cf948921f 100644 --- a/src/itblBuildInfo.ts +++ b/src/itblBuildInfo.ts @@ -3,5 +3,5 @@ * It contains the version of the package */ export const buildInfo = { - version: '2.0.0-beta.1', + version: '2.0.0-beta.1-rc.19', }; From 2a0951a13ae7d03f771fcb1731f60559aee3e801 Mon Sep 17 00:00:00 2001 From: Evan Greer Date: Tue, 3 Jun 2025 16:08:19 -0600 Subject: [PATCH 9/9] feat: creates IterableEmbeddedMessageMetadata and associated unit tests --- .../IterableEmbeddedMessageMetadata.test.ts | 58 +++++++++++++++++ .../IterableEmbeddedMessageMetadata.ts | 65 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/__tests__/IterableEmbeddedMessageMetadata.test.ts create mode 100644 src/embedded/classes/IterableEmbeddedMessageMetadata.ts diff --git a/src/__tests__/IterableEmbeddedMessageMetadata.test.ts b/src/__tests__/IterableEmbeddedMessageMetadata.test.ts new file mode 100644 index 000000000..f57786a9d --- /dev/null +++ b/src/__tests__/IterableEmbeddedMessageMetadata.test.ts @@ -0,0 +1,58 @@ +import { IterableEmbeddedMessageMetadata } from '../embedded/classes/IterableEmbeddedMessageMetadata'; +import { Iterable } from '../core'; + +describe('IterableEmbeddedMessage', () => { + test('should create an instance of IterableEmbeddedMessageMetadata from a dictionary', () => { + Iterable.logger.log( + 'iterableEmbeddedMessageMetadata_fromDict_valid_dictionary' + ); + + const dict = { + messageId: '123', + placementId: 456, + campaignId: 789, + isProof: false, + }; + + const result = IterableEmbeddedMessageMetadata.fromDict(dict); + + expect(result).toBeInstanceOf(IterableEmbeddedMessageMetadata); + expect(result.messageId).toBe('123'); + expect(result.placementId).toBe(456); + expect(result.campaignId).toBe(789); + expect(result.isProof).toBe(false); + }); + + test('should handle optional fields', () => { + Iterable.logger.log( + 'iterableEmbeddedMessageMetadata_fromDict_optional_fields_omitted' + ); + + const dict = { + messageId: '123', + placementId: 456, + }; + + const result = IterableEmbeddedMessageMetadata.fromDict(dict); + + expect(result).toBeInstanceOf(IterableEmbeddedMessageMetadata); + expect(result.messageId).toBe('123'); + expect(result.placementId).toBe(456); + expect(result.campaignId).toBeUndefined(); + expect(result.isProof).toBe(false); + }); + + test('should throw an error if messageId is not provided', () => { + Iterable.logger.log( + 'iterableEmbeddedMessageMetadata_fromDict_missing_messageId' + ); + + const dict = { + placementId: 456, + }; + + expect(() => { + IterableEmbeddedMessageMetadata.fromDict(dict); + }).toThrow('messageId and placementId are required'); + }); +}); diff --git a/src/embedded/classes/IterableEmbeddedMessageMetadata.ts b/src/embedded/classes/IterableEmbeddedMessageMetadata.ts new file mode 100644 index 000000000..02bc032d0 --- /dev/null +++ b/src/embedded/classes/IterableEmbeddedMessageMetadata.ts @@ -0,0 +1,65 @@ +/** + * Metadata for an embedded message. + */ +export class IterableEmbeddedMessageMetadata { + /** The ID for the embedded message */ + readonly messageId: string; + /** The placement ID for the embedded message */ + readonly placementId: number; + /** The campaign ID for the embedded message */ + readonly campaignId?: number; + /** Whether the embedded message is a proof */ + readonly isProof: boolean; + + /** + * Constructs an instance of IterableEmbeddedMessageMetadata. + * + * @param messageId - The ID for the embedded message. + * @param placementId - The placement ID for the embedded message. + * @param campaignId - The campaign ID for the embedded message. + * @param isProof - Whether the embedded message is a proof. + */ + constructor( + messageId: string, + placementId: number, + campaignId: number | undefined, + isProof: boolean = false + ) { + this.messageId = messageId; + this.placementId = placementId; + this.campaignId = campaignId; + this.isProof = isProof; + } + + /** + * Creates an instance of `IterableEmbeddedMessageMetadata` from a dictionary object. + * + * @param dict - The dictionary objectcontaining the metadata properties. + * This corresponds to the properties in {@link IterableEmbeddedMessageMetadata} + * + * @returns A new instance of `IterableEmbeddedMessageMetadata` with the provided properties. + */ + static fromDict( + dict: Partial + ): IterableEmbeddedMessageMetadata { + if (!dict.messageId || !dict.placementId) { + throw new Error('messageId and placementId are required'); + } + return new IterableEmbeddedMessageMetadata( + dict.messageId, + dict.placementId, + dict.campaignId, + dict.isProof + ); + } +} + +/** + * An interface defining the dictionary object containing the metadata properties for an embedded message. + */ +export interface EmbeddedMessageMetadataDict { + messageId: string; + placementId: number; + campaignId?: number; + isProof?: boolean; +}