Skip to content

Commit 1408854

Browse files
committed
feat: enhance IterableApi with new tracking methods for embedded sessions and clicks
1 parent 1846e74 commit 1408854

2 files changed

Lines changed: 81 additions & 42 deletions

File tree

src/core/classes/IterableApi.ts

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
import { Platform } from 'react-native';
22

33
import RNIterableAPI from '../../api';
4-
import { IterableConfig } from './IterableConfig';
5-
import type { IterableLogger } from './IterableLogger';
6-
import { defaultLogger } from '../constants/defaults';
7-
import { IterableAttributionInfo } from './IterableAttributionInfo';
8-
import type { IterableCommerceItem } from './IterableCommerceItem';
4+
import type { IterableEmbeddedMessage } from '../../embedded/classes/IterableEmbeddedMessage';
5+
import type { IterableEmbeddedSession } from '../../embedded/classes/IterableEmbeddedSession';
6+
import type { IterableHtmlInAppContent } from '../../inApp/classes/IterableHtmlInAppContent';
97
import type { IterableInAppMessage } from '../../inApp/classes/IterableInAppMessage';
10-
import type { IterableInAppLocation } from '../../inApp/enums/IterableInAppLocation';
118
import type { IterableInAppCloseSource } from '../../inApp/enums/IterableInAppCloseSource';
129
import type { IterableInAppDeleteSource } from '../../inApp/enums/IterableInAppDeleteSource';
13-
import type { IterableHtmlInAppContent } from '../../inApp/classes/IterableHtmlInAppContent';
10+
import type { IterableInAppLocation } from '../../inApp/enums/IterableInAppLocation';
1411
import type { IterableInAppShowResponse } from '../../inApp/enums/IterableInAppShowResponse';
1512
import type { IterableInboxImpressionRowInfo } from '../../inbox/types/IterableInboxImpressionRowInfo';
16-
import type { IterableEmbeddedSession } from '../../embedded/classes/IterableEmbeddedSession';
17-
import type { IterableEmbeddedMessage } from '../../embedded/classes/IterableEmbeddedMessage';
18-
import type { IterableEmbeddedPlacement } from '../../embedded/classes/IterableEmbeddedPlacement';
13+
import { defaultLogger } from '../constants/defaults';
14+
import { IterableAttributionInfo } from './IterableAttributionInfo';
15+
import type { IterableCommerceItem } from './IterableCommerceItem';
16+
import { IterableConfig } from './IterableConfig';
17+
import type { IterableLogger } from './IterableLogger';
1918

