Skip to content

Commit a5558d6

Browse files
committed
Merge branch 'master' into loren/embedded/MOB-12270-new-embedded-view-component
2 parents 8b6f82c + 52c7a7b commit a5558d6

70 files changed

Lines changed: 6299 additions & 641 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,5 @@ module.exports = {
4848
},
4949
},
5050
],
51+
ignorePatterns: ['coverage/**/*', 'lib/**/*', 'docs/**/*'],
5152
};

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,12 @@ ios/generated
8585
android/generated
8686

8787
# Iterable
88+
.env.local
8889
.env
8990
.xcode.env.local
9091
coverage/
9192
docs/
9293

9394
# Local Netlify folder
9495
.netlify
96+
.metals/

CHANGELOG.md

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,47 @@
1-
## 2.1.0-beta.1
1+
## 2.2.0
22

3-
## Fixes
4-
- Add Temporary fix for circular paths, which break expo ([9c09743](https://github.com/Iterable/react-native-sdk/commit/9c09743))
3+
### Updates
4+
- Updated Android SDK version to [3.6.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.6.2)
5+
- Updated iOS SDK version to [6.6.3](https://github.com/Iterable/swift-sdk/releases/tag/6.6.3)
6+
- Added JWT Capabilities:
7+
- Added `Iterable.authhManager`, which manages the authentication flow
8+
- Added `IterableRetryBackoff` and `IterableAuthFailureReason` enums
9+
- Added `onJwtError` and `retryPolicy` for control over JWT flow
10+
- Moved all native calls to `IterableApi.ts`
11+
- Added JWT example to our example app
12+
- Changed `onJWTError` to `onJwtError`
13+
- Changed `IterableRetryBackoff` enum keys to be lowercase for consistency
14+
across application
15+
- [SDK-149] Added logout functionality
516

6-
## 2.1.0-beta.0
17+
### Fixes
18+
- Created a standalone `IterableLogger` to avoid circular dependencies
19+
- [SDK-151] Fixed "cannot read property authtoken of undefined" error
20+
- Fixed Android `retryInterval` not being updated on re-initialization.
721

22+
## 2.1.0
823
### Updates
24+
- SDK is now compatible with both New Architecture and Legacy Architecture. Fix
25+
for #691, #602, #563.
26+
27+
### Fixes
28+
- Dependencies update
929
- Update SDK so that it has full support for [React Native New Architecture](https://reactnative.dev/architecture/landing-page)
30+
- Add Temporary fix for circular paths, which break expo ([9c09743](https://github.com/Iterable/react-native-sdk/commit/9c09743))
1031

1132
### Chores
1233
- Update dependencies for React Navigation and related packages ([95053bb](https://github.com/Iterable/react-native-sdk/commit/95053bb))
1334

35+
## 2.0.4
36+
37+
### Updates
38+
- Added API documentation via Netlify([1087275](https://github.com/Iterable/react-native-sdk/commit/1087275))
39+
- Removed dependency on `react-native-vector-icons`, per issues
40+
[#513](https://github.com/Iterable/react-native-sdk/issues/513),
41+
[#683](https://github.com/Iterable/react-native-sdk/issues/683) and
42+
[#675](https://github.com/Iterable/react-native-sdk/issues/675)
43+
([6ece6e0](https://github.com/Iterable/react-native-sdk/commit/6ece6e0))
44+
- Updated dependencies
1445

1546
## 2.0.3
1647

Iterable-React-Native-SDK.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Pod::Spec.new do |s|
1717
s.private_header_files = "ios/**/*.h"
1818

1919
# Load Iterables iOS SDK as a dependency
20-
s.dependency "Iterable-iOS-SDK", "6.6.1"
20+
s.dependency "Iterable-iOS-SDK", "6.6.3"
2121

2222
# Basic Swift support
2323
s.pod_target_xcconfig = {

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ Iterable's React Native SDK relies on:
4444
_UI Components require additional peer dependencies_
4545
- [React Navigation 6+](https://github.com/react-navigation/react-navigation)
4646
- [React Native Safe Area Context 4+](https://github.com/th3rdwave/react-native-safe-area-context)
47-
- [React Native Vector Icons 10+](https://github.com/oblador/react-native-vector-icons)
4847
- [React Native WebView 13+](https://github.com/react-native-webview/react-native-webview)
4948

5049
- **iOS**
@@ -120,13 +119,13 @@ For quick reference, the following table lists the versions of the [Android SDK]
120119
121120
| RN SDK Version | Android SDK Version | iOS SDK Version |
122121
| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------- |
123-
| [2.1.0-beta.0](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.1.0-beta.0) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
122+
| [2.2.0](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.2.0) | [3.6.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.6.2) | [6.6.3](https://github.com/Iterable/swift-sdk/releases/tag/6.6.3)
123+
| [2.1.0](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.1.0) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
124+
| [2.0.4](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.4) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
124125
| [2.0.3](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.3) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
125126
| [2.0.2](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.2) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
126127
| [2.0.1](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.1) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
127128
| [2.0.0](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.0) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
128-
| [2.0.0-beta.1](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.0-beta.1) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
129-
| [2.0.0-beta](https://www.npmjs.com/package/@iterable/react-native-sdk/v/2.0.0-beta) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
130129
| [1.3.21](https://www.npmjs.com/package/@iterable/react-native-sdk/v/1.3.20) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
131130
| [1.3.20](https://www.npmjs.com/package/@iterable/react-native-sdk/v/1.3.20) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.4](https://github.com/Iterable/swift-sdk/releases/tag/6.5.4)
132131
| [1.3.19](https://www.npmjs.com/package/@iterable/react-native-sdk/v/1.3.19) | [3.5.2](https://github.com/Iterable/iterable-android-sdk/releases/tag/3.5.2) | [6.5.3](https://github.com/Iterable/swift-sdk/releases/tag/6.5.3)

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
105105
dependencies {
106106
implementation "com.facebook.react:react-android"
107107
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
108-
api "com.iterable:iterableapi:3.6.1"
108+
api "com.iterable:iterableapi:3.6.2"
109109
// api project(":iterableapi") // links to local android SDK repo rather than by release
110110
}
111111

android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java

Lines changed: 103 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,11 @@
2626
import com.iterable.iterableapi.IterableApi;
2727
import com.iterable.iterableapi.IterableAttributionInfo;
2828
import com.iterable.iterableapi.IterableAuthHandler;
29+
import com.iterable.iterableapi.IterableAuthManager;
2930
import com.iterable.iterableapi.IterableConfig;
3031
import com.iterable.iterableapi.IterableCustomActionHandler;
31-
// import com.iterable.iterableapi.IterableEmbeddedManager;
3232
import com.iterable.iterableapi.IterableEmbeddedMessage;
33-
// import com.iterable.iterableapi.IterableEmbeddedSession;
34-
// import com.iterable.iterableapi.IterableEmbeddedUpdateHandler;
33+
import com.iterable.iterableapi.IterableEmbeddedUpdateHandler;
3534
import com.iterable.iterableapi.IterableHelper;
3635
import com.iterable.iterableapi.IterableInAppCloseAction;
3736
import com.iterable.iterableapi.IterableInAppHandler;
@@ -54,7 +53,7 @@
5453
import java.util.concurrent.CountDownLatch;
5554
import java.util.concurrent.TimeUnit;
5655

57-
public class RNIterableAPIModuleImpl implements IterableUrlHandler, IterableCustomActionHandler, IterableInAppHandler, IterableAuthHandler, IterableInAppManager.Listener {
56+
public class RNIterableAPIModuleImpl implements IterableUrlHandler, IterableCustomActionHandler, IterableInAppHandler, IterableAuthHandler, IterableInAppManager.Listener, IterableEmbeddedUpdateHandler {
5857
public static final String NAME = "RNIterableAPI";
5958

6059
private static String TAG = "RNIterableAPIModule";
@@ -94,16 +93,49 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S
9493
configBuilder.setAuthHandler(this);
9594
}
9695

97-
if (configReadableMap.hasKey("enableEmbeddedMessaging")) {
98-
configBuilder.setEnableEmbeddedMessaging(configReadableMap.getBoolean("enableEmbeddedMessaging"));
96+
// Check if embedded messaging is enabled before building config
97+
boolean enableEmbeddedMessaging = configReadableMap.hasKey("enableEmbeddedMessaging") && configReadableMap.getBoolean("enableEmbeddedMessaging");
98+
99+
IterableConfig config = configBuilder.build();
100+
IterableApi.initialize(reactContext, apiKey, config);
101+
102+
// Update retry policy on existing authManager if it was already created
103+
// This fixes the issue where retryInterval is not respected after
104+
// re-initialization
105+
// TODO [SDK-197]: Fix the root cause of this issue, instead of this hack
106+
try {
107+
// Use reflection to access package-private fields and methods
108+
java.lang.reflect.Field configRetryPolicyField = config.getClass().getDeclaredField("retryPolicy");
109+
configRetryPolicyField.setAccessible(true);
110+
Object retryPolicy = configRetryPolicyField.get(config);
111+
112+
if (retryPolicy != null) {
113+
java.lang.reflect.Method getAuthManagerMethod = IterableApi.getInstance().getClass().getDeclaredMethod("getAuthManager");
114+
getAuthManagerMethod.setAccessible(true);
115+
IterableAuthManager authManager = (IterableAuthManager) getAuthManagerMethod.invoke(IterableApi.getInstance());
116+
117+
if (authManager != null) {
118+
// Update the retry policy field on the authManager
119+
java.lang.reflect.Field authRetryPolicyField = authManager.getClass().getDeclaredField("authRetryPolicy");
120+
authRetryPolicyField.setAccessible(true);
121+
authRetryPolicyField.set(authManager, retryPolicy);
122+
IterableLogger.d(TAG, "Updated retry policy on existing authManager");
123+
}
124+
}
125+
} catch (Exception e) {
126+
IterableLogger.e(TAG, "Failed to update retry policy: " + e.getMessage());
99127
}
100128

101-
IterableApi.initialize(reactContext, apiKey, configBuilder.build());
102129
IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version);
103130

104131
IterableApi.getInstance().getInAppManager().addListener(this);
105132
IterableApi.getInstance().getEmbeddedManager().syncMessages();
106133

134+
// Add embedded update listener if embedded messaging is enabled
135+
if (enableEmbeddedMessaging) {
136+
IterableApi.getInstance().getEmbeddedManager().addUpdateListener(this);
137+
}
138+
107139
// MOB-10421: Figure out what the error cases are and handle them appropriately
108140
// This is just here to match the TS types and let the JS thread know when we are done initializing
109141
promise.resolve(true);
@@ -129,20 +161,53 @@ public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap,
129161
configBuilder.setAuthHandler(this);
130162
}
131163

132-
if (configReadableMap.hasKey("enableEmbeddedMessaging")) {
133-
configBuilder.setEnableEmbeddedMessaging(configReadableMap.getBoolean("enableEmbeddedMessaging"));
134-
}
135-
136164
// NOTE: There does not seem to be a way to set the API endpoint
137165
// override in the Android SDK. Check with @Ayyanchira and @evantk91 to
138166
// see what the best approach is.
139167

140-
IterableApi.initialize(reactContext, apiKey, configBuilder.build());
168+
// Check if embedded messaging is enabled before building config
169+
boolean enableEmbeddedMessaging = configReadableMap.hasKey("enableEmbeddedMessaging") && configReadableMap.getBoolean("enableEmbeddedMessaging");
170+
171+
IterableConfig config = configBuilder.build();
172+
IterableApi.initialize(reactContext, apiKey, config);
173+
174+
// Update retry policy on existing authManager if it was already created
175+
// This fixes the issue where retryInterval is not respected after
176+
// re-initialization
177+
// TODO [SDK-197]: Fix the root cause of this issue, instead of this hack
178+
try {
179+
// Use reflection to access package-private fields and methods
180+
java.lang.reflect.Field configRetryPolicyField = config.getClass().getDeclaredField("retryPolicy");
181+
configRetryPolicyField.setAccessible(true);
182+
Object retryPolicy = configRetryPolicyField.get(config);
183+
184+
if (retryPolicy != null) {
185+
java.lang.reflect.Method getAuthManagerMethod = IterableApi.getInstance().getClass().getDeclaredMethod("getAuthManager");
186+
getAuthManagerMethod.setAccessible(true);
187+
IterableAuthManager authManager = (IterableAuthManager) getAuthManagerMethod.invoke(IterableApi.getInstance());
188+
189+
if (authManager != null) {
190+
// Update the retry policy field on the authManager
191+
java.lang.reflect.Field authRetryPolicyField = authManager.getClass().getDeclaredField("authRetryPolicy");
192+
authRetryPolicyField.setAccessible(true);
193+
authRetryPolicyField.set(authManager, retryPolicy);
194+
IterableLogger.d(TAG, "Updated retry policy on existing authManager");
195+
}
196+
}
197+
} catch (Exception e) {
198+
IterableLogger.e(TAG, "Failed to update retry policy: " + e.getMessage());
199+
}
200+
141201
IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version);
142202

143203
IterableApi.getInstance().getInAppManager().addListener(this);
144204
IterableApi.getInstance().getEmbeddedManager().syncMessages();
145205

206+
// Add embedded update listener if embedded messaging is enabled
207+
if (enableEmbeddedMessaging) {
208+
IterableApi.getInstance().getEmbeddedManager().addUpdateListener(this);
209+
}
210+
146211
// MOB-10421: Figure out what the error cases are and handle them appropriately
147212
// This is just here to match the TS types and let the JS thread know when we are done initializing
148213
promise.resolve(true);
@@ -616,11 +681,6 @@ public void onTokenRegistrationSuccessful(String authToken) {
616681
sendEvent(EventName.handleAuthSuccessCalled.name(), null);
617682
}
618683

619-
public void onTokenRegistrationFailed(Throwable object) {
620-
IterableLogger.v(TAG, "Failed to set authToken");
621-
sendEvent(EventName.handleAuthFailureCalled.name(), null);
622-
}
623-
624684
public void addListener(String eventName) {
625685
// Keep: Required for RN built in Event Emitter Calls.
626686
}
@@ -645,6 +705,18 @@ public void sendEvent(@NonNull String eventName, @Nullable Object eventData) {
645705
public void onInboxUpdated() {
646706
sendEvent(EventName.receivedIterableInboxChanged.name(), null);
647707
}
708+
709+
@Override
710+
public void onMessagesUpdated() {
711+
IterableLogger.d(TAG, "onMessagesUpdated");
712+
sendEvent(EventName.handleEmbeddedMessageUpdateCalled.name(), null);
713+
}
714+
715+
@Override
716+
public void onEmbeddedMessagingDisabled() {
717+
IterableLogger.d(TAG, "onEmbeddedMessagingDisabled");
718+
sendEvent(EventName.handleEmbeddedMessagingDisabledCalled.name(), null);
719+
}
648720
// ---------------------------------------------------------------------------------------
649721
// endregion
650722

@@ -667,43 +739,32 @@ public void endEmbeddedSession() {
667739
}
668740

669741
public void startEmbeddedImpression(String messageId, int placementId) {
742+
IterableLogger.d(TAG, "startEmbeddedImpression");
670743
IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().startImpression(messageId, placementId);
671744
}
672745

673746
public void pauseEmbeddedImpression(String messageId) {
747+
IterableLogger.d(TAG, "pauseEmbeddedImpression");
674748
IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().pauseImpression(messageId);
675749
}
676750

677-
public void getEmbeddedPlacementIds(Promise promise) {
678-
IterableLogger.d(TAG, "getEmbeddedPlacementIds");
679-
try {
680-
List<Long> placementIds = IterableApi.getInstance().getEmbeddedManager().getPlacementIds();
681-
WritableArray writableArray = Arguments.createArray();
682-
if (placementIds != null) {
683-
for (Long placementId : placementIds) {
684-
writableArray.pushDouble(placementId.doubleValue());
685-
}
686-
}
687-
promise.resolve(writableArray);
688-
} catch (Exception e) {
689-
IterableLogger.e(TAG, "Error getting placement IDs: " + e.getLocalizedMessage());
690-
promise.reject("", "Failed to get placement IDs: " + e.getLocalizedMessage());
691-
}
692-
}
693-
694751
public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) {
695752
IterableLogger.d(TAG, "getEmbeddedMessages for placements: " + placementIds);
696753

697754
try {
698755
List<IterableEmbeddedMessage> allMessages = new ArrayList<>();
699756

700757
if (placementIds == null || placementIds.size() == 0) {
701-
// If no placement IDs provided, we need to get messages for all possible placements
702-
// Since the Android SDK requires a placement ID, we'll use 0 as a default
703-
// This might need to be adjusted based on the actual SDK behavior
704-
List<IterableEmbeddedMessage> messages = IterableApi.getInstance().getEmbeddedManager().getMessages(0L);
705-
if (messages != null) {
706-
allMessages.addAll(messages);
758+
// If no placement IDs provided, get messages from all placements
759+
// Get all available placement IDs and fetch messages for each
760+
List<Long> allPlacementIds = IterableApi.getInstance().getEmbeddedManager().getPlacementIds();
761+
IterableLogger.d(TAG, "Getting messages for all placement IDs: " + allPlacementIds);
762+
763+
for (Long placementId : allPlacementIds) {
764+
List<IterableEmbeddedMessage> messages = IterableApi.getInstance().getEmbeddedManager().getMessages(placementId);
765+
if (messages != null) {
766+
allMessages.addAll(messages);
767+
}
707768
}
708769
} else {
709770
// Convert ReadableArray to individual placement IDs and get messages for each
@@ -745,6 +806,8 @@ enum EventName {
745806
handleAuthFailureCalled,
746807
handleAuthSuccessCalled,
747808
handleCustomActionCalled,
809+
handleEmbeddedMessageUpdateCalled,
810+
handleEmbeddedMessagingDisabledCalled,
748811
handleInAppCalled,
749812
handleUrlCalled,
750813
receivedIterableEmbeddedMessagesChanged,

android/src/newarch/java/com/RNIterableAPIModule.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,6 @@ public void pauseEmbeddedImpression(String messageId) {
249249
moduleImpl.pauseEmbeddedImpression(messageId);
250250
}
251251

252-
@Override
253-
public void getEmbeddedPlacementIds(Promise promise) {
254-
moduleImpl.getEmbeddedPlacementIds(promise);
255-
}
256-
257252
@Override
258253
public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) {
259254
moduleImpl.getEmbeddedMessages(placementIds, promise);

android/src/oldarch/java/com/RNIterableAPIModule.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,6 @@ public void pauseEmbeddedImpression(String messageId) {
253253
moduleImpl.pauseEmbeddedImpression(messageId);
254254
}
255255

256-
@ReactMethod
257-
public void getEmbeddedPlacementIds(Promise promise) {
258-
moduleImpl.getEmbeddedPlacementIds(promise);
259-
}
260-
261256
@ReactMethod
262257
public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) {
263258
moduleImpl.getEmbeddedMessages(placementIds, promise);

0 commit comments

Comments
 (0)