From c0290c43eeaf6f05e8e4ef3ba0b2fe593027a174 Mon Sep 17 00:00:00 2001 From: FrankRua Date: Thu, 28 Apr 2022 13:13:50 -0400 Subject: [PATCH] Auto stash before merge of "develop" and "origin/develop" --- .../button-question/button-question.vue | 3 +++ src/constants/endpoints.js | 4 ++++ src/constants/experiments.js | 6 ++++- src/constants/store-actions.js | 1 + src/global-methods.js | 6 ++++- src/layouts/vehicle-damage/vehicle-damage.vue | 6 +++++ src/mixins/analytics-mixin.js | 24 +++++++++++++++++++ src/router/index.js | 10 ++++++-- src/store/index.js | 8 +++++++ 9 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/common-components/button-question/button-question.vue b/src/common-components/button-question/button-question.vue index 48bbe9227..5c625a690 100644 --- a/src/common-components/button-question/button-question.vue +++ b/src/common-components/button-question/button-question.vue @@ -52,6 +52,7 @@ import listButtonHorizontal from "@/ux-components/list-button-horizontal/list-bu import listCard from "@/ux-components/list-card/list-card"; import { ErrorMessage } from 'vee-validate'; import radio from "@/ux-components/radio/radio"; +import { queryStrings } from "@/constants/query-strings"; export default { name: "buttonQuestion", @@ -133,6 +134,8 @@ export default { return answer.Name ? answer.Name : answer; }, handleCheckedChanged(val) { + this.pushEventToGA(this.$route.query[queryStrings.FMG_PAGE], 'Clicked', val.value, undefined, this.$route.query[queryStrings.FMG_PAGE]); + if(this.isMultiSelect && this.selectedValues) { // Add or remove item to array of data to emit const newSelectedValues = this.selectedValues; diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 322dab574..47eb50ab8 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -70,6 +70,10 @@ const endpoints = { LogActivity:{ url: "/analytics/api/v1/analytics/activity", method: "POST", + }, + GetExperimentsByUserForGa: { + url: "/analytics/api/v1/analytics/get-experiments-for-GA", + method: "GET", } }; diff --git a/src/constants/experiments.js b/src/constants/experiments.js index 13a51aa7f..cd2325a24 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -1,6 +1,10 @@ const experimentUniverses = { CONCEPT_FUNNEL: 'ConceptFunnel' }; + +const experimentSettings = { + GOOGLE_CUSTOM_DIMENSION_INDEX: 'Google Custom Dimension Index' +} -export { experimentUniverses }; +export { experimentUniverses, experimentSettings}; \ No newline at end of file diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index 7587907dc..8de78f70c 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -19,6 +19,7 @@ const storeActions = { VALIDATE_ZIP: "validateZip", LOG_EXPERIMENT_EXPOSURE: "logExperimentExposure", LOG_ACTIVITY: "logActivity", + GET_EXPERIMENTS_BY_USER_FOR_GA: "getExperimentsByUserForGa", // DEPENDENCY MUTATIONS RESET_VEHICLE_STATE_AND_DEPENDENCIES: "resetVehicleAndDependencies", diff --git a/src/global-methods.js b/src/global-methods.js index c0823f29a..2d5310e73 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -5,7 +5,11 @@ import httpStatusCodes from "http-status-codes"; export default { callHttpClient({ method, endpoint, payload }) { return new Promise((resolve, reject) => { - const apiGatewayUrl = applicationConfig.CONSUMER_APIGATEWAY_URL; + var apiGatewayUrl = applicationConfig.CONSUMER_APIGATEWAY_URL; + + if(endpoint.includes('analytics')){ + apiGatewayUrl = 'https://localhost:44324'; + } const payloadAndAnalyticsData = Object.assign({}, payload, { AppName: "FixMyGlass", diff --git a/src/layouts/vehicle-damage/vehicle-damage.vue b/src/layouts/vehicle-damage/vehicle-damage.vue index 8de1f887f..305336184 100644 --- a/src/layouts/vehicle-damage/vehicle-damage.vue +++ b/src/layouts/vehicle-damage/vehicle-damage.vue @@ -79,6 +79,7 @@ import { errorMessages } from "@/constants/error-messages"; import { damageLocationsCms } from "@/constants/damage-locations-cms.js"; import { damageLocationsSelected } from "@/constants/damage-locations-selected.js"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; +import { queryStrings } from "@/constants/query-strings"; import store from "@/store"; import baseMixin from "@/mixins/base-mixin"; @@ -140,6 +141,11 @@ export default { selectedRearReplaceOptions: this.getRearReplaceOptionsFromStore(), } }, + mounted(){ + if(this.$store.getters.vehicle.imageVifNumber){ + this.pushEventToGA("Evox", `vif_${this.$store.getters.vehicle.imageVifNumber}`, this.$store.getters.vehicle.carId, undefined, this.$route.query[queryStrings.FMG_PAGE]); + } + }, methods: { arePagePrerequisitesValid() { if(store.getters.vehicle.carId){ diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index 763a7c830..f61ebb378 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -4,6 +4,7 @@ import { settleAllPromises } from "@/helpers/layout-helper"; import { getDeviceIdValue, getSessionIdValue, getSessionKeyValue } from "@/helpers/heritage-integration/cookie-helper"; import { queryStrings } from "@/constants/query-strings"; import { analyticsPageEvents } from "@/constants/analytics-page-events"; +import { experimentSettings } from "@/constants/experiments"; export default { methods: { @@ -52,6 +53,29 @@ export default { }; pushToDataLayerIfDefined(pageViewEvent); + }, + + pushExperimentsToDataLayer(experiments){ + experiments?.data?.forEach(exp => { + + // Set Google Dimension Index based on experiment settings. + let googleDimensionIndex = 99; + + if (exp.settings[experimentSettings.GOOGLE_CUSTOM_DIMENSION_INDEX] !== undefined) { + googleDimensionIndex = exp.settings[experimentSettings.GOOGLE_CUSTOM_DIMENSION_INDEX]; + } + + // Create object with dimension index and value. + const experimentWithDimension = {}; + + Object.keys(exp).forEach(key => { + experimentWithDimension[`${key}_${googleDimensionIndex}`] = exp[key]; + }); + + // Push to the data layer with the Google Custom Dimension Index. + pushToDataLayerIfDefined(experimentWithDimension); + }); + }, this.logEvent(pageName, analyticsPageEvents.ENTRY); } }, diff --git a/src/router/index.js b/src/router/index.js index 034294f81..f175f7cc2 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -5,6 +5,8 @@ import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js" import { routingTable } from "@/router/router-constants/routing-table.js"; import { globalEvents, globalEventTypes } from "@/constants/events"; import { queryStrings } from "@/constants/query-strings"; +import { analyticsPageEvents } from "./router-constants/analytics-page-events"; +import { getDeviceIdValue } from "@/helpers/heritage-integration/cookie-helper"; // Heritage integration import { isSavedSessionStillActive } from "@/helpers/heritage-integration/session-helper"; @@ -21,6 +23,7 @@ import analyticsMixin from "@/mixins/analytics-mixin"; import ComponentTest from "@/layouts/component-test/component-test.vue"; import FormTest from "@/layouts/form-test/form-test.vue"; + const routes = [ { path: "/component-test", // This is a temporary route for testing. @@ -121,8 +124,11 @@ const router = createRouter({ //---------------------------------------------------------- Router Functions ---------------------------------------------------------- -router.afterEach((to, from) => { +router.afterEach(async (to, from) => { + // Push page view to GA analyticsMixin.methods.pushPageViewToGA(to.query[queryStrings.FMG_PAGE]); + const assignedExperiments = await baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.GET_EXPERIMENTS_BY_USER_FOR_GA, { userId: getDeviceIdValue() }); + analyticsMixin.methods.pushExperimentsToDataLayer(assignedExperiments); }); router.navigate = (scenario, currentRoute, optionalQuery = {}, optionalParams = {}, optionalPageData = {}) => { @@ -167,7 +173,7 @@ async function navigate(scenario, currentRoute, invalidateOnSave, optionalQuery if (getFunnelCookie()?.ReferralNumber && getFunnelCookie()?.ReferralDate) { await saveOrder(); } - + router.push({ name: "root", query: Object.assign(optionalQuery, { diff --git a/src/store/index.js b/src/store/index.js index bf6a6f937..5d6f0da49 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -445,6 +445,14 @@ export const actions = { payload: payload }); }, + + getExperimentsByUserForGa(context, { userId }){ + return globalMethods.callHttpClient({ + method: endpoints.GetExperimentsByUserForGa.method, + endpoint: `${endpoints.GetExperimentsByUserForGa.url}/${userId}`, + payload: {} + }); + }, // Parts API Actions