DigitalConsumer.FixMyGlass/src/router/methods/navigate.js

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);
}