From 7f043c8590bf3358291fd2ecbb872bd2094526eb Mon Sep 17 00:00:00 2001 From: Loren Posen Date: Sun, 11 Jan 2026 16:02:02 -0800 Subject: [PATCH 1/3] refactor: remove getEmbeddedPlacementIds method and related references --- .../reactnative/RNIterableAPIModuleImpl.java | 17 ----------------- .../newarch/java/com/RNIterableAPIModule.java | 5 ----- .../oldarch/java/com/RNIterableAPIModule.java | 5 ----- example/src/components/Embedded/Embedded.tsx | 17 +---------------- src/__mocks__/MockRNIterableAPI.ts | 4 ---- src/api/NativeRNIterableAPI.ts | 1 - src/core/classes/IterableApi.ts | 8 -------- .../classes/IterableEmbeddedManager.test.ts | 15 --------------- src/embedded/classes/IterableEmbeddedManager.ts | 16 ---------------- 9 files changed, 1 insertion(+), 87 deletions(-) diff --git a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java index 16447ac65..731af26a9 100644 --- a/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java +++ b/android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java @@ -719,23 +719,6 @@ public void pauseEmbeddedImpression(String messageId) { IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().pauseImpression(messageId); } - public void getEmbeddedPlacementIds(Promise promise) { - IterableLogger.d(TAG, "getEmbeddedPlacementIds"); - try { - List placementIds = IterableApi.getInstance().getEmbeddedManager().getPlacementIds(); - WritableArray writableArray = Arguments.createArray(); - if (placementIds != null) { - for (Long placementId : placementIds) { - writableArray.pushDouble(placementId.doubleValue()); - } - } - promise.resolve(writableArray); - } catch (Exception e) { - IterableLogger.e(TAG, "Error getting placement IDs: " + e.getLocalizedMessage()); - promise.reject("", "Failed to get placement IDs: " + e.getLocalizedMessage()); - } - } - public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) { IterableLogger.d(TAG, "getEmbeddedMessages for placements: " + placementIds); diff --git a/android/src/newarch/java/com/RNIterableAPIModule.java b/android/src/newarch/java/com/RNIterableAPIModule.java index 056a5649d..9abe0d070 100644 --- a/android/src/newarch/java/com/RNIterableAPIModule.java +++ b/android/src/newarch/java/com/RNIterableAPIModule.java @@ -249,11 +249,6 @@ public void pauseEmbeddedImpression(String messageId) { moduleImpl.pauseEmbeddedImpression(messageId); } - @Override - public void getEmbeddedPlacementIds(Promise promise) { - moduleImpl.getEmbeddedPlacementIds(promise); - } - @Override public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) { moduleImpl.getEmbeddedMessages(placementIds, promise); diff --git a/android/src/oldarch/java/com/RNIterableAPIModule.java b/android/src/oldarch/java/com/RNIterableAPIModule.java index f387ed681..ce0a6280c 100644 --- a/android/src/oldarch/java/com/RNIterableAPIModule.java +++ b/android/src/oldarch/java/com/RNIterableAPIModule.java @@ -253,11 +253,6 @@ public void pauseEmbeddedImpression(String messageId) { moduleImpl.pauseEmbeddedImpression(messageId); } - @ReactMethod - public void getEmbeddedPlacementIds(Promise promise) { - moduleImpl.getEmbeddedPlacementIds(promise); - } - @ReactMethod public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) { moduleImpl.getEmbeddedMessages(placementIds, promise); diff --git a/example/src/components/Embedded/Embedded.tsx b/example/src/components/Embedded/Embedded.tsx index 9c67cb913..e6f007ba4 100644 --- a/example/src/components/Embedded/Embedded.tsx +++ b/example/src/components/Embedded/Embedded.tsx @@ -10,7 +10,6 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import styles from './Embedded.styles'; export const Embedded = () => { - const [placementIds, setPlacementIds] = useState([]); const [embeddedMessages, setEmbeddedMessages] = useState< IterableEmbeddedMessage[] >([]); @@ -19,14 +18,6 @@ export const Embedded = () => { Iterable.embeddedManager.syncMessages(); }, []); - const getPlacementIds = useCallback(() => { - return Iterable.embeddedManager.getPlacementIds().then((ids: unknown) => { - console.log(ids); - setPlacementIds(ids as number[]); - return ids; - }); - }, []); - const startEmbeddedSession = useCallback(() => { console.log( 'startEmbeddedSession --> check android/ios logs to check if it worked' @@ -91,22 +82,16 @@ export const Embedded = () => { Is embedded manager enabled?{' '} {Iterable.embeddedManager.isEnabled ? 'Yes' : 'No'} - - Placement ids: [{placementIds.join(', ')}] - Sync messages - - Get placement ids - Start session End session - getEmbeddedMessages(placementIds)}> + getEmbeddedMessages()}> Get messages diff --git a/src/__mocks__/MockRNIterableAPI.ts b/src/__mocks__/MockRNIterableAPI.ts index b79eebce9..708ab56ad 100644 --- a/src/__mocks__/MockRNIterableAPI.ts +++ b/src/__mocks__/MockRNIterableAPI.ts @@ -145,10 +145,6 @@ export class MockRNIterableAPI { static endEmbeddedSession = jest.fn(); - static getEmbeddedPlacementIds = jest - .fn() - .mockResolvedValue([1, 2, 3] as number[]); - static syncEmbeddedMessages = jest.fn().mockResolvedValue(undefined); static getEmbeddedMessages = jest.fn().mockResolvedValue([ diff --git a/src/api/NativeRNIterableAPI.ts b/src/api/NativeRNIterableAPI.ts index ed1590528..a804922ae 100644 --- a/src/api/NativeRNIterableAPI.ts +++ b/src/api/NativeRNIterableAPI.ts @@ -151,7 +151,6 @@ export interface Spec extends TurboModule { endEmbeddedSession(): void; startEmbeddedImpression(messageId: string, placementId: number): void; pauseEmbeddedImpression(messageId: string): void; - getEmbeddedPlacementIds(): Promise; getEmbeddedMessages( placementIds: number[] | null ): Promise; diff --git a/src/core/classes/IterableApi.ts b/src/core/classes/IterableApi.ts index 09d0dc44f..88820c9f3 100644 --- a/src/core/classes/IterableApi.ts +++ b/src/core/classes/IterableApi.ts @@ -551,14 +551,6 @@ export class IterableApi { return RNIterableAPI.pauseEmbeddedImpression(messageId); } - /** - * Get the embedded placement IDs. - */ - static getEmbeddedPlacementIds() { - IterableLogger.log('getEmbeddedPlacementIds'); - return RNIterableAPI.getEmbeddedPlacementIds(); - } - /** * Get the embedded messages. * diff --git a/src/embedded/classes/IterableEmbeddedManager.test.ts b/src/embedded/classes/IterableEmbeddedManager.test.ts index a00a2e448..a6c655654 100644 --- a/src/embedded/classes/IterableEmbeddedManager.test.ts +++ b/src/embedded/classes/IterableEmbeddedManager.test.ts @@ -109,21 +109,6 @@ describe('IterableEmbeddedManager', () => { }); }); - describe('getPlacementIds', () => { - it('should call IterableApi.getEmbeddedPlacementIds', async () => { - // WHEN getPlacementIds is called - const result = await embeddedManager.getPlacementIds(); - - // THEN IterableApi.getEmbeddedPlacementIds is called - expect(MockRNIterableAPI.getEmbeddedPlacementIds).toHaveBeenCalledTimes( - 1 - ); - - // AND the result is returned - expect(result).toEqual([1, 2, 3]); - }); - }); - describe('getMessages', () => { it('should call IterableApi.getEmbeddedMessages with placement IDs', async () => { // GIVEN placement IDs diff --git a/src/embedded/classes/IterableEmbeddedManager.ts b/src/embedded/classes/IterableEmbeddedManager.ts index 277fcf819..8d53af49c 100644 --- a/src/embedded/classes/IterableEmbeddedManager.ts +++ b/src/embedded/classes/IterableEmbeddedManager.ts @@ -80,22 +80,6 @@ export class IterableEmbeddedManager { return IterableApi.syncEmbeddedMessages(); } - /** - * Retrieves a list of placement IDs for the embedded manager. - * - * [Placement Documentation](https://support.iterable.com/hc/en-us/articles/23060529977364-Embedded-Messaging-Overview#placements-and-prioritization) - * - * @example - * ```typescript - * Iterable.embeddedManager.getPlacementIds().then(placementIds => { - * console.log('Placement IDs:', placementIds); - * }); - * ``` - */ - getPlacementIds() { - return IterableApi.getEmbeddedPlacementIds(); - } - /** * Retrieves a list of embedded messages the user is eligible to see. * From 153a7ec2b5ccde81b10e89a4745c2863bfd2ecd2 Mon Sep 17 00:00:00 2001 From: Loren Posen Date: Sun, 11 Jan 2026 16:43:56 -0800 Subject: [PATCH 2/3] feat: add input field for placement IDs in Embedded component and update message retrieval logic --- .../components/Embedded/Embedded.styles.ts | 34 +++++++- example/src/components/Embedded/Embedded.tsx | 77 +++++++++++++++---- example/src/hooks/useIterableApp.tsx | 2 - 3 files changed, 94 insertions(+), 19 deletions(-) diff --git a/example/src/components/Embedded/Embedded.styles.ts b/example/src/components/Embedded/Embedded.styles.ts index 56241c676..66deb7b69 100644 --- a/example/src/components/Embedded/Embedded.styles.ts +++ b/example/src/components/Embedded/Embedded.styles.ts @@ -1,10 +1,18 @@ import { StyleSheet } from 'react-native'; -import { button, buttonText, container, hr, link } from '../../constants'; +import { button, buttonText, container, hr, link, input, title, subtitle } from '../../constants'; +import { neutrals, utilityColors, backgroundColors } from '../../constants/styles/colors'; const styles = StyleSheet.create({ button, + buttonDisabled: { + backgroundColor: neutrals.grey25, + opacity: 0.6, + }, buttonText, - container: { ...container, paddingHorizontal: 0 }, + buttonTextDisabled: { + color: neutrals.grey50, + }, + container, embeddedSection: { display: 'flex', flexDirection: 'column', @@ -21,11 +29,33 @@ const styles = StyleSheet.create({ flexDirection: 'row', }, hr, + inputContainer: { + marginVertical: 10, + }, link, + subtitle: { ...subtitle, textAlign: 'center' }, text: { textAlign: 'center' }, + textInput: input, + title: { ...title, textAlign: 'center' }, utilitySection: { paddingHorizontal: 16, }, + warningContainer: { + backgroundColor: backgroundColors.backgroundWarningSubtle, + borderLeftColor: utilityColors.warning100, + borderLeftWidth: 4, + borderRadius: 5, + marginBottom: 12, + marginHorizontal: 16, + marginTop: 0, + padding: 12, + }, + warningText: { + color: utilityColors.warning100, + fontSize: 14, + fontWeight: '600', + textAlign: 'center', + }, }); export default styles; diff --git a/example/src/components/Embedded/Embedded.tsx b/example/src/components/Embedded/Embedded.tsx index e6f007ba4..3356b9512 100644 --- a/example/src/components/Embedded/Embedded.tsx +++ b/example/src/components/Embedded/Embedded.tsx @@ -1,4 +1,4 @@ -import { ScrollView, Text, TouchableOpacity, View } from 'react-native'; +import { ScrollView, Text, TextInput, TouchableOpacity, View } from 'react-native'; import { useCallback, useState } from 'react'; import { Iterable, @@ -10,10 +10,21 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import styles from './Embedded.styles'; export const Embedded = () => { + const [placementIdsInput, setPlacementIdsInput] = useState(''); const [embeddedMessages, setEmbeddedMessages] = useState< IterableEmbeddedMessage[] >([]); + // Parse placement IDs from input + const parsedPlacementIds = placementIdsInput + .split(',') + .map((id) => id.trim()) + .filter((id) => id !== '') + .map((id) => parseInt(id, 10)) + .filter((id) => !isNaN(id)); + + const idsToFetch = parsedPlacementIds.length > 0 ? parsedPlacementIds : null; + const syncEmbeddedMessages = useCallback(() => { Iterable.embeddedManager.syncMessages(); }, []); @@ -32,12 +43,20 @@ export const Embedded = () => { Iterable.embeddedManager.endSession(); }, []); - const getEmbeddedMessages = useCallback((ids: number[] | null = null) => { - Iterable.embeddedManager.getMessages(ids).then((messages: IterableEmbeddedMessage[]) => { + const getEmbeddedMessages = useCallback(() => { + // Don't fetch if no IDs + if (parsedPlacementIds.length === 0) { + console.log('No placement IDs entered, button should be disabled'); + return; + } + + console.log('Fetching messages for placement IDs:', idsToFetch); + + Iterable.embeddedManager.getMessages(idsToFetch).then((messages: IterableEmbeddedMessage[]) => { setEmbeddedMessages(messages); console.log(messages); }); - }, []); + }, [idsToFetch, parsedPlacementIds.length]); const startEmbeddedImpression = useCallback( (message: IterableEmbeddedMessage) => { @@ -73,15 +92,18 @@ export const Embedded = () => { return ( - EMBEDDED + Embedded + {!Iterable.embeddedManager.isEnabled && ( + + + ⚠️ Embedded messaging is disabled. Please enable it in your Iterable config. + + + )} + + Enter placement IDs to fetch embedded messages + - - Does embedded class exist? {Iterable.embeddedManager ? 'Yes' : 'No'} - - - Is embedded manager enabled?{' '} - {Iterable.embeddedManager.isEnabled ? 'Yes' : 'No'} - Sync messages @@ -91,9 +113,34 @@ export const Embedded = () => { End session - getEmbeddedMessages()}> - Get messages - + + + Placement IDs (comma-separated): + + + + + Get messages for placement ids + + + diff --git a/example/src/hooks/useIterableApp.tsx b/example/src/hooks/useIterableApp.tsx index 678f899b0..fdb156c21 100644 --- a/example/src/hooks/useIterableApp.tsx +++ b/example/src/hooks/useIterableApp.tsx @@ -161,8 +161,6 @@ export const IterableAppProvider: FunctionComponent< retryBackoff: IterableRetryBackoff.linear, }; - config.enableEmbeddedMessaging = true; - config.onJwtError = (authFailure) => { console.log('onJwtError', authFailure); From badcd2d057682e79f9bd4e64e493934ec59a8698 Mon Sep 17 00:00:00 2001 From: Loren Posen Date: Sun, 11 Jan 2026 16:52:33 -0800 Subject: [PATCH 3/3] feat: initialize IterableApi context in MainActivity to support message handling --- .../java/iterable/reactnativesdk/example/MainActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/example/android/app/src/main/java/iterable/reactnativesdk/example/MainActivity.kt b/example/android/app/src/main/java/iterable/reactnativesdk/example/MainActivity.kt index cab4dc8fe..ad3cf31b4 100644 --- a/example/android/app/src/main/java/iterable/reactnativesdk/example/MainActivity.kt +++ b/example/android/app/src/main/java/iterable/reactnativesdk/example/MainActivity.kt @@ -6,6 +6,7 @@ import com.facebook.react.ReactActivity import com.facebook.react.ReactActivityDelegate import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled import com.facebook.react.defaults.DefaultReactActivityDelegate +import com.iterable.iterableapi.IterableApi class MainActivity : ReactActivity() { @@ -27,6 +28,8 @@ class MainActivity : ReactActivity() { * This being in Kotlin **may** cause issues with react-native-screens */ override fun onCreate(savedInstanceState: Bundle?) { + IterableApi.setContext(this) + // Call super.onCreate with null to prevent savedInstanceState restoration issues super.onCreate(null) } -} \ No newline at end of file +}