Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
15e1894
feat: add IterableEmbeddedManager class and update exports for embedd…
lposen Oct 10, 2025
952eebe
Merge branch 'loren/embedded/MOB-12260-create-embedded-tab-in-example…
lposen Oct 11, 2025
2a62913
feat: add embeddedManager property to Iterable class for managing emb…
lposen Oct 11, 2025
789ae83
refactor: remove unused methods and improve documentation in Iterable…
lposen Oct 11, 2025
9940f46
docs: enhance documentation
lposen Oct 11, 2025
e7d4ecb
feat: add embeddedMessagingEnabled property to IterableConfig
lposen Oct 11, 2025
4441759
Merge branch 'loren/embedded/MOB-12260-create-embedded-tab-in-example…
lposen Oct 11, 2025
8201c4d
feat: display embedded manager status in Embedded component
lposen Oct 11, 2025
e13756e
feat: implement setEnabled method for managing embedded manager state
lposen Oct 14, 2025
79926df
Merge branch 'loren/embedded/MOB-12260-create-embedded-tab-in-example…
lposen Nov 19, 2025
5206902
Merge branch 'loren/embedded/MOB-12260-create-embedded-tab-in-example…
lposen Nov 19, 2025
2b4da8a
refactor: wrap components in SafeAreaView for improved layout consist…
lposen Nov 19, 2025
11f8227
feat: refactor IterableEmbeddedManager to use private variable
lposen Nov 19, 2025
935cf22
test: enhance Iterable configuration tests with additional assertions
lposen Nov 19, 2025
047f94b
fix: update embeddedMessagingEnabled configuration to use nullish coa…
lposen Nov 19, 2025
92c8c9e
test: add unit tests for IterableEmbeddedManager and enhance Iterable…
lposen Nov 19, 2025
d365761
Merge branch 'loren/embedded/MOB-12260-create-embedded-tab-in-example…
lposen Dec 11, 2025
b3ce46c
Merge branch 'loren/embedded/master' into loren/embedded/MOB-12261-ad…
lposen Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions example/src/components/Embedded/Embedded.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import { Text, View } from 'react-native';
import { Iterable } from '@iterable/react-native-sdk';

import styles from './Embedded.styles';

export const Embedded = () => {
return (
<View style={styles.container}>
<Text style={styles.text}>EMBEDDED</Text>
<Text style={styles.text}>
Does embedded class exist? {Iterable.embeddedManager ? 'Yes' : 'No'}
</Text>
<Text style={styles.text}>
Is embedded manager enabled?{' '}
{Iterable.embeddedManager.isEnabled ? 'Yes' : 'No'}
</Text>
</View>
);
};
Expand Down
26 changes: 26 additions & 0 deletions src/core/classes/Iterable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,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 RNEventEmitter = new NativeEventEmitter(RNIterableAPI);

