Skip to content

Commit 257cbea

Browse files
authored
Merge pull request #785 from Iterable/loren/embedded/MOB-12267-android-add-start-impression-and-pause-impressio
[MOB-12267] add pauseEmbeddedImpression method to manage embedded message impressions
2 parents 1c82b83 + c3710c5 commit 257cbea

File tree

11 files changed

+254
-9
lines changed

11 files changed

+254
-9
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,16 @@ public void endEmbeddedSession() {
709709
IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().endSession();
710710
}
711711

712+
public void startEmbeddedImpression(String messageId, int placementId) {
713+
IterableLogger.d(TAG, "startEmbeddedImpression");
714+
IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().startImpression(messageId, placementId);
715+
}
716+
717+
public void pauseEmbeddedImpression(String messageId) {
718+
IterableLogger.d(TAG, "pauseEmbeddedImpression");
719+
IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().pauseImpression(messageId);
720+
}
721+
712722
public void getEmbeddedPlacementIds(Promise promise) {
713723
IterableLogger.d(TAG, "getEmbeddedPlacementIds");
714724
try {

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,16 @@ public void endEmbeddedSession() {
239239
moduleImpl.endEmbeddedSession();
240240
}
241241

242+
@Override
243+
public void startEmbeddedImpression(String messageId, double placementId) {
244+
moduleImpl.startEmbeddedImpression(messageId, (int) placementId);
245+
}
246+
247+
@Override
248+
public void pauseEmbeddedImpression(String messageId) {
249+
moduleImpl.pauseEmbeddedImpression(messageId);
250+
}
251+
242252
@Override
243253
public void getEmbeddedPlacementIds(Promise promise) {
244254
moduleImpl.getEmbeddedPlacementIds(promise);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,16 @@ public void endEmbeddedSession() {
243243
moduleImpl.endEmbeddedSession();
244244
}
245245

246+
@ReactMethod
247+
public void startEmbeddedImpression(String messageId, double placementId) {
248+
moduleImpl.startEmbeddedImpression(messageId, (int) placementId);
249+
}
250+
251+
@ReactMethod
252+
public void pauseEmbeddedImpression(String messageId) {
253+
moduleImpl.pauseEmbeddedImpression(messageId);
254+
}
255+
246256
@ReactMethod
247257
public void getEmbeddedPlacementIds(Promise promise) {
248258
moduleImpl.getEmbeddedPlacementIds(promise);

example/src/components/Embedded/Embedded.styles.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { StyleSheet } from 'react-native';
2-
import { button, buttonText, container, hr } from '../../constants';
2+
import { button, buttonText, container, hr, link } from '../../constants';
33

44
const styles = StyleSheet.create({
55
button,
@@ -11,7 +11,17 @@ const styles = StyleSheet.create({
1111
gap: 16,
1212
paddingHorizontal: 16,
1313
},
14+
embeddedTitle: {
15+
fontSize: 16,
16+
fontWeight: 'bold',
17+
lineHeight: 20,
18+
},
19+
embeddedTitleContainer: {
20+
display: 'flex',
21+
flexDirection: 'row',
22+
},
1423
hr,
24+
link,
1525
text: { textAlign: 'center' },
1626
utilitySection: {
1727
paddingHorizontal: 16,

example/src/components/Embedded/Embedded.tsx

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ export const Embedded = () => {
4949
});
5050
}, [getPlacementIds]);
5151

52+
const startEmbeddedImpression = useCallback(
53+
(message: IterableEmbeddedMessage) => {
54+
console.log(`startEmbeddedImpression`, message);
55+
Iterable.embeddedManager.startImpression(
56+
message.metadata.messageId,
57+
// TODO: check if this should be changed to a number, as per the type
58+
Number(message.metadata.placementId)
59+
);
60+
},
61+
[]
62+
);
63+
64+
const pauseEmbeddedImpression = useCallback(
65+
(message: IterableEmbeddedMessage) => {
66+
console.log(`pauseEmbeddedImpression:`, message);
67+
Iterable.embeddedManager.pauseImpression(message.metadata.messageId);
68+
},
69+
[]
70+
);
71+
5272
return (
5373
<SafeAreaView style={styles.container}>
5474
<Text style={styles.text}>EMBEDDED</Text>
@@ -64,27 +84,41 @@ export const Embedded = () => {
6484
Placement ids: [{placementIds.join(', ')}]
6585
</Text>
6686
<TouchableOpacity style={styles.button} onPress={syncEmbeddedMessages}>
67-
<Text style={styles.buttonText}>Sync embedded messages</Text>
87+
<Text style={styles.buttonText}>Sync messages</Text>
6888
</TouchableOpacity>
6989
<TouchableOpacity style={styles.button} onPress={getPlacementIds}>
7090
<Text style={styles.buttonText}>Get placement ids</Text>
7191
</TouchableOpacity>
7292
<TouchableOpacity style={styles.button} onPress={startEmbeddedSession}>
73-
<Text style={styles.buttonText}>Start embedded session</Text>
93+
<Text style={styles.buttonText}>Start session</Text>
7494
</TouchableOpacity>
7595
<TouchableOpacity style={styles.button} onPress={endEmbeddedSession}>
76-
<Text style={styles.buttonText}>End embedded session</Text>
96+
<Text style={styles.buttonText}>End session</Text>
7797
</TouchableOpacity>
7898
<TouchableOpacity style={styles.button} onPress={getEmbeddedMessages}>
79-
<Text style={styles.buttonText}>Get embedded messages</Text>
99+
<Text style={styles.buttonText}>Get messages</Text>
80100
</TouchableOpacity>
81101
</View>
82102
<View style={styles.hr} />
83103
<ScrollView>
84104
<View style={styles.embeddedSection}>
85105
{embeddedMessages.map((message) => (
86106
<View key={message.metadata.messageId}>
87-
<Text>Embedded message</Text>
107+
<View style={styles.embeddedTitleContainer}>
108+
<Text style={styles.embeddedTitle}>Embedded message | </Text>
109+
<TouchableOpacity
110+
onPress={() => startEmbeddedImpression(message)}
111+
>
112+
<Text style={styles.link}>Start impression</Text>
113+
</TouchableOpacity>
114+
<Text style={styles.embeddedTitle}> | </Text>
115+
<TouchableOpacity
116+
onPress={() => pauseEmbeddedImpression(message)}
117+
>
118+
<Text style={styles.link}>Pause impression</Text>
119+
</TouchableOpacity>
120+
</View>
121+
88122
<Text>metadata.messageId: {message.metadata.messageId}</Text>
89123
<Text>metadata.placementId: {message.metadata.placementId}</Text>
90124
<Text>elements.title: {message.elements?.title}</Text>

example/src/constants/styles/typography.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,8 @@ export const requiredStar: TextStyle = {
5656
...label,
5757
color: colors.textDestructive,
5858
};
59+
60+
export const link: TextStyle = {
61+
color: colors.textInteractive,
62+
textDecorationLine: 'underline',
63+
};

src/__mocks__/MockRNIterableAPI.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ export class MockRNIterableAPI {
178178
},
179179
]);
180180

181+
static startEmbeddedImpression = jest.fn();
182+
183+
static pauseEmbeddedImpression = jest.fn();
184+
181185
// set messages function is to set the messages static property
182186
// this is for testing purposes only
183187
static setMessages(messages: IterableInAppMessage[]): void {

src/api/NativeRNIterableAPI.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ export interface Spec extends TurboModule {
149149
syncEmbeddedMessages(): void;
150150
startEmbeddedSession(): void;
151151
endEmbeddedSession(): void;
152+
startEmbeddedImpression(messageId: string, placementId: number): void;
153+
pauseEmbeddedImpression(messageId: string): void;
152154
getEmbeddedPlacementIds(): Promise<number[]>;
153155
getEmbeddedMessages(
154156
placementIds: number[] | null

src/core/classes/IterableApi.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,22 @@ export class IterableApi {
535535
return RNIterableAPI.endEmbeddedSession();
536536
}
537537

538+
/**
539+
* Starts an embedded impression.
540+
*/
541+
static startEmbeddedImpression(messageId: string, placementId: number) {
542+
IterableLogger.log('startEmbeddedImpression: ', messageId, placementId);
543+
return RNIterableAPI.startEmbeddedImpression(messageId, placementId);
544+
}
545+
546+
/**
547+
* Pauses an embedded impression.
548+
*/
549+
static pauseEmbeddedImpression(messageId: string) {
550+
IterableLogger.log('pauseEmbeddedImpression: ', messageId);
551+
return RNIterableAPI.pauseEmbeddedImpression(messageId);
552+
}
553+
538554
/**
539555
* Get the embedded placement IDs.
540556
*/

src/embedded/classes/IterableEmbeddedManager.test.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,5 +167,92 @@ describe('IterableEmbeddedManager', () => {
167167
});
168168
});
169169

170+
describe('startImpression', () => {
171+
it('should call IterableApi.startEmbeddedImpression with messageId and placementId', () => {
172+
// GIVEN a message ID and placement ID
173+
const messageId = 'message-123';
174+
const placementId = 456;
175+
176+
// WHEN startImpression is called
177+
embeddedManager.startImpression(messageId, placementId);
178+
179+
// THEN IterableApi.startEmbeddedImpression is called with the correct parameters
180+
expect(MockRNIterableAPI.startEmbeddedImpression).toHaveBeenCalledTimes(
181+
1
182+
);
183+
expect(MockRNIterableAPI.startEmbeddedImpression).toHaveBeenCalledWith(
184+
messageId,
185+
placementId
186+
);
187+
});
188+
189+
it('should handle multiple impression starts', () => {
190+
// GIVEN multiple messages
191+
const messageId1 = 'message-1';
192+
const placementId1 = 100;
193+
const messageId2 = 'message-2';
194+
const placementId2 = 200;
195+
196+
// WHEN startImpression is called multiple times
197+
embeddedManager.startImpression(messageId1, placementId1);
198+
embeddedManager.startImpression(messageId2, placementId2);
199+
200+
// THEN IterableApi.startEmbeddedImpression is called twice
201+
expect(MockRNIterableAPI.startEmbeddedImpression).toHaveBeenCalledTimes(
202+
2
203+
);
204+
expect(MockRNIterableAPI.startEmbeddedImpression).toHaveBeenNthCalledWith(
205+
1,
206+
messageId1,
207+
placementId1
208+
);
209+
expect(MockRNIterableAPI.startEmbeddedImpression).toHaveBeenNthCalledWith(
210+
2,
211+
messageId2,
212+
placementId2
213+
);
214+
});
215+
});
216+
217+
describe('pauseImpression', () => {
218+
it('should call IterableApi.pauseEmbeddedImpression with messageId', () => {
219+
// GIVEN a message ID
220+
const messageId = 'message-123';
221+
222+
// WHEN pauseImpression is called
223+
embeddedManager.pauseImpression(messageId);
224+
225+
// THEN IterableApi.pauseEmbeddedImpression is called with the correct parameter
226+
expect(MockRNIterableAPI.pauseEmbeddedImpression).toHaveBeenCalledTimes(
227+
1
228+
);
229+
expect(MockRNIterableAPI.pauseEmbeddedImpression).toHaveBeenCalledWith(
230+
messageId
231+
);
232+
});
233+
234+
it('should handle multiple impression pauses', () => {
235+
// GIVEN multiple message IDs
236+
const messageId1 = 'message-1';
237+
const messageId2 = 'message-2';
238+
239+
// WHEN pauseImpression is called multiple times
240+
embeddedManager.pauseImpression(messageId1);
241+
embeddedManager.pauseImpression(messageId2);
242+
243+
// THEN IterableApi.pauseEmbeddedImpression is called twice
244+
expect(MockRNIterableAPI.pauseEmbeddedImpression).toHaveBeenCalledTimes(
245+
2
246+
);
247+
expect(MockRNIterableAPI.pauseEmbeddedImpression).toHaveBeenNthCalledWith(
248+
1,
249+
messageId1
250+
);
251+
expect(MockRNIterableAPI.pauseEmbeddedImpression).toHaveBeenNthCalledWith(
252+
2,
253+
messageId2
254+
);
255+
});
256+
});
170257
});
171258

0 commit comments

Comments
 (0)