-
+
@@ -21,20 +34,36 @@
-
-
@@ -114,15 +130,29 @@ import baseMixin from "@/mixins/base-mixin.js";
import { storeActions } from "@/constants/store-actions";
import { storeMutations } from "@/constants/store-mutations";
import { errorMessages } from "@/constants/error-messages";
+import { getDamageString, isGlassAvailableForCarId } from "@/helpers/damage-helper";
import { required, regex } from "@/helpers/validation-rules";
import { Form, defineRule } from "vee-validate";
+import { navigateAfterSaveToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper";
// DEFINE VALIDATION RULES
defineRule("zip-required", required(errorMessages.ZIP_REQUIRED));
-defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED));
-defineRule("email-address-format", regex(/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9_\-.]+).([a-zA-Z]{2,})$/, errorMessages.EMAIL_ADDRESS_FORMAT));
+defineRule(
+ "email-address-required",
+ required(errorMessages.EMAIL_ADDRESS_REQUIRED)
+);
+defineRule(
+ "email-address-format",
+ regex(
+ /^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9_\-.]+).([a-zA-Z]{2,})$/,
+ errorMessages.EMAIL_ADDRESS_FORMAT
+ )
+);
defineRule("vin-required", required(errorMessages.VIN_REQUIRED));
-defineRule("vin-format", regex(/^[A-HJ-NPR-Z0-9]{17}$/, errorMessages.VIN_FORMAT));
+defineRule(
+ "vin-format",
+ regex(/^[A-HJ-NPR-Z0-9]{17}$/, errorMessages.VIN_FORMAT)
+);
export default {
name: "vin-lookup",
@@ -130,7 +160,6 @@ export default {
// Call APIs
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
-
// Settle promises and get results
const promiseResultMap = [
{
@@ -159,12 +188,48 @@ export default {
foundWindshieldAlert: false,
vinNotFound: false,
perfectMatchNewVinAlert: false,
- vin: '',
- zip: '',
- email: '',
+ vin: this.getVinFromStore(),
+ zip: this.getZipFromStore(),
+ email: this.getEmailFromStore(),
customAlertData: {},
+ isCarIdDifferent: false,
+ previouslyEnteredCarId: '',
+ invalidZip: '',
};
},
+ computed: {
+ MatchedDifferentVehicleAlertHeader(){
+ let text = this.getCmsContent("MatchedDifferentVehicle",
+ "HeadlineText").replaceAll("{custom:damage}", getDamageString());
+
+ return text;
+ },
+ MatchedDifferentVehicleAlertBody(){
+ let text = this.getCmsContent("MatchedDifferentVehicle",
+ "BodyText").replaceAll("{custom:damage}", getDamageString()).replaceAll("{custom:vinlookupYear}", this.customAlertData?.vehicleInfo?.year).replaceAll("{custom:vinlookupMake}", this.customAlertData?.vehicleInfo?.make).replaceAll("{custom:vinlookupModel}",
+ this.customAlertData?.vehicleInfo?.model);
+
+ return text;
+ },
+ NoServiceZipHeader(){
+ let text = this.getCmsContent("NoServiceZipWidget", "HeadlineText").replaceAll("{custom:serviceZip}", this.invalidZip);
+
+ return text;
+ },
+ NoServiceZipBody(){
+ return this.getCmsContent("NoServiceZipWidget", "BodyText");
+ },
+ PerfectMatchNewVinAlertHeader() {
+ return this.getCmsContent("PerfectMatchNewVinAlert", "HeadlineText");
+ },
+ PerfectMatchNewVinAlertBody() {
+ return this.getCmsContent("PerfectMatchNewVinAlert", "BodyText").replaceAll("{custom:damage}",
+ getDamageString())
+ },
+ isVinFieldReadOnly(){
+ return this.$store.getters.payment.insuranceCoverage.isVerified;
+ },
+ },
methods: {
arePagePrerequisitesValid() {
return store.getters.vehicle.carId !== null;
@@ -176,71 +241,83 @@ export default {
store.commit(storeMutations.UPDATE_REGISTRATION_LAST_NAME, null);
store.dispatch(storeActions.RESET_PARTS_STATE_AND_DEPENDENCIES);
},
+ getEmailFromStore(){
+ return store.getters.order.customer.emailAddress
+ },
+ getVinFromStore(){
+ return store.getters.vehicle.vin
+ },
+ getZipFromStore(){
+ return store.getters.vehicle.registration.zipCode
+ },
+ attachCustomEvents() {
+ this.prependActionToMethod(this, this.forwardButtonAction, () => {
+ this.pushEventToGA(
+ this.$route.query[this.queryStrings.FMG_PAGE],
+ this.GaActions.SUBMITTED,
+ this.GaLabels.VINLOOKUP,
+ true
+ );
+ });
+ },
backButtonAction() {
this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route);
},
async forwardButtonAction() {
- this.pushEventToGA(this.$route.query[this.queryStrings.FMG_PAGE], this.GaActions.SUBMITTED, this.GaLabels.VINLOOKUP , true);
-
const zipValidation = await this.validateZip(this.zip);
if (!zipValidation.data.isServiceable) {
this.customAlertData.zip = this.zip;
this.$refs.funnelFooter.removeLoader();
this.noServiceZip = true;
+ this.invalidZip = this.zip;
return;
}
- const vinLookup = await this.lookupVin(this.vin).catch(() => {
+ const vehicleLookup = await this.lookupVehicle(this.vin).catch(() => {
+ this.vinNotFound = true;
this.$refs.funnelFooter.removeLoader();
- this.noMatchAlert = true;
+ this.noServiceZip = false;
return;
});
- if (vinLookup.data.carId !== store.getters.vehicle.carId) {
- this.customAlertData.vehicleInfo = vinLookup.data.vehicle;
+ this.isCarIdDifferent = vehicleLookup.data.carId !== store.getters.vehicle.carId;
+
+ if (this.isCarIdDifferent && (vehicleLookup.data.carId !== this.previouslyEnteredCarId)) {
+ this.previouslyEnteredCarId = vehicleLookup.data.carId;
+ this.noServiceZip = false;
+ this.customAlertData.vehicleInfo = vehicleLookup.data;
+ this.$refs.funnelFooter.updateButtonText(`Continue with ${vehicleLookup.data.year} ${vehicleLookup.data.make} ${vehicleLookup.data.model}`);
+ this.isVinValid = true;
+ this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId(vehicleLookup.data.carId);
this.$refs.funnelFooter.removeLoader();
- this.foundWindshieldAlert = true;
+ this.matchedDifferentVehicle = true;
return;
}
- const carInfo = this.vinDoesNotMatchCarId ? vinLookup.data : store.getters.vehicle;
- this.updateStore(carInfo)
- const partsData = await baseMixin.methods.dispatchStoreAction(
- this.storeActions.GET_PARTS_OR_QUESTIONS,
- {
- carId: store.getters.vehicle.carId,
- glassArray: store.getters.damage.glassToReplace,
- zipCode: this.zip,
- vin: vinLookup.vin
- },
- false
- );
- this.navigateForward(partsData);
+ this.updateStore(vehicleLookup.data);
+ this.navigateForward();
},
- navigateForward(partsData){
- if(partsData.data.partsOrQuestions[0].partQuestions && partsData.data.partsOrQuestions[0].partQuestions.length > 0){
- this.$router.navigateAfterSave(this.navigationScenarios.CONTINUING_WITH_PARTS_QUESTION, this.$route, {}, {}, partsData.data);
+ navigateForward(){
+ if(this.isCarIdDifferent && !this.isSelectedGlassAvailableForVehicle){
+ this.$router.navigateAfterSave(this.navigationScenarios.CLICKED_FORWARD, this.$route, {}, { displayVehicleChangeAlert: true }, {});
return;
- } else if((!partsData.data.partsOrQuestions[0].partQuestions || partsData.data.partsOrQuestions[0].partQuestions.length < 1) && partsData.data.partsOrQuestions[0].parts.length > 1) {
- this.$router.navigateAfterSave(this.navigationScenarios.CONTINUING_WITH_MULTIPLE_PARTS, this.$route, {}, {}, partsData.data);
- return;
} else {
- this.$router.navigate(this.navigationScenarios.CONTINUING_WITH_SINGLE_PART, this.$route);
+ navigateAfterSaveToHeritageFunnel(this.$route);
+ return;
}
},
validateZip(zip) {
- return baseMixin.methods.dispatchStoreAction(
- storeActions.VALIDATE_ZIP,
- { zip }
- );
+ return baseMixin.methods.dispatchStoreAction(storeActions.VALIDATE_ZIP, {
+ zip,
+ });
},
- lookupVin(vin) {
+ lookupVehicle(vin) {
return baseMixin.methods.dispatchStoreAction(
storeActions.LOOKUP_VEHICLE_BY_VIN,
{ vin }
);
},
updateStore(carInfo) {
- // if(vehicleDamage){
- // store.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES);
- // }
+ if(this.isCarIdDifferent && !this.isSelectedGlassAvailableForVehicle){
+ store.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES);
+ }
store.commit(storeMutations.UPDATE_VEHICLE_VIN, this.vin);
store.commit(storeMutations.UPDATE_YEAR, carInfo.year);
store.commit(storeMutations.UPDATE_MAKE, carInfo.make);
@@ -250,16 +327,11 @@ export default {
store.commit(storeMutations.UPDATE_VEHICLE_CATEGORY, carInfo.category);
store.commit(storeMutations.UPDATE_VEHICLE_IMAGE_URL, carInfo.imageUrl);
store.commit(storeMutations.UPDATE_VEHICLE_IMAGE_VIF_NUMBER, carInfo.imageVifNumber);
- store.commit(storeMutations.UPDATE_VEHICLE_IMAGE_COLOR, carInfo.imageColor);
- store.commit(storeMutations.UPDATE_SERVICE_LOCATION_ZIP, this.zip);
+ store.commit(storeMutations.UPDATE_VEHICLE_IMAGE_COLOR, carInfo.imageVifNumber);
+ store.commit(storeMutations.UPDATE_SERVICE_LOCATION_ZIP_CODE, this.zip);
store.commit(storeMutations.UPDATE_CUSTOMER_EMAIL_ADDRESS, this.email);
},
},
- computed: {
- isVinFieldReadOnly(){
- return this.$store.getters.payment.insuranceCoverage.isVerified;
- }
- },
components: {
Form,
funnelHeader,
diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js
index c2c86c2dd..6b1943241 100644
--- a/src/mixins/analytics-mixin.js
+++ b/src/mixins/analytics-mixin.js
@@ -11,24 +11,34 @@ const currentPageName = getPageNameByQueryString();
export default {
methods: {
- logEvent(pageEvent, category, action, label, value) {
+ logPageView(pageEvent) {
var payload = {
userId: getDeviceIdValue(),
sessionKey: getSessionKeyValue(),
pageName: currentPageName,
sessionId: getSessionIdValue(),
+ action: '',
+ event: pageEvent,
shouldUseSessionId: true,
};
- if (pageEvent) {
- payload.pageEvent = { action: '', event: pageEvent };
- }
+ baseMixin.methods.dispatchStoreAction(storeActions.LOG_PAGE_VIEW, payload, false);
+ },
- if (category) {
- payload.customEvent = { category: category, action: action, label: label, value: value };
- }
+ logCustomEvent(category, action, label, value) {
+ var payload = {
+ userId: getDeviceIdValue(),
+ sessionKey: getSessionKeyValue(),
+ pageName: currentPageName,
+ sessionId: getSessionIdValue(),
+ category: category,
+ action: action,
+ label: label,
+ value: value,
+ shouldUseSessionId: true,
+ };
- baseMixin.methods.dispatchStoreAction(storeActions.LOG_ACTIVITY, payload, false);
+ baseMixin.methods.dispatchStoreAction(storeActions.LOG_CUSTOM_EVENT, payload, false);
},
pushEventToGA(category, action, label, pushToLogApp = false) {
@@ -44,7 +54,7 @@ export default {
pushToDataLayerIfDefined(eventToBePushed);
if (pushToLogApp) {
- this.logEvent(undefined, category, action, label, undefined);
+ this.logCustomEvent(category, action, label, undefined);
}
},
@@ -58,11 +68,11 @@ export default {
pushToDataLayerIfDefined(pageViewEvent);
- this.logEvent(currentPageName, analyticsPageEvents.ENTRY);
+ this.logPageView(analyticsPageEvents.ENTRY);
},
pushExperimentsToDataLayer(experiments) {
- experiments?.data?.forEach(exp => {
+ experiments?.forEach(exp => {
// Set Google Dimension Index based on experiment settings.
let googleDimensionIndex = 99;
@@ -72,16 +82,26 @@ export default {
}
// Create object with dimension index and value.
- const experimentWithDimension = {};
-
- Object.keys(exp).forEach(key => {
- experimentWithDimension[`${key}_${googleDimensionIndex}`] = exp[key];
- });
+ const experimentWithDimension = {
+ [`experimentId_${googleDimensionIndex}`]: exp.universeId,
+ [`variationId_${googleDimensionIndex}`]: exp.variationId,
+ [`experimentName_${googleDimensionIndex}`]: exp.universeName,
+ [`variationName_${googleDimensionIndex}`]: exp.variationName,
+ [`customDimension_${googleDimensionIndex}`]: `${exp.universeId}_${exp.variationId}_${exp.universeName}_${exp.variationName}`
+ };
// Push to the data layer with the Google Custom Dimension Index.
pushToDataLayerIfDefined(experimentWithDimension);
});
- }
+ },
+
+ prependActionToMethod(object, method, actionToPrepend) {
+ const baseMethod = object[method.name];
+ object[method.name] = function () {
+ actionToPrepend.apply(this, arguments);
+ return baseMethod.apply(object, arguments);
+ };
+ },
},
computed: {
analyticsPageEvents() {
@@ -96,7 +116,7 @@ export default {
GaLabels() {
return GaLabels;
}
- }
+ },
};
function pushToDataLayerIfDefined(data) {
diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js
index b4ec2a5b5..e63778466 100644
--- a/src/mixins/analytics-mixin.spec.js
+++ b/src/mixins/analytics-mixin.spec.js
@@ -3,18 +3,34 @@ import { setupMocksForJsFiles } from "@/helpers/unit-test-helper.js";
import { storeActions } from "@/constants/store-actions";
describe("analyticsMixin.js", () => {
- test("logEvent: calls dispatch with type and payload", () => {
+ test("logPageView: calls dispatch with type and payload", () => {
const type = "";
const payload = {};
const mockData = {
actionList: [{
- actionName: storeActions.LOG_ACTIVITY
+ actionName: storeActions.LOG_PAGE_VIEW
}],
}
const mocks = setupMocksForJsFiles(mockData);
- analyticsMixin.methods.logEvent(type, payload);
+ analyticsMixin.methods.logPageView(type, payload);
+
+ expect(mocks.baseMixin.methods.dispatchStoreAction).toBeCalled();
+ });
+
+ test("logCustomEvent: calls dispatch with type and payload", () => {
+ const type = "";
+ const payload = {};
+
+ const mockData = {
+ actionList: [{
+ actionName: storeActions.LOG_CUSTOM_EVENT
+ }],
+ }
+ const mocks = setupMocksForJsFiles(mockData);
+
+ analyticsMixin.methods.logCustomEvent(type, payload);
expect(mocks.baseMixin.methods.dispatchStoreAction).toBeCalled();
});
@@ -23,7 +39,7 @@ describe("analyticsMixin.js", () => {
// Arrange
const mockData = {
actionList: [{
- actionName: storeActions.LOG_ACTIVITY
+ actionName: storeActions.LOG_CUSTOM_EVENT
}],
}
const mocks = setupMocksForJsFiles(mockData);
@@ -40,21 +56,27 @@ describe("analyticsMixin.js", () => {
// Arrange
window.dataLayer = [];
- const mockExperimentData = {
- data: [
+ const mockExperimentData =
+ [
{
settings: {},
variationName: 'test',
universeName: 'testUniverse'
}
]
- }
+
// Act
analyticsMixin.methods.pushExperimentsToDataLayer(mockExperimentData);
// Assert
- expect(window.dataLayer).toEqual([ { settings_99: {}, variationName_99: 'test', universeName_99: 'testUniverse' } ]);
+ expect(window.dataLayer).toEqual([{
+ experimentId_99: undefined,
+ variationId_99: undefined,
+ experimentName_99: 'testUniverse',
+ variationName_99: 'test',
+ customDimension_99: 'undefined_undefined_testUniverse_test'
+ }]);
});
@@ -62,22 +84,27 @@ describe("analyticsMixin.js", () => {
// Arrange
window.dataLayer = [];
- const mockExperimentData = {
- data: [
+ const mockExperimentData =
+ [
{
- settings: { "Google Custom Dimension Index": "5"},
+ settings: { "Google Custom Dimension Index": "5" },
variationName: 'test',
universeName: 'testUniverse'
}
]
- }
+
// Act
analyticsMixin.methods.pushExperimentsToDataLayer(mockExperimentData);
// Assert
- expect(window.dataLayer).toEqual([ { settings_5: {"Google Custom Dimension Index": "5"}, variationName_5: 'test', universeName_5: 'testUniverse' } ]);
+ expect(window.dataLayer).toEqual([{
+ experimentId_5: undefined,
+ variationId_5: undefined,
+ experimentName_5: 'testUniverse',
+ variationName_5: 'test',
+ customDimension_5: 'undefined_undefined_testUniverse_test'
+ }]);
});
-
});
\ No newline at end of file
diff --git a/src/mixins/base-mixin.spec.js b/src/mixins/base-mixin.spec.js
index f343336c3..b0c8b26f3 100644
--- a/src/mixins/base-mixin.spec.js
+++ b/src/mixins/base-mixin.spec.js
@@ -6,7 +6,7 @@ import { vehicleCategories } from "@/constants/vehicle-categories.js";
import store from "@/store";
describe("baseMixin.js", () => {
- test("dispatchNonblockingStoreAction: calls dispatch with type and payload", () => {
+ test("dispatchStoreAction: calls dispatch with type and payload", () => {
const mixIn = getMixInInstance({});
const type = "";
const payload = {};
@@ -16,7 +16,7 @@ describe("baseMixin.js", () => {
expect(store.dispatch).toBeCalledWith(type, payload);
});
- test("dispatchNonblockingStoreAction: calls dispatch with type and payload, handles Uri encode", () => {
+ test("dispatchStoreAction: calls dispatch with type and payload, handles Uri encode", () => {
const mixIn = getMixInInstance({});
const type = "";
const payload = { make: "Alfa Romeo/Chrysler" };
diff --git a/src/router/index.js b/src/router/index.js
index 9ffd28522..f11bd4228 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -126,8 +126,12 @@ const router = createRouter({
router.afterEach(async (to, from) => {
// Push page view to GA
analyticsMixin.methods.pushPageViewToGA(to.query[queryStrings.FMG_PAGE]);
- const assignedExperiments = await baseMixin.methods.dispatchStoreAction(storeActions.GET_EXPERIMENTS_BY_USER_FOR_GA, { userId: getDeviceIdValue() });
- analyticsMixin.methods.pushExperimentsToDataLayer(assignedExperiments);
+
+ baseMixin.methods.dispatchStoreAction(storeActions.GET_EXPERIMENTS_BY_USER, { userId: getDeviceIdValue() })
+ .then( (response) => {
+ analyticsMixin.methods.pushExperimentsToDataLayer(response.data);
+ });
+
});
router.navigate = (scenario, currentRoute, optionalQuery = {}, optionalParams = {}, optionalPageData = {}) => {
diff --git a/src/router/router-constants/navigation-scenarios.js b/src/router/router-constants/navigation-scenarios.js
index 5380a3fa7..b3ce4d6d7 100644
--- a/src/router/router-constants/navigation-scenarios.js
+++ b/src/router/router-constants/navigation-scenarios.js
@@ -8,14 +8,14 @@ const navigationScenarios = {
CLICKED_FORWARD: "CLICKED_FORWARD",
CLICKED_FORWARD_WITH_VIN: "CLICKED_FORWARD_WITH_VIN",
SELECTED_PARTS: "SELECTED_PARTS",
- SELECTED_DAMAGE_WITH_SINGLE_PART: "SELECTED_DAMAGE_WITH_SINGLE_PART",
- SELECTED_DAMAGE_WITH_MULTIPLE_PARTS: "SELECTED_DAMAGE_WITH_MULTIPLE_PARTS",
- SELECTED_DAMAGE_WITH_PART_QUESTIONS: "SELECTED_DAMAGE_WITH_PART_QUESTIONS",
CONTINUING_WITH_PARTS_QUESTION: "CONTINUING_WITH_PARTS_QUESTION",
CONTINUING_WITH_MULTIPLE_PARTS: "CONTINUING_WITH_MULTIPLE_PARTS",
CONTINUING_WITH_SINGLE_PART: "CONTINUING_WITH_SINGLE_PART",
CONTINUING_WITH_MULTIPLE_VEHICLES: "CONTINUING_WITH_MULTIPLE_VEHICLES",
- TEMPORARY_TO_ADDRESS_LOOKUP: "TEMPORARY_TO_ADDRESS_LOOKUP",
+ CLICKED_FORWARD_WITHOUT_VIN: "CLICKED_FORWARD_WITHOUT_VIN",
+ SELECTED_MANUAL_VIN: "SELECTED_MANUAL_VIN",
+ SELECTED_LICENSE_PLATE: "SELECTED_LICENSE_PLATE",
+ SELECTED_HOME_ADDRESS: "SELECTED_HOME_ADDRESS",
};
export { navigationScenarios };
diff --git a/src/router/router-constants/routing-table.js b/src/router/router-constants/routing-table.js
index 9f412288a..2d27efcdf 100644
--- a/src/router/router-constants/routing-table.js
+++ b/src/router/router-constants/routing-table.js
@@ -59,23 +59,11 @@ const routingTable = [
},
{
scenario: navigationScenarios.CLICKED_FORWARD_WITH_VIN,
- destinationFmgPageValue: fmgPageValues.LICENSE_PLATE_LOOKUP,
+ destinationFmgPageValue: fmgPageValues.VIN_LOOKUP,
},
{
- scenario: navigationScenarios.SELECTED_DAMAGE_WITH_SINGLE_PART,
- destinationFmgPageValue: fmgPageValues.LICENSE_PLATE_LOOKUP,
- },
- {
- scenario: navigationScenarios.SELECTED_DAMAGE_WITH_MULTIPLE_PARTS,
- destinationFmgPageValue: fmgPageValues.VEHICLE_PARTS,
- },
- {
- scenario: navigationScenarios.SELECTED_DAMAGE_WITH_PART_QUESTIONS,
- destinationFmgPageValue: fmgPageValues.LICENSE_PLATE_LOOKUP,//This might be temporary
- },
- {
- scenario: navigationScenarios.TEMPORARY_TO_ADDRESS_LOOKUP,
- destinationFmgPageValue: fmgPageValues.ADDRESS_LOOKUP, //This will be temporary
+ scenario: navigationScenarios.CLICKED_FORWARD_WITHOUT_VIN,
+ destinationFmgPageValue: fmgPageValues.ESTIMATE,
},
],
},
@@ -124,6 +112,10 @@ const routingTable = [
scenario: navigationScenarios.VIN_LOOKUP,
destinationFmgPageValue: fmgPageValues.PART_QUESTIONS,
},
+ {
+ scenario: navigationScenarios.CLICKED_FORWARD,
+ destinationFmgPageValue: fmgPageValues.ESTIMATE,
+ }
],
},
{
@@ -168,6 +160,26 @@ const routingTable = [
},
],
},
+ {fmgPageValue: fmgPageValues.ESTIMATE,
+ maps: [
+ {
+ scenario: navigationScenarios.CLICKED_BACK,
+ destinationFmgPageValue: fmgPageValues.VEHICLE_DAMAGE,
+ },
+ {
+ scenario: navigationScenarios.SELECTED_MANUAL_VIN,
+ destinationFmgPageValue: fmgPageValues.VIN_LOOKUP,
+ },
+ {
+ scenario: navigationScenarios.SELECTED_LICENSE_PLATE,
+ destinationFmgPageValue: fmgPageValues.LICENSE_PLATE_LOOKUP,
+ },
+ {
+ scenario: navigationScenarios.SELECTED_HOME_ADDRESS,
+ destinationFmgPageValue: fmgPageValues.ADDRESS_LOOKUP,
+ },
+ ],
+ },
];
export { routingTable };
diff --git a/src/store/index.js b/src/store/index.js
index 60c2f6435..2c52053bb 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -31,7 +31,7 @@ const getDefaultState = () => {
},
},
serviceLocation: {
- zip: null,
+ zipCode: null,
},
customer: {
emailAddress: null,
@@ -144,17 +144,17 @@ export const mutations = {
updateRegistrationAddress(state, registrationAddress){
state.order.vehicle.registration.address = registrationAddress;
},
- updateServiceLocationZip(state, serviceLocationZip){
- state.order.serviceLocation.zip = serviceLocationZip;
+ updateServiceLocationZipCode(state, serviceLocationZipCode){
+ state.order.serviceLocation.zipCode = serviceLocationZipCode;
},
- updateRegistrationCity(state, registrationCity){
- state.order.vehicle.registration.city = registrationCity;
+ updateRegistrationCity(state, serviceCity){
+ state.order.serviceLocation.city = serviceCity;
},
updateRegistrationFirstName(state, firstName){
- state.order.vehicle.registration.firstName = firstName;
+ state.order.serviceLocation.firstName = firstName;
},
updateRegistrationLastName(state, lastName){
- state.order.vehicle.registration.lastName = lastName;
+ state.order.serviceLocation.lastName = lastName;
},
updateCustomerEmailAddress(state, customerEmailAddress){
state.order.customer.emailAddress = customerEmailAddress;
@@ -303,13 +303,13 @@ export const actions = {
method: endpoints.LookupVinByAddress.method,
endpoint: endpoints.LookupVinByAddress.url,
payload: {
- licenseLastName: licenseLastName,
+ licenseLastName: licenseLastName,
licenseStreetAddress: licenseStreetAddress,
licenseZip: licenseZip,
licenseState: licenseState
},
});
- },
+ },
getVehicleMakes(context, { year }) {
return globalMethods.callHttpClient({
method: endpoints.GetVehicleMakes.method,
@@ -433,40 +433,56 @@ export const actions = {
});
},
- logActivity(context, { userId, sessionKey, pageName, sessionId, pageEvent, customEvent, shouldUseSessionId }) {
+ logPageView(context, { userId, sessionKey, pageName, sessionId, action, event, shouldUseSessionId }) {
var payload = {
userId: userId,
sessionKey: sessionKey,
sessionId: sessionId,
pageName: pageName,
applicationName: 'SafeliteDotCom',
+ action: action,
+ event: event,
shouldUseSessionId: shouldUseSessionId
};
- if (typeof pageEvent !== 'undefined') {
- payload.pageEvent = { action: pageEvent.action, event: pageEvent.event};
- }
-
- if (typeof customEvent !== 'undefined') {
- payload.customEvents = [{category: customEvent.category, action: customEvent.action, label: customEvent.label, value: customEvent.value}];
- }
-
return globalMethods.callHttpClient({
- method: endpoints.LogActivity.method,
- endpoint: endpoints.LogActivity.url,
+ method: endpoints.LogPageView.method,
+ endpoint: endpoints.LogPageView.url,
payload: payload,
logApiCall: false
});
},
- getExperimentsByUserForGa(context, { userId }){
+ logCustomEvent(context, { userId, sessionKey, pageName, sessionId, category, action, label, value, shouldUseSessionId }) {
+ var payload = {
+ userId: userId,
+ sessionKey: sessionKey,
+ sessionId: sessionId,
+ pageName: pageName,
+ applicationName: 'SafeliteDotCom',
+ category: category,
+ action: action,
+ label: label,
+ value: value,
+ shouldUseSessionId: shouldUseSessionId
+ };
+
return globalMethods.callHttpClient({
- method: endpoints.GetExperimentsByUserForGa.method,
- endpoint: `${endpoints.GetExperimentsByUserForGa.url}/${userId}`,
+ method: endpoints.LogCustomEvent.method,
+ endpoint: endpoints.LogCustomEvent.url,
+ payload: payload,
+ logApiCall: false
+ });
+ },
+
+ GetExperimentsByUser(context, { userId }){
+ return globalMethods.callHttpClient({
+ method: endpoints.GetExperimentsByUser.method,
+ endpoint: `${endpoints.GetExperimentsByUser.url}/${userId}`,
payload: {}
});
},
-
+
// Parts API Actions
getPartsOrQuestions(context, { carId, glassArray, zipCode, vin = '' }) {
diff --git a/src/store/store.spec.js b/src/store/store.spec.js
index e27569a6f..b1667eb4c 100644
--- a/src/store/store.spec.js
+++ b/src/store/store.spec.js
@@ -617,7 +617,7 @@ describe("Actions", () => {
expect(commit).toBeCalledWith(storeMutations.UPDATE_REFERRAL_CORRELATION_ID, "xxx-xxx-xxx");
});
- it("logActivity action, should return nothing", async () => {
+ it("logPageView action, should return nothing", async () => {
// Arrange
const context = state;
@@ -626,12 +626,26 @@ describe("Actions", () => {
event: "ENTRY",
}
- var customEvent = [{
+ // Act
+ globalMethods.callHttpClient.mockImplementation(() => {
+ return Promise.resolve({ });
+ });
+
+ // Assert
+ const response = await actions.logPageView(context, { userId: "userId", sessionKey: "sessionKey", pageName: "pageName", sessionId: "sessionId", pageEvent: pageEvent, shouldUseSessionId: true });
+ expect(response).toEqual({});
+ });
+
+ it("logCustomEvent action, should return nothing", async () => {
+
+ // Arrange
+ const context = state;
+ var customEvent = {
category: "tstCat",
action: "click",
label: "damage",
value: "psych"
- }];
+ };
// Act
globalMethods.callHttpClient.mockImplementation(() => {
@@ -639,7 +653,7 @@ describe("Actions", () => {
});
// Assert
- const response = await actions.logActivity(context, { userId: "userId", sessionKey: "sessionKey", pageName: "pageName", sessionId: "sessionId", pageEvent: pageEvent, customEvent: customEvent, shouldUseSessionId: true });
+ const response = await actions.logCustomEvent(context, { userId: "userId", sessionKey: "sessionKey", pageName: "pageName", sessionId: "sessionId", customEvent: customEvent, shouldUseSessionId: true });
expect(response).toEqual({});
});
diff --git a/vue.config.js b/vue.config.js
index 99c9cd754..6ddcd54de 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -4,6 +4,7 @@ process.env.VUE_APP_HERITAGE_FUNNEL =
"http://localhost:38000/default.aspx";
process.env.VUE_APP_GOOGLE_PLACES_API_KEY =
"AIzaSyDptGCkOPgN2uWJOy4ou4M33phRD4MAoJo";
+process.env.VUE_APP_CURRENT_ENVIRONMENT = "Localhost";
// GA & GTM
process.env.VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY = "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl+ '>m_auth=amlAYNhxUxuskQo7jmjadg>m_preview=env-38>m_cookies_win=x';f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-M6XCRH');";
diff --git a/vue.release.config.js b/vue.release.config.js
index 8c705b074..ad2732e41 100644
--- a/vue.release.config.js
+++ b/vue.release.config.js
@@ -1,6 +1,7 @@
process.env.VUE_APP_CONSUMER_CF_DISTRO = "__VUE_APP_CONSUMER_CF_DISTRO__";
process.env.VUE_APP_GOOGLE_PLACES_API_KEY = "__VUE_APP_GOOGLE_PLACES_API_KEY__";
process.env.VUE_APP_HERITAGE_FUNNEL = "__VUE_APP_HERITAGE_FUNNEL__";
+process.env.VUE_APP_CURRENT_ENVIRONMENT = "__VUE_APP_CURRENT_ENVIRONMENT__";
// GA & GTM
process.env.VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY = "__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__";