From 39451132873ff23b7affda248ae5ceb47fd3caf5 Mon Sep 17 00:00:00 2001 From: Chloe Herd Date: Tue, 5 Mar 2024 11:19:31 -0500 Subject: [PATCH] Navigation Logic Refactor --- .../heritage-integration/navigation-helper.js | 180 ++++++------------ 1 file changed, 63 insertions(+), 117 deletions(-) diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js index da21df752..a6fdd22b2 100644 --- a/src/helpers/heritage-integration/navigation-helper.js +++ b/src/helpers/heritage-integration/navigation-helper.js @@ -12,38 +12,74 @@ import { includesWindshieldReplacement } from "@/helpers/damage-helper"; import store from "@/store"; import router from "@/router"; -/* - If the user has visited the funnel before this method will determine the bets place to - drop them so they don't start at the beginning again. This method will return 'heritage' if - the user has an existing order and they come back in from the Safelite.com CTA. -*/ export async function getPageToRouteExistingOrderTo(toRoute = {}) { - const fmgPage = getQuerystringParameter(queryStrings.FMG_PAGE.toLowerCase()); - if (fmgPage && fmgPage === fmgPageValues.SERVICE_LOCATION) { - const serviceLocationComponent = await getLazyLoadedComponent( - fmgPageValues.SERVICE_LOCATION - ); - if (serviceLocationComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.SERVICE_LOCATION; - } + const fmgQueryPage = toRoute.query[queryStrings.FMG_PAGE]; + const hasFmgQueryPage = !!fmgQueryPage; + + if (hasFmgQueryPage) { + return await getDirectNavigation(toRoute); + } else { + return await getImplicitNavigation(toRoute); + } +} + +/* + * Send the user to the specified page, except in specific scenarios. + */ +async function getDirectNavigation(toRoute) { + const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE]; + + // Override if Verified Insurance & Trying to go to vehicle + // so vehicle info cannot be overriden. + if ( + store.getters.payment.insuranceCoverage.isVerified && + fmgPageValue === fmgPageValues.VEHICLE + ) { + return fmgPageValues.VEHICLE_DAMAGE; } - // If the user is coming in via the Safelite.Com CTA - if (toRoute.query[queryStrings.START_TYPE] === "fmg") { - const latestPageRoute = await getLatestPageForRedirection(); - return latestPageRoute; - } + // Otherwise, respect navigation from query string. + return fmgPageValue; +} - // If navigating to a specific page, and that page is not part of the vin pages. - // Return that page, so that it can navigate like normal. - if (toRoute.query[queryStrings.FMG_PAGE] !== undefined && !isVinRelatedPage(toRoute)) { - return overrideYmmsDirectionIfNeeded(toRoute); - } +/* + * Determine which page in the flow the user should be sent to, based on their current order. + * General strategy: run through pages in reverse order, and select first where prerequisites are valid. + * QUOTE is the latest page to send to. + */ +async function getImplicitNavigation(toRoute) { + const vehicleDamageComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_DAMAGE); + const estimateComponent = await getLazyLoadedComponent(fmgPageValues.ESTIMATE); + const vinLookupComponent = await getLazyLoadedComponent(fmgPageValues.VIN_LOOKUP); + const partQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.PART_QUESTIONS); + const vehiclePartsComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_PARTS); + const moldingQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.MOLDING_QUESTIONS); + const capabilityQuestionsComponent = await getLazyLoadedComponent( + fmgPageValues.CAPABILITY_QUESTIONS + ); + const quoteComponent = await getLazyLoadedComponent(fmgPageValues.QUOTE); - // If this is not a direct link to a page using fmgPage, not from Safelite.com CTA or this is a vin related page. - // Get the latest page for redirection. - const latestPageRoute = await getLatestPageForRedirection(); - return latestPageRoute; + const skipVin = await skipVinLookup(); + + if (quoteComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.QUOTE; + } else if (capabilityQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.CAPABILITY_QUESTIONS; + } else if (moldingQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.MOLDING_QUESTIONS; + } else if (vehiclePartsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.VEHICLE_PARTS; + } else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.PART_QUESTIONS; + } else if (vinLookupComponent.methods.arePagePrerequisitesValid() && !skipVin) { + return fmgPageValues.VIN_LOOKUP; + } else if (estimateComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.ESTIMATE; + } else if (vehicleDamageComponent.methods.arePagePrerequisitesValid()) { + return fmgPageValues.VEHICLE_DAMAGE; + } else { + return fmgPageValues.VEHICLE; + } } /* @@ -114,96 +150,6 @@ export async function skipVinLookupNotRepair() { ); } -/* - Logic for getting the last "valid" page a user visited. -*/ -async function getLatestPageForRedirection() { - // If this is a non-CTA navigation, determine where to send the user based on page prerequisites. - // This also works if a user has a 'fmg' start_type query string but no current order. - // That shouldn't happen, but it's possible. - const vehicleDamageComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_DAMAGE); - const estimateComponent = await getLazyLoadedComponent(fmgPageValues.ESTIMATE); - const vinLookupComponent = await getLazyLoadedComponent(fmgPageValues.VIN_LOOKUP); - const partQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.PART_QUESTIONS); - const vehiclePartsComponent = await getLazyLoadedComponent(fmgPageValues.VEHICLE_PARTS); - const moldingQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.MOLDING_QUESTIONS); - const capabilityQuestionsComponent = await getLazyLoadedComponent( - fmgPageValues.CAPABILITY_QUESTIONS - ); - const quoteComponent = await getLazyLoadedComponent(fmgPageValues.QUOTE); - const serviceLocationComponent = await getLazyLoadedComponent(fmgPageValues.SERVICE_LOCATION); - const scheduleComponent = await getLazyLoadedComponent(fmgPageValues.SCHEDULE); - - const skipVin = await skipVinLookup(); - - if (!vehicleDamageComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.VEHICLE; - } else if (!estimateComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.VEHICLE_DAMAGE; - } else { - if (quoteComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.QUOTE; - } else if (capabilityQuestionsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.CAPABILITY_QUESTIONS; - } else if (moldingQuestionsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.MOLDING_QUESTIONS; - } else if (vehiclePartsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.VEHICLE_PARTS; - } else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) { - return fmgPageValues.PART_QUESTIONS; - } else if ( - // capture vin - vinLookupComponent.methods.arePagePrerequisitesValid() && - !skipVin - ) { - return fmgPageValues.VIN_LOOKUP; - } else { - // do not capture vin - return fmgPageValues.ESTIMATE; - } - } -} - -/* - Overrides functionality to go to the YMMS pages in certain cases. - If this is not one of the cases, it returns the 'to' fmgPage value. -*/ - -/* istanbul ignore next */ -function overrideYmmsDirectionIfNeeded(toRoute) { - const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE]; - - if (store.getters.payment.insuranceCoverage.isVerified) { - switch (fmgPageValue) { - case fmgPageValues.VEHICLE: { - return fmgPageValues.VEHICLE_DAMAGE; - } - default: { - return fmgPageValue; - } - } - } else { - return fmgPageValue; - } -} - -/* - Determine if the page is a vin related page. -*/ - -/* istanbul ignore next */ -function isVinRelatedPage(toRoute) { - const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE]; - - return ( - fmgPageValue === fmgPageValues.VIN_LOOKUP || - fmgPageValue === fmgPageValues.LICENSE_PLATE_LOOKUP || - fmgPageValue === fmgPageValues.ADDRESS_LOOKUP || - fmgPageValue === fmgPageValues.ADDRESS_VEHICLES || - fmgPageValue === fmgPageValues.ESTIMATE - ); -} - async function getLazyLoadedComponent(pageName) { return (await lazyLoadComponent(pageName)()).default; }