103 lines
3.3 KiB
JavaScript
103 lines
3.3 KiB
JavaScript
import { saveSession, submitBailout } from "@/helpers/heritage-integration/order-helper";
|
|
import { buildManualUrl } from "@/router/methods/helpers/build-manual-url";
|
|
import { getDestination } from "@/router/methods/helpers/get-destination";
|
|
import { savePageData } from "@/router/methods/helpers/save-page-data";
|
|
import { navigationScenarios } from "@/router/constants/navigation-scenarios";
|
|
import { routeData } from "@/router/constants/routes";
|
|
import router from "@/router";
|
|
import store from "@/store";
|
|
|
|
import { handleSoftError } from "@/router/methods/error";
|
|
|
|
async function navigate(scenario, currentPageName, withSaving = false, forceTopLevelNav = false) {
|
|
// Check to see if calling page is same as current page.
|
|
// If not, cancel navigation before it begins.
|
|
const callingRoute = currentPageName;
|
|
const actualRoute = router.currentRoute.value.name;
|
|
|
|
if (callingRoute !== actualRoute) {
|
|
return false;
|
|
}
|
|
|
|
const nextPage = getDestination(currentPageName, scenario);
|
|
|
|
if (!nextPage) {
|
|
console.error(
|
|
`Could not navigate from ${currentPageName} via scenario ${scenario}. Ensure routing table is configured correctly.`
|
|
);
|
|
|
|
const errorPayload = {
|
|
cause: "invalid page name",
|
|
currentPage: currentPageName,
|
|
nextPage: nextPage?.name,
|
|
};
|
|
|
|
await handleSoftError(errorPayload);
|
|
return;
|
|
}
|
|
|
|
if (withSaving) {
|
|
if (
|
|
store.getters?.applicationUser?.savedSessionId ||
|
|
store.getters?.order?.customer?.emailAddress
|
|
) {
|
|
if (
|
|
scenario.toUpperCase() === navigationScenarios.CLICKED_FORWARD &&
|
|
currentPageName.toUpperCase() === navigationScenarios.BAILOUT
|
|
) {
|
|
await submitBailout({ pageNameToLog: nextPage.name });
|
|
} else {
|
|
await saveSession({ pageNameToLog: nextPage.name });
|
|
}
|
|
}
|
|
}
|
|
|
|
// Some pages require manually setting the next url
|
|
// to work with iframes.
|
|
if (forceTopLevelNav) {
|
|
const newUrl = buildManualUrl(nextPage);
|
|
window.top.location.href = newUrl;
|
|
return;
|
|
}
|
|
|
|
// All other pages use router.push
|
|
router.push({
|
|
name: nextPage.name,
|
|
query: nextPage.params ?? {},
|
|
});
|
|
}
|
|
|
|
//// -- Aliases: what's actually called
|
|
|
|
export async function navigateWithoutSaving(scenario, currentPageName) {
|
|
return await navigate(scenario, currentPageName, false);
|
|
}
|
|
|
|
export async function navigateWithSaving(scenario, currentPageName) {
|
|
return await navigate(scenario, currentPageName, true);
|
|
}
|
|
|
|
export async function navigateWithPageData(scenario, currentPageName, pageData = {}) {
|
|
const nextPage = getDestination(currentPageName, scenario);
|
|
|
|
if (currentPageName === routeData.BAILOUT.name) {
|
|
const existingPageData = store.getters.pageData(routeData.BAILOUT.name) ?? {};
|
|
await savePageData(routeData.BAILOUT.name, {
|
|
...existingPageData,
|
|
...pageData,
|
|
AppName: "FixMyGlass",
|
|
});
|
|
} else {
|
|
await savePageData(nextPage.name, pageData);
|
|
}
|
|
|
|
return await navigate(scenario, currentPageName, true);
|
|
}
|
|
|
|
export async function navigateAndForceTopLevelNavigation(
|
|
scenario,
|
|
currentPageName,
|
|
saving = false
|
|
) {
|
|
return await navigate(scenario, currentPageName, saving, true);
|
|
}
|