Skip to content

Commit

Permalink
pass package name and expose trackembeddedclick as standalone function (
Browse files Browse the repository at this point in the history
  • Loading branch information
hardikmashru committed Apr 29, 2024
1 parent f464797 commit cc3032e
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 107 deletions.
12 changes: 5 additions & 7 deletions react-example/src/components/EmbeddedForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
import {
EmbeddedManager,
trackEmbeddedMessageReceived,
trackEmbeddedMessageClick,
trackEmbeddedClick,
trackEmbeddedMessagingDismiss,
trackEmbeddedMessagingSession,
EmbeddedMessageUpdateHandler
Expand Down Expand Up @@ -111,14 +111,12 @@ export const EmbeddedForm: FC<Props> = ({
const clickedUrl = 'https://example.com';
const appPackageName = 'my-lil-site';

trackEmbeddedMessageClick(
payload,
trackEmbeddedClick({
messageId: payload.messageId,
buttonIdentifier,
clickedUrl,
appPackageName,
Date.now(),
userId
)
appPackageName
})
.then((response: any) => {
setTrackResponse(JSON.stringify(response.data));
setTrackingEvent(false);
Expand Down
17 changes: 3 additions & 14 deletions src/embedded/embeddedManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,17 @@ import {
URL_SCHEME_ACTION,
URL_SCHEME_OPEN,
WEB_PLATFORM,
SHARED_PREF_USER_ID,
SHARED_PREF_EMAIL,
SDK_VERSION
} from '../constants';
import { IterableEmbeddedMessage } from './embeddedMessage';
import { EndPoints } from 'src/events/consts';
import { trackEmbeddedMessageClickSchema } from 'src/events/embedded/events.schema';
import { functions } from 'src/utils/functions';

export class EmbeddedManager {
private messages: IEmbeddedMessageData[] = [];
private updateListeners: EmbeddedMessageUpdateHandler[] = [];

private addEmailOrUserIdToJson(jsonParams: any): any {
const userId = localStorage.getItem(SHARED_PREF_USER_ID);
const email = localStorage.getItem(SHARED_PREF_EMAIL);
if (userId) {
jsonParams.userId = userId;
} else if (email) {
jsonParams.email = email;
}
return jsonParams;
}
public async syncMessages(
packageName: string,
callback: () => void,
Expand All @@ -53,7 +42,7 @@ export class EmbeddedManager {
try {
let url = `${embedded_msg_endpoint}?`;
let params: any = {};
params = this.addEmailOrUserIdToJson(params);
params = functions.addEmailOrUserIdToJson(params, localStorage);
if (placementIds.length > 0) {
params.placementIds = placementIds
.map((id) => `&placementIds=${id}`)
Expand Down Expand Up @@ -129,7 +118,7 @@ export class EmbeddedManager {
for (let i = 0; i < msgsList.length; i++) {
let messages = {} as IEmbeddedMessageData;
messages.messageId = msgsList[i].metadata.messageId;
messages = this.addEmailOrUserIdToJson(messages);
messages = functions.addEmailOrUserIdToJson(messages, localStorage);
await trackEmbeddedMessageReceived(messages);
}
}
Expand Down
29 changes: 2 additions & 27 deletions src/events/embedded/events.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { baseIterableRequest } from '../../request';
import {
IEmbeddedMessageMetadata,
IEmbeddedSession,
EmbeddedMessagingDismiss,
EmbeddedMessagingSession,
IEmbeddedMessageData
IEmbeddedMessageData,
IEmbeddedSession
} from '../../../src/events/embedded/types';
import { IterableResponse } from '../../types';
import {
trackEmbeddedMessageSchema,
trackEmbeddedMessageClickSchema,
trackEmbeddedSessionSchema,
embaddedMessagingDismissSchema,
embaddedMessagingSessionSchema
Expand All @@ -27,29 +25,6 @@ export const trackEmbeddedMessageReceived = (payload: IEmbeddedMessageData) => {
});
};

export const trackEmbeddedMessageClick = (
payload: IEmbeddedMessageMetadata,
buttonIdentifier: string,
clickedUrl: string,
appPackageName: string
) => {
return baseIterableRequest<IterableResponse>({
method: 'POST',
url: EndPoints.msg_click_event_track,
data: {
messageId: payload.messageId,
buttonIdentifier: buttonIdentifier,
targetUrl: clickedUrl,
deviceInfo: {
appPackageName: appPackageName
}
},
validation: {
data: trackEmbeddedMessageClickSchema
}
});
};

export const trackEmbeddedSession = (payload: IEmbeddedSession) => {
return baseIterableRequest<IterableResponse>({
method: 'POST',
Expand Down
9 changes: 9 additions & 0 deletions src/events/embedded/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,21 @@ export interface EmbeddedMessagingSession {
deviceInfo: DeviceInfo;
createdAt: number;
}

export interface EmbeddedTrackClick {
messageId: string;
buttonIdentifier: string;
clickedUrl: string;
appPackageName?: string;
}

export interface IEmbeddedImpressionData {
messageId: string;
displayCount: number;
duration: number;
start?: Date;
}

export interface IEmbeddedSession {
start?: Date;
end?: Date;
Expand Down
59 changes: 29 additions & 30 deletions src/events/events.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { baseAxiosRequest } from '../request';
import {
track,
trackEmbeddedMessageReceived,
trackEmbeddedMessageClick,
trackEmbeddedClick,
trackEmbeddedSession
} from './events';
import {
Expand All @@ -17,6 +17,10 @@ import { WEB_PLATFORM } from '../constants';
import { createClientError } from '../utils/testUtils';

const mockRequest = new MockAdapter(baseAxiosRequest);
const localStorageMock = {
setItem: jest.fn(),
getItem: jest.fn()
};

describe('Events Requests', () => {
beforeAll(() => {
Expand Down Expand Up @@ -291,34 +295,33 @@ describe('Events Requests', () => {
campaignId: 1
};

(global as any).localStorage = localStorageMock;
const buttonIdentifier = 'button-123';
const clickedUrl = 'https://example.com';
const appPackageName = 'my-lil-site';
const response = await trackEmbeddedMessageClick(
payload,
const response = await trackEmbeddedClick({
messageId: payload.messageId,
buttonIdentifier,
clickedUrl,
appPackageName,
0,
'abc123'
);
appPackageName
});

expect(JSON.parse(response.config.data).messageId).toBe('abc123');
});

it('should reject embedded message click on bad params', async () => {
global.window = Object.create({});
Object.defineProperty(window, 'location', {
value: {
hostname: 'example.com'
}
});
try {
await trackEmbeddedMessageClick(
{
messageId: 'abc123',
campaignId: 1
} as any,
'',
'',
'',
0,
'abc123'
);
await trackEmbeddedClick({
messageId: 'abc123',
buttonIdentifier: '',
clickedUrl: ''
});
} catch (e: any) {
expect(e).toEqual(
createClientError([
Expand Down Expand Up @@ -374,6 +377,7 @@ describe('Events Requests', () => {
});

it('should not send up passed email or userId params', async () => {
(global as any).localStorage = localStorageMock;
const trackResponse = await track({
email: 'hello@gmail.com',
userId: '1234',
Expand Down Expand Up @@ -422,17 +426,12 @@ describe('Events Requests', () => {
},
deviceInfo: { appPackageName: 'my-lil-site' }
});
const trackEmClickResponse = await trackEmbeddedMessageClick(
{
messageId: 'abc123',
campaignId: 1
},
'button-123',
'https://example.com',
'my-lil-site',
0,
'abc123'
);
const trackEmClickResponse = await trackEmbeddedClick({
messageId: 'abc123',
buttonIdentifier: 'button-123',
clickedUrl: 'https://example.com',
appPackageName: 'my-lil-site'
});
const trackSessionResponse = await trackEmbeddedSession({
session: {
id: '123',
Expand Down Expand Up @@ -517,7 +516,7 @@ describe('Events Requests', () => {
).toBeUndefined();

expect(JSON.parse(trackEmClickResponse.config.data).email).toBeUndefined();
expect(JSON.parse(trackEmClickResponse.config.data).userId).toBe('abc123');
expect(JSON.parse(trackEmClickResponse.config.data).userId).toBeUndefined();

expect(JSON.parse(trackSessionResponse.config.data).email).toBeUndefined();
expect(JSON.parse(trackSessionResponse.config.data).userId).toBeUndefined();
Expand Down
52 changes: 23 additions & 29 deletions src/events/events.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { baseIterableRequest } from '../request';
import { InAppTrackRequestParams } from './in-app/types';
import {
IEmbeddedMessageMetadata,
IEmbeddedMessage,
IEmbeddedSession,
EmbeddedMessagingDismiss,
EmbeddedMessagingSession
} from '../../src/events/embedded/types';
EmbeddedMessagingSession,
EmbeddedTrackClick,
IEmbeddedMessage,
IEmbeddedSession
} from './embedded/types';
import { IterableResponse } from '../types';
import { WEB_PLATFORM } from '../constants';
import {
Expand Down Expand Up @@ -38,7 +38,7 @@ export const track = (payload: InAppTrackRequestParams) => {
export const trackEmbeddedMessageReceived = (payload: IEmbeddedMessage) => {
return baseIterableRequest<IterableResponse>({
method: 'POST',
url: '/embedded-messaging/events/received',
url: EndPoints.msg_received_event_track,
data: {
...payload,
deviceInfo: {
Expand All @@ -53,30 +53,24 @@ export const trackEmbeddedMessageReceived = (payload: IEmbeddedMessage) => {
});
};

export const trackEmbeddedMessageClick = (
payload: IEmbeddedMessageMetadata,
buttonIdentifier: string,
clickedUrl: string,
appPackageName: string,
createdAt: number,
userIdOrEmail: string
) => {
export const trackEmbeddedClick = (payload: EmbeddedTrackClick) => {
let data: any = {
messageId: payload.messageId,
buttonIdentifier: payload.buttonIdentifier,
targetUrl: payload.clickedUrl,
deviceInfo: {
platform: WEB_PLATFORM,
deviceId: global.navigator.userAgent || '',
appPackageName: payload.appPackageName || window.location.hostname
},
createdAt: Date.now()
};
data = functions.addEmailOrUserIdToJson(data, localStorage);

return baseIterableRequest<IterableResponse>({
method: 'POST',
url: '/embedded-messaging/events/click',
data: {
[functions.checkEmailValidation(userIdOrEmail) ? 'email' : 'userId']:
userIdOrEmail,
messageId: payload.messageId,
buttonIdentifier: buttonIdentifier,
targetUrl: clickedUrl,
deviceInfo: {
platform: WEB_PLATFORM,
deviceId: global.navigator.userAgent || '',
appPackageName: appPackageName
},
createdAt: createdAt
},
url: EndPoints.msg_click_event_track,
data,
validation: {
data: trackEmbeddedMessageClickSchema
}
Expand All @@ -86,7 +80,7 @@ export const trackEmbeddedMessageClick = (
export const trackEmbeddedSession = (payload: IEmbeddedSession) => {
return baseIterableRequest<IterableResponse>({
method: 'POST',
url: '/embedded-messaging/events/impression',
url: EndPoints.msg_impression_event_track,
data: {
...payload,
deviceInfo: {
Expand Down
16 changes: 16 additions & 0 deletions src/utils/functions.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,23 @@
import { SHARED_PREF_EMAIL, SHARED_PREF_USER_ID } from 'src/constants';

export class functions {
private static emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

public static checkEmailValidation(email: string): boolean {
return functions.emailRegex.test(email);
}

public static addEmailOrUserIdToJson(
jsonParams: any,
localStorage: Storage
): any {
const userId = localStorage.getItem(SHARED_PREF_USER_ID);
const email = localStorage.getItem(SHARED_PREF_EMAIL);
if (userId) {
jsonParams.userId = userId;
} else if (email) {
jsonParams.email = email;
}
return jsonParams;
}
}

0 comments on commit cc3032e

Please sign in to comment.