Expand Down Expand Up @@ -96,6 +97,27 @@ export class Iterable {
*/
static authManager: IterableAuthManager = new IterableAuthManager();

/**
* Embedded message manager for the current user.
*
* This property provides access to embedded message functionality including
* retrieving messages, displaying messages, removing messages, and more.
*
* **Documentation**
* - [Embedded Messaging Overview](https://support.iterable.com/hc/en-us/articles/23060529977364-Embedded-Messaging-Overview)
* - [Android Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061877893652-Embedded-Messages-with-Iterable-s-Android-SDK)
* - [iOS Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061840746900-Embedded-Messages-with-Iterable-s-iOS-SDK)
*
* @example
* ```typescript
* Iterable.embeddedManager.getMessages().then(messages => {
* console.log('Messages:', messages);
* });
Comment on lines +113 to +115

Copilot AI Nov 19, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The documentation example shows calling getMessages() method, but the IterableEmbeddedManager class does not implement this method. The current implementation only has isEnabled property and setEnabled() method.

Either update the example to reflect the current API:

// Check if embedded manager is enabled
if (Iterable.embeddedManager.isEnabled) {
  console.log('Embedded messaging is enabled');
}

Or remove the example until getMessages() is implemented.

Suggested change
* Iterable.embeddedManager.getMessages().then(messages => {
* console.log('Messages:', messages);
* });
* // Check if embedded manager is enabled
* if (Iterable.embeddedManager.isEnabled) {
* console.log('Embedded messaging is enabled');
* }

Copilot uses AI. Check for mistakes.
* ```
*/
static embeddedManager: IterableEmbeddedManager =
new IterableEmbeddedManager();

/**
* Initializes the Iterable React Native SDK in your app's Javascript or Typescript code.
*
Expand Down Expand Up @@ -172,6 +194,10 @@ export class Iterable {

IterableLogger.setLoggingEnabled(config.logReactNativeSdkCalls ?? true);
IterableLogger.setLogLevel(config.logLevel);

Iterable.embeddedManager.setEnabled(
config.embeddedMessagingEnabled === true

Copilot AI Nov 19, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The explicit === true comparison is redundant since config.embeddedMessagingEnabled is already typed as a boolean and defaults to false. This is inconsistent with the pattern used on line 195 for config.logReactNativeSdkCalls.

Consider simplifying to match the existing pattern:

Iterable.embeddedManager.setEnabled(
  config.embeddedMessagingEnabled ?? false
);

Or if you prefer simpler syntax since the default is already false:

Iterable.embeddedManager.setEnabled(config.embeddedMessagingEnabled);
Suggested change
config.embeddedMessagingEnabled === true
config.embeddedMessagingEnabled ?? false

Copilot uses AI. Check for mistakes.
);
Comment on lines +198 to +200

Copilot AI Nov 19, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new embeddedMessagingEnabled configuration option and embeddedManager integration lack test coverage. Similar configuration options like logReactNativeSdkCalls have comprehensive test coverage in Iterable.test.ts.

Consider adding tests for:

  1. Default value of embeddedMessagingEnabled (should be false)
  2. embeddedMessagingEnabled being included in the toDict() output
  3. embeddedManager.isEnabled being set correctly during Iterable.initialize() based on the config value
  4. embeddedManager being accessible as a static property

Example test structure:

describe('embeddedManager', () => {
  it('should be disabled by default', () => {
    const config = new IterableConfig();
    expect(config.embeddedMessagingEnabled).toBe(false);
    expect(Iterable.embeddedManager.isEnabled).toBe(false);
  });

  it('should enable embeddedManager when config is set', async () => {
    const config = new IterableConfig();
    config.embeddedMessagingEnabled = true;
    await Iterable.initialize('test-key', config);
    expect(Iterable.embeddedManager.isEnabled).toBe(true);
  });
});

Copilot uses AI. Check for mistakes.
}

this.setupEventHandlers();
Expand Down
11 changes: 11 additions & 0 deletions src/core/classes/IterableConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,16 @@ export class IterableConfig {
*/
encryptionEnforced = false;

/**
* Should the SDK enable and use embedded messaging?
*
* **Documentation**
* - [Embedded Messaging Overview](https://support.iterable.com/hc/en-us/articles/23060529977364-Embedded-Messaging-Overview)
* - [Android Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061877893652-Embedded-Messages-with-Iterable-s-Android-SDK)
* - [iOS Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061840746900-Embedded-Messages-with-Iterable-s-iOS-SDK)
*/
embeddedMessagingEnabled = false;

Copilot AI Nov 19, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test that validates default configuration values in Iterable.test.ts does not include verification for the new embeddedMessagingEnabled property. The test should be updated to include:

expect(config.embeddedMessagingEnabled).toBe(false);
expect(configDict.embeddedMessagingEnabled).toBe(false);

This ensures the new configuration option has proper test coverage for its default value and serialization.

Copilot uses AI. Check for mistakes.

/**
* Converts the IterableConfig instance to a dictionary object.
*
Expand Down Expand Up @@ -378,6 +388,7 @@ export class IterableConfig {
pushPlatform: this.pushPlatform,
encryptionEnforced: this.encryptionEnforced,
retryPolicy: this.retryPolicy,
embeddedMessagingEnabled: this.embeddedMessagingEnabled,
};
}
}
26 changes: 26 additions & 0 deletions src/embedded/classes/IterableEmbeddedManager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* Manages embedded messages from Iterable.
*
* Provides embedded message functionality including retrieving messages,
* displaying messages, removing messages, and more.
*
* **Documentation**
* - [Embedded Messaging Overview](https://support.iterable.com/hc/en-us/articles/23060529977364-Embedded-Messaging-Overview)
* - [Android Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061877893652-Embedded-Messages-with-Iterable-s-Android-SDK)
* - [iOS Embedded Messaging](https://support.iterable.com/hc/en-us/articles/23061840746900-Embedded-Messages-with-Iterable-s-iOS-SDK)
*/
export class IterableEmbeddedManager {
/**
* Whether the embedded manager is enabled.
*/
isEnabled = false;

/**
* Sets whether the embedded manager is enabled.
*
* @param enabled - Whether the embedded manager is enabled.
*/
setEnabled(enabled: boolean) {
this.isEnabled = enabled;

Copilot AI Nov 19, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The isEnabled property should be readonly or private to prevent direct mutation from outside the class. Currently, consumers can bypass setEnabled() and directly modify the property (e.g., Iterable.embeddedManager.isEnabled = true), which could lead to inconsistent state management.

Consider making this property readonly and providing a getter method, or making it private with a public getter:

private _isEnabled = false;

get isEnabled(): boolean {
  return this._isEnabled;
}

Then update setEnabled() to use this._isEnabled = enabled;

Suggested change
isEnabled = false;
/**
* Sets whether the embedded manager is enabled.
*
* @param enabled - Whether the embedded manager is enabled.
*/
setEnabled(enabled: boolean) {
this.isEnabled = enabled;
private _isEnabled = false;
/**
* Gets whether the embedded manager is enabled.
*/
get isEnabled(): boolean {
return this._isEnabled;
}
/**
* Sets whether the embedded manager is enabled.
*
* @param enabled - Whether the embedded manager is enabled.
*/
setEnabled(enabled: boolean) {
this._isEnabled = enabled;

Copilot uses AI. Check for mistakes.
}
}
1 change: 1 addition & 0 deletions src/embedded/classes/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './IterableEmbeddedManager';
1 change: 1 addition & 0 deletions src/embedded/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './classes';
1 change: 1 addition & 0 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,4 @@ export {
type IterableInboxProps,
type IterableInboxRowViewModel,
} from './inbox';
export { IterableEmbeddedManager } from './embedded';
Loading