2019
export class IterableApi {
2120
static logger: IterableLogger = defaultLogger;
@@ -308,9 +307,48 @@ export class IterableApi {
308307
*/
309308
static trackEmbeddedSession(session: IterableEmbeddedSession) {
310309
IterableApi.logger.log('trackEmbeddedSession: ', session);
310+
311+
if (session == null) {
312+
IterableApi.logger.log('trackEmbeddedSession: session is null');
313+
return;
314+
}
315+
316+
if (!session.start || !session.end) {
317+
IterableApi.logger.log(
318+
'trackEmbeddedSession: sessionStartTime and sessionEndTime must be set',
319+
session
320+
);
321+
return;
322+
}
323+
311324
return RNIterableAPI.trackEmbeddedSession(session);
312325
}
313326

327+
static trackEmbeddedClick(
328+
message: IterableEmbeddedMessage,
329+
buttonId: string | null | undefined,
330+
clickedUrl: string | null | undefined
331+
) {
332+
IterableApi.logger.log(
333+
'trackEmbeddedClick: ',
334+
message,
335+
buttonId,
336+
clickedUrl
337+
);
338+
return RNIterableAPI.trackEmbeddedClick(message, buttonId, clickedUrl);
339+
}
340+
341+
static trackEmbeddedMessageReceived(message: IterableEmbeddedMessage) {
342+
IterableApi.logger.log('trackEmbeddedMessageReceived: ', message);
343+
344+
if (message == null) {
345+
IterableApi.logger.log('trackEmbeddedMessageReceived: message is null');
346+
return;
347+
}
348+
349+
return RNIterableAPI.trackEmbeddedMessageReceived(message);
350+
}
351+
314352
// ---- End TRACKING ---- //
315353

316354
// ====================================================== //
@@ -501,22 +539,9 @@ export class IterableApi {
501539
*
502540
* @returns A Promise that resolves to an array of embedded messages.
503541
*/
504-
static getEmbeddedMessages(): Promise<IterableEmbeddedPlacement[]> {
505-
IterableApi.logger.log('getEmbeddedMessages');
506-
return RNIterableAPI.getEmbeddedMessages() as unknown as Promise<
507-
IterableEmbeddedPlacement[]
508-
>;
509-
}
510-
511-
static trackEmbeddedMessageReceived(message: IterableEmbeddedMessage) {
512-
IterableApi.logger.log('trackEmbeddedMessageReceived: ', message);
513-
514-
if (message == null) {
515-
IterableApi.logger.log('trackEmbeddedMessageReceived: message is null');
516-
return;
517-
}
518-
519-
return RNIterableAPI.trackEmbeddedMessageReceived(message);
542+
static getEmbeddedMessages(placementIds: number[] | null) {
543+
IterableApi.logger.log('getEmbeddedMessages: ', placementIds);
544+
return RNIterableAPI.getEmbeddedMessages(placementIds);
520545
}
521546

522547
// ---- End EMBEDDED ---- //

src/embedded/classes/IterableEmbeddedSessionManager.ts

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import { IterableEmbeddedSession } from './IterableEmbeddedSession';
1111
export class IterableEmbeddedSessionManager {
1212
private logger: IterableLogger = new IterableLogger(new IterableConfig());
1313
private impressions: Record<string, IterableEmbeddedImpressionData> = {};
14-
public session?: IterableEmbeddedSession;
14+
public session: IterableEmbeddedSession = new IterableEmbeddedSession({
15+
start: null,
16+
end: null,
17+
impressions: [],
18+
});
1519

1620
constructor(logger: IterableLogger) {
1721
this.logger = logger;
@@ -31,6 +35,8 @@ export class IterableEmbeddedSessionManager {
3135
// TODO: figure out how to get a unique ID for the session
3236
this.session = new IterableEmbeddedSession({
3337
start: new Date(),
38+
end: null,
39+
impressions: [],
3440
});
3541
}
3642

@@ -40,7 +46,7 @@ export class IterableEmbeddedSessionManager {
4046
return;
4147
}
4248

43-
if (this.session?.impressions?.length) {
49+
if (Object.keys(this.impressions).length > 0) {
4450
this.endAllImpressions();
4551

4652
const sessionToTrack = new IterableEmbeddedSession({
@@ -64,53 +70,61 @@ export class IterableEmbeddedSessionManager {
6470

6571
public startImpression(messageId: string, placementId: number) {
6672
let impressionData = this.impressions[messageId];
73+
6774
if (!impressionData) {
6875
impressionData = new IterableEmbeddedImpressionData(
6976
messageId,
7077
placementId
7178
);
7279
this.impressions[messageId] = impressionData;
7380
}
81+
7482
impressionData.start = new Date();
7583
}
7684

7785
public pauseImpression(messageId: string) {
7886
const impressionData = this.impressions[messageId];
87+
7988
if (!impressionData) {
8089
this.logger.log('onMessageImpressionEnded: impressionData not found');
8190
return;
8291
}
8392

84-
if (impressionData.start == null) {
93+
if (!impressionData.start) {
8594
this.logger.log('onMessageImpressionEnded: impressionStarted is null');
8695
return;
8796
}
8897

8998
this.updateDisplayCountAndDuration(impressionData);
9099
}
91100

101+
private endAllImpressions() {
102+
Object.values(this.impressions).forEach((impressionData) => {
103+
this.updateDisplayCountAndDuration(impressionData);
104+
});
105+
}
106+
107+
private getImpressionList(): IterableEmbeddedImpression[] {
108+
return Object.values(this.impressions).map((impression) => {
109+
return new IterableEmbeddedImpression({
110+
messageId: impression.messageId || '',
111+
placementId: impression.placementId || 0,
112+
displayCount: impression.displayCount || 0,
113+
duration: impression.duration || 0,
114+
});
115+
});
116+
}
117+
92118
private updateDisplayCountAndDuration(
93119
impressionData: IterableEmbeddedImpressionData
94120
): IterableEmbeddedImpressionData {
95121
if (impressionData.start) {
96122
impressionData.displayCount = (impressionData.displayCount || 0) + 1;
97123
impressionData.duration =
98124
(impressionData.duration || 0) +
99-
(new Date().getTime() - impressionData.start.getTime()) / 1000;
125+
(new Date().getTime() - impressionData.start.getTime()) / 1000.0;
100126
impressionData.start = null;
101127
}
102128
return impressionData;
103129
}
104-
105-
private endAllImpressions() {
106-
Object.values(this.impressions).forEach((impression) => {
107-
this.updateDisplayCountAndDuration(impression);
108-
});
109-
}
110-
111-
private getImpressionList(): IterableEmbeddedImpressionData[] {
112-
return Object.values(this.impressions).map((impression) => {
113-
return new IterableEmbeddedImpression(impression);
114-
});
115-
}
116130
}

0 commit comments

Comments
 (0)