CASH-462 | Add applicationUser information to submittedState

Refactor experiment mixin
This commit is contained in:
Scott Kiener 2025-04-07 10:45:35 -04:00
parent fe666f381a
commit 14165f72fd
4 changed files with 80 additions and 37 deletions

View file

@ -0,0 +1,20 @@
export function getExperimentSettingsFromExperimentList(experimentList) {
return (
experimentList
.filter((x) => !!x.isActive)
.map((x) => x.settings)
.reduce((r, c) => Object.assign(r, c), {}) ?? {}
);
}
export function getSettingValue(settingName, experimentSettings) {
return hasSetting(settingName, experimentSettings) ? experimentSettings[settingName] : null;
}
export function hasSettingEqualTo(settingName, settingValue, experimentSettings) {
return experimentSettings[settingName] == settingValue;
}
export function hasSetting(settingName, experimentSettings) {
return Object.hasOwn(experimentSettings, settingName);
}

View file

@ -65,7 +65,7 @@
:isNoComp="isNoComp"
:isMSRFeeApplicable="isMSRFeeApplicable" />
<div class="mt-3" v-if="DisplayFosterLove">
<div class="mt-3" v-if="shouldDisplayFosterLove">
<donationBlock
cmsWidgetName="DonationWidget"
v-model="donationAmount"
@ -116,8 +116,6 @@ import { coverageStatus } from "@/constants/insurance";
import { getDisplayTextForDurationLength } from "@/helpers/duration-length-helper";
import { experimentSettings } from "@/constants/experiments";
import experimentMixin from "@/mixins/experiment-mixin.js";
import { partTypeStrings } from "@/constants/part-type-strings";
import { containsLineItemWithPartType } from "@/helpers/service-package-helper";
import { containsRecalParts } from "@/helpers/recal-helper.js";
import donationBlock from "@/experiment-components/donation-block.vue";
import { partNumberStrings } from "@/constants/part-number-strings";
@ -125,7 +123,16 @@ import { partNumberStrings } from "@/constants/part-number-strings";
export default {
name: "confirmation",
async beforeRouteEnter(to, from, next) {
// Experiments
const hasRecalPriceRemoveExperiment = await store.getters.shouldHideRecalibration;
let applicationUser = baseMixin.methods.hasSubmittedApplicationUser()
? baseMixin.methods.getSubmittedApplicationUser()
: store.getters.applicationUser;
let hasFosterLoveExperiment = experimentMixin.methods.hasSettingEqualTo(
experimentSettings.FOSTER_LOVE,
"true",
applicationUser.experiments
);
// send part question data to SPS API for logging
const orderFromStore = await deepClone(store.getters.order);
@ -213,7 +220,6 @@ export default {
if (isNoComp || isItac) {
return false;
}
return hasRecalPriceRemoveExperiment && isRecalibrationOnOrder;
};
@ -229,6 +235,7 @@ export default {
vm.vaps = availableVaps;
vm.submittedOrder = submittedOrder;
vm.shouldHideRecalibration = shouldHideRecalibration();
vm.shouldDisplayFosterLove = hasFosterLoveExperiment;
vm.donationAmount = donationAmount;
});
},
@ -238,18 +245,13 @@ export default {
vaps: [],
submittedOrder: null,
shouldHideRecalibration: null,
shouldDisplayFosterLove: null,
donationAmount: 0,
showDonationSuccess: null,
showDonationError: null,
};
},
computed: {
DisplayFosterLove() {
return experimentMixin.methods.hasSettingEqualTo(
experimentSettings.FOSTER_LOVE,
"true"
);
},
isRecalibrationOnOrder() {
return containsRecalParts(this?.lineItems);
},

View file

@ -1,17 +1,33 @@
import store from "@/store";
import * as experimentHelper from "../helpers/experiment-helper";
/*
This is a wrapper around experiment-helper.js methods that allows an override
to provide a custom list of experiments. At the time of implementation this
was necessary for checking submittedState for experiments
*/
export default {
methods: {
hasSettingEqualTo(settingName, settingValue) {
return store.getters.experimentSettings[settingName] == settingValue;
hasSettingEqualTo(
settingName,
settingValue,
experimentList = store.getters.applicationUser.experiments
) {
const experimentSettings = experimentHelper.getExperimentSettingsFromExperimentList(experimentList);
return experimentHelper.hasSettingEqualTo(
settingName,
settingValue,
experimentSettings
);
},
hasSetting(settingName) {
return Object.hasOwn(store.getters.experimentSettings, settingName);
hasSetting(settingName, experimentList = store.getters.applicationUser.experiments) {
const experimentSettings = experimentHelper.getExperimentSettingsFromExperimentList(experimentList);
return experimentHelper.hasSetting(settingName, experimentSettings);
},
getSettingValue(settingName) {
return this.hasSetting(settingName)
? store.getters.experimentSettings[settingName]
: null;
getSettingValue(settingName, experimentList = store.getters.applicationUser.experiments) {
const experimentSettings = experimentHelper.getExperimentSettingsFromExperimentList(experimentList);
return experimentHelper.getSettingValue(settingName, experimentSettings);
},
},
};

View file

@ -21,6 +21,10 @@ import {
} from "@/constants/schedule-constants";
import { getQuerystringParameter } from "@/helpers/querystring-helper";
import { deepClone } from "@/helpers/object-helper";
import {
getExperimentSettingsFromExperimentList,
hasSettingEqualTo
} from "../helpers/experiment-helper";
import { queryStrings } from "@/constants/query-strings";
import { partTypeStrings } from "@/constants/part-type-strings";
import {
@ -824,7 +828,9 @@ export const getters = {
coverageIsVerified: (state) => {
let order;
if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) {
order = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order;
order = JSON.parse(
window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)
).order;
} else {
order = state.order;
}
@ -854,29 +860,24 @@ export const getters = {
isRecalibrationOnSubmittedState: (state) => {
if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) {
return getHasRecalibrationPart({
order: JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order,
order: JSON.parse(
window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)
).order,
});
}
return false;
},
shouldHideRecalibration: (state) => {
var order;
if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) {
order = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order;
} else {
order = state.order;
state = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE));
}
let order = state.order;
let applicationUser = state.applicationUser;
if (order.payment.isInsurance) {
return false;
}
return (
experimentMixin.methods
.getSettingValue(experimentSettings.RECAL_PRICE_REMOVE)
?.toLowerCase() === "true" && getters.isRecalibrationOnOrder(state)
);
return (hasSettingEqualTo(experimentSettings.RECAL_PRICE_REMOVE, "true", getExperimentSettingsFromExperimentList(applicationUser.experiments)) && getters.isRecalibrationOnOrder(state))
},
areRearWipersOnOrder: (state) => {
return !!state.order.lineItems.vaps?.some(
@ -975,10 +976,7 @@ export const getters = {
};
},
experimentSettings: (state) =>
state.applicationUser.experiments
.filter((x) => !!x.isActive)
.map((x) => x.settings)
.reduce((r, c) => Object.assign(r, c), {}) ?? {},
getExperimentSettingsFromExperimentList(state.applicationUser.experiments),
isVerifiedAndDeductibleZeroConfirmed: (state) => {
// used in CMS on /payment-method in Header Sub Text, for FunnelSubHeaderWidget on cart pages
@ -1855,6 +1853,7 @@ export const actions = {
if (windshieldPartWithRecal) {
url += `/${windshieldPartWithRecal.partNumber}`;
}
url += "/false";
return globalMethods.callHttpClient({
method: endpoints.GetProviders.method,
@ -3273,7 +3272,10 @@ export const actions = {
const affiliateCookies = context.state.applicationUser.affiliateCookies;
// set to local storage
window.sessionStorage.setItem(sessionStorageKeyConstants.SUBMITTED_STATE, JSON.stringify(submittedState));
window.sessionStorage.setItem(
sessionStorageKeyConstants.SUBMITTED_STATE,
JSON.stringify(submittedState)
);
window.sessionStorage.setItem("createNewSessionForHeritage", true);
// clear vuex
@ -3331,7 +3333,10 @@ export const actions = {
applicationUser: submittedApplicationUser,
};
// set to local storage
window.sessionStorage.setItem(sessionStorageKeyConstants.SUBMITTED_STATE, JSON.stringify(submittedState));
window.sessionStorage.setItem(
sessionStorageKeyConstants.SUBMITTED_STATE,
JSON.stringify(submittedState)
);
},
resetSubmittedState(context) {