diff --git a/src/fmg-components/promo-modal-question/promo-modal-question.vue b/src/fmg-components/promo-modal-question/promo-modal-question.vue index e0b1a8884..dd64321bb 100644 --- a/src/fmg-components/promo-modal-question/promo-modal-question.vue +++ b/src/fmg-components/promo-modal-question/promo-modal-question.vue @@ -99,7 +99,7 @@ export default { props: { modelValue: Object, modalWidgetName: String, - availableVaps: Object, + addableVaps: Object, pageName: String, taxPromos: { type: Boolean, @@ -186,14 +186,14 @@ export default { resetModalButtonStyle() { this.modal.resetButtonStyle(); }, - async getPromoCodeData(promoCode, lineItems, availableVaps, pageNameToLog = null) { + async getPromoCodeData(promoCode, lineItems, addableVaps, pageNameToLog = null) { const pageName = pageNameToLog ?? this.$options?.name; const promoValidationResponse = await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, { promoCode: promoCode, lineItemsToUse: lineItems, - addableVaps: availableVaps, + addableVaps: addableVaps, }, pageName, false @@ -258,7 +258,7 @@ export default { const promoCodeData = await this.getPromoCodeData( this.promoCode, this.lineItems, - this.availableVaps, + this.addableVaps, this.pageName ); if (promoCodeData.isValid) { @@ -292,7 +292,7 @@ export default { ); const taxedVaps = mapTaxedLineItemsToStoreFormat( taxedLineItems, - this.availableVaps + this.addableVaps ); const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index c1dd44145..27093cfdf 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -29,7 +29,7 @@ :availableLineItems="availableLineItems" :isInsuranceSelected="isInsuranceSelected" @vapsItemsSelected="vapsItemsSelectedAction" - :activePromos="allActivePromos" + :activePromos="lineItems.promos" v-on="{ 'buttonEvent.openModal': openModalAction }" validationRules="option-required" isRequired /> @@ -42,7 +42,7 @@ @@ -86,6 +86,7 @@ import baseMixin from "@/mixins/base-mixin.js"; import vehicleQuestionsMixin from "../../mixins/vehicle-questions-mixin"; import { settleAllPromises } from "@/helpers/layout-helper"; import { storeActions } from "@/constants/store-actions"; +import { deepClone } from "@/helpers/object-helper"; import store from "@/store"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { required } from "@/helpers/validation-rules"; @@ -149,7 +150,8 @@ export default { ]; const resultMap = await settleAllPromises(promiseResultMap); - const lineItems = store.getters.order.lineItems; + const lineItems = deepClone(store.getters.order.lineItems); + lineItems.vaps = lineItems.vaps ?? []; const nullSafeGlassParts = lineItems.glassParts ?? []; const availableLineItems = [ resultMap.rainDefense, @@ -172,30 +174,29 @@ export default { resultMap.supportingItems, false ); + lineItems.supportingItems = resultMap.supportingItems; + const addableVaps = [...resultMap.wipers, resultMap.rainDefense]; // Promo logic // Populate the previous state of promos for toast message usage in "next()" - const availableVaps = [...resultMap.wipers, resultMap.rainDefense]; const oldActivePromos = store.getters.lineItems.promos?.slice(0); const oldInactivePromos = store.getters.order.payment.inactivePromos?.slice(0); const promoCodeFromQueryString = getQuerystringParameter(queryStrings.PROMO); - const { validatePromoResponse, revalidatePromoResponse } = await revalidatePromosAndValidateQueryStringPromo( promoCodeFromQueryString, pricingResults, "quote" ); - lineItems.glassParts = nullSafeGlassParts; - lineItems.promos = lineItems.promos ?? []; - lineItems.vaps = lineItems.vaps ?? []; + // Sync local promos with any new promos added by validate/revalidate + lineItems.promos = store.getters.lineItems.promos ?? []; // End of promo logic // Call the "next" function to complete the transition to this page. next((vm) => { vm.setCmsContent(resultMap.cmsContent); - vm.availableVaps = availableVaps; + vm.addableVaps = addableVaps; vm.lineItems = lineItems; vm.availableLineItems = pricingResults; vm.isInsuranceSelected = vm.getDefaultIsInsuranceSelectedValue(vm.availableLineItems); @@ -225,13 +226,10 @@ export default { isInsuranceSelected: null, availableLineItems: null, lineItems: [], - availableVaps: [], + addableVaps: [], }; }, computed: { - allActivePromos() { - return this.lineItems.promos ?? []; - }, lineItemsCloneForWatcher() { return Object.assign({}, this.lineItems); }, @@ -304,7 +302,7 @@ export default { this.$store.getters.order.payment.parentAccountNumber != applicationConfig.CASH_PARENT_ACCOUNT_NUMBER ) { - this.supportingItems = this.filterOutFees(this.supportingItems); + this.lineItems.supportingItems = this.filterOutFees(this.lineItems.supportingItems); } if (this.lineItems.glassParts?.length > 0) { @@ -320,7 +318,6 @@ export default { storeActions.SAVE_ACTIVE_AND_OR_INACTIVE_PROMOS, { activePromos: this.lineItems.promos, - inactivePromos: this.$store.getters.order.payment.inactivePromos, }, false );