diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 08f429b5e..ef94c7b18 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -90,6 +90,10 @@ const endpoints = { url: "/parts/api/v1/parts/supporting-items", method: "POST", }, + GetAlertReasons: { + url: "/location/api/v1/location/alert-reasons", + method: "GET", + }, GetProviderLocations: { url: "/location/api/v1/location/providers", method: "GET", diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index db15e9854..3edf8bec3 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -21,6 +21,7 @@ const storeActions = { LOOKUP_VIN_BY_PLATE: "lookupVinByPlate", LOOKUP_VIN_BY_ADDRESS: "lookupVinByAddress", LOOKUP_VIN_BY_IMAGE: "lookupVinByImage", + GET_ALERT_REASONS_BY_CTU: "getAlertReasonsByCtu", GET_PARTS_OR_QUESTIONS: "getPartsOrQuestions", GET_PARTS: "getParts", GET_WIPERS: "getWipers", diff --git a/src/layouts/schedule/helpers/schedule-helper.js b/src/layouts/schedule/helpers/schedule-helper.js new file mode 100644 index 000000000..005bd4b19 --- /dev/null +++ b/src/layouts/schedule/helpers/schedule-helper.js @@ -0,0 +1,13 @@ +import { storeActions } from "@/constants/store-actions"; +import baseMixin from "@/mixins/base-mixin.js"; + +export async function getAlertReasons(ctu) { + const alertReasons = await baseMixin.methods.dispatchStoreAction( + storeActions.GET_ALERT_REASONS_BY_CTU, + { + ctu: ctu, + } + ); + + return Promise.resolve(alertReasons); +} diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 02361128c..83c3562bf 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -18,6 +18,17 @@ + + // Components +import alert from "@/ux-components/alert/alert"; import funnelHeader from "@/fmg-components/funnel-header/funnel-header"; import funnelFooter from "@/fmg-components/funnel-footer/funnel-footer"; import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header"; @@ -45,6 +57,7 @@ import datePicker from "@/digital-components/date-picker/date-picker"; import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; +import { getAlertReasons } from "@/layouts/schedule/helpers/schedule-helper"; import { doesCopyContainRouterLink, splitCopyOnCMSPlaceHolder, @@ -53,6 +66,7 @@ import { } from "@/helpers/cms-content-helper"; import { errorMessages } from "@/constants/error-messages"; import { required } from "@/helpers/validation-rules"; +import store from "@/store"; defineRule("date-required", required(errorMessages.DATE_REQUIRED)); @@ -61,6 +75,7 @@ export default { data() { return { selectedDate: null, + weatherAlerts: [], mockSelectableDatesData: [ { year: 2023, month: 4, date: 13 }, { year: 2023, month: 4, date: 14 }, @@ -79,12 +94,18 @@ export default { // Call APIs const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); + const alertReasonsPromise = getAlertReasons(store.getters.order.serviceLocation.zipCodeCtu); + // Settle promises and get results const promiseResultMap = [ { resultKey: "cmsContent", promise: cmsContentPromise, }, + { + resultKey: "alertReasons", + promise: alertReasonsPromise, + }, ]; const resultMap = await settleAllPromises(promiseResultMap); @@ -92,6 +113,7 @@ export default { // Call the "next" function to complete the transition to this page. next((vm) => { vm.setCmsContent(resultMap.cmsContent); + vm.setData(resultMap.alertReasons); }); }, computed: { @@ -102,6 +124,9 @@ export default { // Splits content when brackets are found in text so that text can be looped through and router-link can be injected when needed return this.splitCopyOnCMSPlaceHolder(this.ChangeShopLinkText); }, + displayWeatherAlert() { + return this.weatherAlerts.length > 0; + }, }, methods: { doesCopyContainRouterLink, @@ -112,9 +137,40 @@ export default { return true; // NEED TODO - WHAT ARE PAGE REQ'S FOR THIS PAGE? }, + setData(alertReasonsData) { + if (alertReasonsData) { + this.convertReasonsToCmsAlerts(alertReasonsData); + } + }, + cmsHeadlineTextFound(widgetName) { + return this.getCmsContent(widgetName, "HeadlineText") !== ""; + }, + convertReasonsToCmsAlerts(data) { + this.weatherAlerts = data.reduce((newObj, alert) => { + newObj.push({ + cmsWidgetName: `LocationAlert-${alert}`, + alertReason: alert, + }); + return newObj; + }, []); + }, + async getWeatherAlertReasons(ctu) { + await getAlertReasons(ctu) + .then((response) => { + if (response.data) { + this.convertReasonsToCmsAlerts(response.data); + } + }) + .catch(() => { + console.log("error fetching alert reasons.."); + }); + }, getAvailableDates(startDate, endDate) { return this.mockSelectableDatesData; }, + getServiceZipCtuCodeFromStore() { + return store.getters.order.serviceLocation.zipCodeCtu; + }, backButtonAction() { this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); }, @@ -123,6 +179,7 @@ export default { }, }, components: { + alert, funnelHeader, funnelFooter, funnelSubHeader, @@ -130,6 +187,7 @@ export default { loadingModal, datePicker, }, + mounted() {}, }; diff --git a/src/store/index.js b/src/store/index.js index 420248024..a61df90d6 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -681,6 +681,15 @@ export const actions = { }); }, + // Location API Actions + getAlertReasonsByCtu(context, { ctu }) { + return globalMethods.callHttpClient({ + method: endpoints.GetAlertReasons.method, + endpoint: `${endpoints.GetAlertReasons.url}/${ctu}`, + payload: {}, + }); + }, + // Misc Actions updateStoreWithSaveSessionResponse( context, @@ -974,9 +983,20 @@ export const actions = { lineItemsWithOnlyPartNumbers, "lineItems" ); + const vehicle = context.getters.vehicle; + const carId = vehicle.carId; + const damage = context.getters.damage; + const glassArray = damage.glassToReplace; + const glassArrayForPayload = convertGlassPieceNamingForApi(glassArray); return globalMethods.callHttpClient({ method: endpoints.GetServiceabilityDetails.method, - endpoint: `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&${lineItemsToSend}`, + endpoint: endpoints.GetServiceabilityDetails.url, + payload: { + zip: serviceZipCode, + lineItems: lineItemsToSend, + carId: carId, + glassPieces: glassArrayForPayload, + }, }); },