From 23d202a54e0f7d5775adbe8c865c3ff8e45c9e92 Mon Sep 17 00:00:00 2001 From: Joshua Klein Date: Fri, 17 Mar 2023 11:33:45 -0400 Subject: [PATCH 1/3] Added `addEventCallback` function Allows adding callbacks to the tracking function --- src/ga4mp.js | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/ga4mp.js b/src/ga4mp.js index e82612a..3901a8e 100644 --- a/src/ga4mp.js +++ b/src/ga4mp.js @@ -6,12 +6,12 @@ import { randomInt, timestampInSeconds, sanitizeValue, -} from './modules/helpers' +} from './modules/helpers.js' -import { ga4Schema, ecommerceEvents } from './modules/ga4Schema' -import { sendRequest } from './modules/request' -import clientHints from './modules/clientHints' -import pageDetails from './modules/pageInfo' +import { ga4Schema, ecommerceEvents } from './modules/ga4Schema.js' +import { sendRequest } from './modules/request.js' +import clientHints from './modules/clientHints.js' +import pageDetails from './modules/pageInfo.js' const version = '0.0.1-alpha.3' @@ -40,9 +40,10 @@ const ga4mp = function (measurement_ids, config = {}) { user_agent: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 [GA4MP/${version}]`, user_ip_address: null, hooks: { - beforeLoad: () => {}, - beforeRequestSend: () => {}, + beforeLoad: () => {console.log('before Load!')}, + beforeRequestSend: () => {console.log('request sent!')}, }, + eventCallbacks: [], endpoint: 'https://www.google-analytics.com/g/collect', payloadData: {}, }, @@ -135,6 +136,21 @@ const ga4mp = function (measurement_ids, config = {}) { internalModel['persistentEventParameters'][key] = value } + /** + * Add an events callback, it will be triggered for every track function call + * @param {function} callback + * @returns + */ + const addEventCallback = (callback) => { + if (isFunction(callback)) { + internalModel.eventCallbacks.push(callback) + } else { + console.error('callback is not a function') + } + + } + + /** * setUserProperty * @param {*} key @@ -267,6 +283,15 @@ const ga4mp = function (measurement_ids, config = {}) { ) } const payload = buildPayload(eventName, eventParameters, sessionControl) + // run callbacks here + for (let index = 0; index < internalModel.eventCallbacks.length; index++) { + let callbackFn = internalModel.eventCallbacks[index]; + try { + callbackFn(internalModel.payloadData.user_id, eventName, eventParameters, internalModel.persistentEventParameters, internalModel.userProperties); + } catch(e) { + console.error('callback failed: '+e) + } + } if (payload && forceDispatch) { for (let i = 0; i < payload.tid.length; i++) { let r = JSON.parse(JSON.stringify(payload)) @@ -294,6 +319,7 @@ const ga4mp = function (measurement_ids, config = {}) { setEventsParameter, setUserId, trackEvent, + addEventCallback, } } From b0b9510d272664b46ce01c88ac936592f7e2dabe Mon Sep 17 00:00:00 2001 From: Joshua Klein Date: Fri, 17 Mar 2023 11:37:40 -0400 Subject: [PATCH 2/3] cleaned up code --- src/ga4mp.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ga4mp.js b/src/ga4mp.js index 3901a8e..481d402 100644 --- a/src/ga4mp.js +++ b/src/ga4mp.js @@ -6,12 +6,12 @@ import { randomInt, timestampInSeconds, sanitizeValue, -} from './modules/helpers.js' +} from './modules/helpers' -import { ga4Schema, ecommerceEvents } from './modules/ga4Schema.js' -import { sendRequest } from './modules/request.js' -import clientHints from './modules/clientHints.js' -import pageDetails from './modules/pageInfo.js' +import { ga4Schema, ecommerceEvents } from './modules/ga4Schema' +import { sendRequest } from './modules/request' +import clientHints from './modules/clientHints' +import pageDetails from './modules/pageInfo' const version = '0.0.1-alpha.3' @@ -40,8 +40,8 @@ const ga4mp = function (measurement_ids, config = {}) { user_agent: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 [GA4MP/${version}]`, user_ip_address: null, hooks: { - beforeLoad: () => {console.log('before Load!')}, - beforeRequestSend: () => {console.log('request sent!')}, + beforeLoad: () => {}, + beforeRequestSend: () => {}, }, eventCallbacks: [], endpoint: 'https://www.google-analytics.com/g/collect', From 2106dba7b8db8a837bc27ceefab820eca5ca9ce8 Mon Sep 17 00:00:00 2001 From: Joshua Klein Date: Fri, 24 Mar 2023 06:07:03 -0400 Subject: [PATCH 3/3] Update ga4mp.js Should only be 1 callbackFn - will replace if overwritten. This is a simpler approach --- src/ga4mp.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ga4mp.js b/src/ga4mp.js index 481d402..5e13374 100644 --- a/src/ga4mp.js +++ b/src/ga4mp.js @@ -43,7 +43,7 @@ const ga4mp = function (measurement_ids, config = {}) { beforeLoad: () => {}, beforeRequestSend: () => {}, }, - eventCallbacks: [], + eventCallback: null, endpoint: 'https://www.google-analytics.com/g/collect', payloadData: {}, }, @@ -143,7 +143,7 @@ const ga4mp = function (measurement_ids, config = {}) { */ const addEventCallback = (callback) => { if (isFunction(callback)) { - internalModel.eventCallbacks.push(callback) + internalModel.eventCallback = callback } else { console.error('callback is not a function') } @@ -284,14 +284,16 @@ const ga4mp = function (measurement_ids, config = {}) { } const payload = buildPayload(eventName, eventParameters, sessionControl) // run callbacks here - for (let index = 0; index < internalModel.eventCallbacks.length; index++) { - let callbackFn = internalModel.eventCallbacks[index]; + + let callbackFn = internalModel.eventCallback; + if(callbackFn !== null) { try { callbackFn(internalModel.payloadData.user_id, eventName, eventParameters, internalModel.persistentEventParameters, internalModel.userProperties); } catch(e) { console.error('callback failed: '+e) } } + if (payload && forceDispatch) { for (let i = 0; i < payload.tid.length; i++) { let r = JSON.parse(JSON.stringify(payload))