diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModule.java index 9b0bed33a..29a977068 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"); + + JSONArray testPlacements = new JSONArray(); + int[] testPlacementIds = {808, 1121, 112}; + + try { + 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 + // --------------------------------------------------------------------------------------- // region Private Serialization Functions 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) diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 4db314f20..02b8fd2d9 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": "meow"], + ["placementId": "woof woof"] + ] + + resolver(testPlacements) + } // MARK: - SDK Auth Manager Functions diff --git a/src/embedded/classes/IterableEmbeddedManager.ts b/src/embedded/classes/IterableEmbeddedManager.ts new file mode 100644 index 000000000..e570d7500 --- /dev/null +++ b/src/embedded/classes/IterableEmbeddedManager.ts @@ -0,0 +1,24 @@ +import { NativeModules } from 'react-native'; + +import { Iterable } from '../../core/classes/Iterable'; +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'); + + return RNIterableAPI.getEmbeddedPlacements(); + } +} diff --git a/src/embedded/classes/IterableEmbeddedPlacement.ts b/src/embedded/classes/IterableEmbeddedPlacement.ts new file mode 100644 index 000000000..6a02aabfe --- /dev/null +++ b/src/embedded/classes/IterableEmbeddedPlacement.ts @@ -0,0 +1,11 @@ +/** + * Iterable embedded placement + * Contains placement id and the associated embedded messages + */ +export class IterableEmbeddedPlacement { + readonly placementId: number; + + constructor(placementId: number) { + this.placementId = placementId; + } +} 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/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..8f13478c5 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -25,6 +25,10 @@ export { type IterableDeviceOrientation, } from './core/hooks'; export { type IterableEdgeInsetDetails } from './core/types'; +export { + IterableEmbeddedManager, + IterableEmbeddedPlacement, +} from './embedded/classes'; export { IterableHtmlInAppContent, IterableInAppCloseSource,