diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index b9cb3ba3..153e97a8 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -89,9 +89,8 @@ import { import settleAllPromises from '@/helpers/layout-helper'; import showIssLoadingModal from '@/helpers/loading-modal-helper.js'; import { - getProviderData, - getZipCodeData, - onProviderChanged + getPricedMobileFeePart, + getZipCodeData } from '@/helpers/service-location-helper'; import { Form } from 'vee-validate'; import BaseFormMixin from '@/mixins/base-form-mixin.js'; @@ -225,9 +224,16 @@ export default { async beforeRouteEnter(to, from, next) { // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.issPage); - const { isMobileAppointment, storeServiceLocation, storeSelectedProvider, serviceZipCode } = getProviderData(); + const storeServiceLocation = useMainStore().order.serviceLocation; + const storeSelectedAppointmentType = storeServiceLocation?.appointmentType; + const isMobileAppointment = storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE + || storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP; + const storeSelectedProvider = storeServiceLocation?.provider; + const serviceZipCode = storeServiceLocation?.zipCode || useMainStore().order.customer.address.zipCode; const zipCodeData = getZipCodeData(serviceZipCode); + const mobileFeePartPromise = getPricedMobileFeePart(serviceZipCode); const serviceabilityDetailsPromise = useMainStore().getServiceabilityDetails(serviceZipCode); + const getGlassFeesPromise = useMainStore().getGlassFees(); const providersPromise = useMainStore().getSafeliteProviders(serviceZipCode, 150); const premiumFeePromise = useMainStore().getMobilePremiumFee(); @@ -244,6 +250,14 @@ export default { resultKey: 'cmsContent', promise: cmsContentPromise }, + { + resultKey: 'mobileFeePart', + promise: mobileFeePartPromise + }, + { + resultKey: 'glassFees', + promise: getGlassFeesPromise + }, { resultKey: 'serviceabilityDetails', promise: serviceabilityDetailsPromise @@ -256,10 +270,6 @@ export default { resultKey: 'providers', promise: providersPromise }, - { - resultKey: 'providerChanged', - promise: onProviderChanged() - }, { resultKey: 'premiumFeeWithPrice', promise: premiumFeeWithPricePromise @@ -321,6 +331,7 @@ export default { inShopDatesData: [], isMobileView: false, mobileDatesData: [], + mobileFeePart: null, mobilePremiumAppointmentFee: null, mobileProviderNumber: null, selectableDatesData: [], @@ -647,9 +658,7 @@ export default { } }, mobileZipUpdatedFromServiceLocation(mobileZipServiceLocation) { - if (mobileZipServiceLocation - && (this.mobileProviderNumber !== mobileZipServiceLocation.mobileProviderNumber - || !this.hasNeededServiceLocationData)) { + if (mobileZipServiceLocation) { this.mobileProviderNumber = mobileZipServiceLocation.mobileProviderNumber; this.selectedMobileZipCode = mobileZipServiceLocation.zipCode; this.selectedServiceLocation = mobileZipServiceLocation; @@ -661,18 +670,22 @@ export default { }, async providerChangedFromServiceLocation(newProvider) { this.selectedProvider = newProvider?.provider; - if (newProvider?.provider) { - this.mainStore.updateServiceLocation(newProvider); + if (newProvider?.refreshDatePicker && newProvider.provider) { + this.mainStore.updateServiceLocationProvider(newProvider.provider); + showIssLoadingModal(true); - await onProviderChanged(); - if (newProvider.refreshDatePicker) { - await this.refreshDatePicker(); - } else { - showIssLoadingModal(false); - } + await this.mainStore.getBillToInfo(newProvider.provider?.providerNumber) + .then(() => { + this.refreshDatePicker(); + }) + .catch(() => { + console.warn('Error fetching bill to info...'); + showIssLoadingModal(false); + }); } }, async refreshDatePicker() { + console.log('refresh date picker...'); this.resetLocalFlags(); await this.getDatePickerInitialData().then((data) => { this.selectableDatesData = data.initialShopTimeSlotsResponse; @@ -700,7 +713,7 @@ export default { appointmentTypeToUse = AppointmentTypeStrings.DROP_OFF; } - this.mainStore.updateAppointmentType(appointmentTypeToUse); + await this.$refs.serviceLocation.forwardButtonAction(appointmentTypeToUse); this.mainStore.saveSchedule(this.selectedTimeSlotInfo.timeSlot); this.$router.navigate( this.navigationScenarios.CLICKED_FORWARD, diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 5b43a165..eb121d40 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -182,6 +182,7 @@ export default { isRecalibrationServiceableMobile: null, selectedAppointmentType: this.getSelectedAppointmentType(), selectedProvider: this.getSelectedProvider(), + mobileFeePart: null, mobileProviderNumber: null, zipContainsMilitaryBase: false, zipCodeCtu: null, @@ -236,7 +237,8 @@ export default { ); }, isMobile() { - return this.selectedAppointmentType === AppointmentTypeStrings.MOBILE; + return this.selectedAppointmentType === AppointmentTypeStrings.MOBILE + || this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP; }, isServiceableInshop() { if (this.isRecalibrationServiceableInshop !== null) { @@ -339,27 +341,16 @@ export default { } }, selectedProvider(newProvider, oldProvider) { - if (newProvider?.providerNumber !== oldProvider?.providerNumber) { + if (newProvider?.providerNumber !== oldProvider?.providerNumber || this.availabilityRating === null) { const appointmentIsInshop = this.isInshop; const returnedProvider = { - refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null, - state: this.state, - zipCode: this.zipCode, - zipCodeCtu: this.zipCodeCtu, - appointmentType: this.selectedAppointmentType, - provider: !this.isMobile ? newProvider : { - providerNumber: this.mobileProviderNumber, - address: { - streetAddress: null, - city: null, - state: null, - zipCode: null, - zipCodeCtu: null - } - } + provider: newProvider, + refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null }; - this.$emit('provider-changed', returnedProvider); + if (newProvider?.providerNumber !== oldProvider?.providerNumber) { + this.$emit('provider-changed', returnedProvider); + } } } }, @@ -369,6 +360,34 @@ export default { await this.setData(initialData); this.initializingData = false; }, + async forwardButtonAction(appointmentType) { + let provider = this.selectedProvider; + this.mainStore.updateMobileFee(null); + if (this.isMobile) { + if (this.mainStore.isNoComp || this.mainStore.isITAC) { + this.mainStore.updateMobileFee(this.mobileFeePart); + } + + provider = { + providerNumber: this.mobileProviderNumber, + address: { + streetAddress: null, + city: null, + state: null, + zipCode: null, + zipCodeCtu: null + } + }; + } + + this.mainStore.saveServiceLocation({ + state: this.state, + zipCode: this.zipCode, + zipCodeCtu: this.zipCodeCtu, + appointmentType: appointmentType || this.selectedAppointmentType, + provider + }); + }, openModalAction(modalName) { this.$refs[modalName].openModal(); }, @@ -446,6 +465,10 @@ export default { this.setServiceabilityDetails(initialData.serviceabilityDetails); } + if (initialData.mobileFeePart) { + this.mobileFeePart = initialData.mobileFeePart; + } + if (initialData.providers) { this.setMobileProviderNumber(initialData.providers.mobileProviderNumber); let foundMatch = false; @@ -462,12 +485,22 @@ export default { this.selectedProvider = null; } } + + if (initialData.glassFees) { + useMainStore().getCombinedQuote(initialData.glassFees) + .then((combinedQuote) => { + this.setGlassFeeItems(combinedQuote); + }); + } }, setContainsMilitaryBase(val) { if (this.zipContainsMilitaryBase !== val) { this.zipContainsMilitaryBase = val; } }, + setGlassFeeItems(newGlassFeeItems) { + this.mainStore.updateGlassFees(newGlassFeeItems); + }, setMobileProviderNumber(providerNumber) { this.mobileProviderNumber = providerNumber; }, diff --git a/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue b/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue index e292f37a..fd0b880e 100644 --- a/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue +++ b/src/layouts/schedule-page/time-slot-modal-question/time-slot-modal-question.vue @@ -426,7 +426,7 @@ export default { `+${formatAmountInDollars(getPriceOfLineItem(this.premiumAppointmentFee))}`; return { - // Unique value is required for each and the premium appoinment shares an id + // Unique value is required for each and the premium appointment shares an id value: this.addPremiumFlagToInput(timeSlotData.id), buttonLabel: this.premiumAppointmentButtonText, buttonLabelSubCopy: formattedPrice, diff --git a/src/store/index.js b/src/store/index.js index b52d619e..32ee3b69 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1865,7 +1865,6 @@ export const useMainStore = defineStore({ resetState() { Object.assign(this, getDefaultState()); }, - resetRegistrationState() { this.order.vehicle.registration.licensePlate = null; this.order.vehicle.registration.address = null; @@ -1904,14 +1903,12 @@ export const useMainStore = defineStore({ this.order.serviceLocation.state = null; this.order.serviceLocation.isVehicleProtected = null; }, - resetBailout() { this.updatePageData({ page: issPageValues.BAILOUT_PAGE, data: null }); }, - resetInsurance() { this.order.insuranceCoverage.coverageStatus = coverageStatuses.PENDING; this.order.insuranceCoverage.coverageType = coverageType.NONE;