diff --git a/react-example/src/components/EmbeddedForm.tsx b/react-example/src/components/EmbeddedForm.tsx index b0eb73b6..93396a0b 100644 --- a/react-example/src/components/EmbeddedForm.tsx +++ b/react-example/src/components/EmbeddedForm.tsx @@ -9,7 +9,7 @@ import { import { EmbeddedManager, trackEmbeddedMessageReceived, - trackEmbeddedMessageClick, + trackEmbeddedClick, trackEmbeddedMessagingDismiss, trackEmbeddedMessagingSession, EmbeddedMessageUpdateHandler @@ -111,14 +111,12 @@ export const EmbeddedForm: FC = ({ 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); diff --git a/src/embedded/embeddedManager.ts b/src/embedded/embeddedManager.ts index 5f748eb8..e6463026 100644 --- a/src/embedded/embeddedManager.ts +++ b/src/embedded/embeddedManager.ts @@ -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, @@ -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}`) @@ -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); } } diff --git a/src/events/embedded/events.ts b/src/events/embedded/events.ts index 9abb5778..16170cc7 100644 --- a/src/events/embedded/events.ts +++ b/src/events/embedded/events.ts @@ -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 @@ -27,29 +25,6 @@ export const trackEmbeddedMessageReceived = (payload: IEmbeddedMessageData) => { }); }; -export const trackEmbeddedMessageClick = ( - payload: IEmbeddedMessageMetadata, - buttonIdentifier: string, - clickedUrl: string, - appPackageName: string -) => { - return baseIterableRequest({ - 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({ method: 'POST', diff --git a/src/events/embedded/types.ts b/src/events/embedded/types.ts index 2863d309..e7d8e488 100644 --- a/src/events/embedded/types.ts +++ b/src/events/embedded/types.ts @@ -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; diff --git a/src/events/events.test.ts b/src/events/events.test.ts index 8088a026..a57cef42 100644 --- a/src/events/events.test.ts +++ b/src/events/events.test.ts @@ -3,7 +3,7 @@ import { baseAxiosRequest } from '../request'; import { track, trackEmbeddedMessageReceived, - trackEmbeddedMessageClick, + trackEmbeddedClick, trackEmbeddedSession } from './events'; import { @@ -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(() => { @@ -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([ @@ -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', @@ -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', @@ -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(); diff --git a/src/events/events.ts b/src/events/events.ts index 8ea592ea..00a32006 100644 --- a/src/events/events.ts +++ b/src/events/events.ts @@ -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 { @@ -38,7 +38,7 @@ export const track = (payload: InAppTrackRequestParams) => { export const trackEmbeddedMessageReceived = (payload: IEmbeddedMessage) => { return baseIterableRequest({ method: 'POST', - url: '/embedded-messaging/events/received', + url: EndPoints.msg_received_event_track, data: { ...payload, deviceInfo: { @@ -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({ 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 } @@ -86,7 +80,7 @@ export const trackEmbeddedMessageClick = ( export const trackEmbeddedSession = (payload: IEmbeddedSession) => { return baseIterableRequest({ method: 'POST', - url: '/embedded-messaging/events/impression', + url: EndPoints.msg_impression_event_track, data: { ...payload, deviceInfo: { diff --git a/src/utils/functions.ts b/src/utils/functions.ts index e658df18..d1646ba8 100644 --- a/src/utils/functions.ts +++ b/src/utils/functions.ts @@ -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; + } }