From ec973c004178db0987488938b13cc028d36e8ec5 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Mon, 29 Jun 2026 14:34:16 -0400 Subject: [PATCH 01/11] Initial fix for duplicate check logic issues. --- src/helpers/order-helper.js | 4 +++- src/layouts/entry-page/entry-page.vue | 10 +++++++--- src/layouts/welcome-page/welcome-page.vue | 3 ++- src/router/index.js | 14 +++++++++++--- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/helpers/order-helper.js b/src/helpers/order-helper.js index cbc5c890..b10df4ae 100644 --- a/src/helpers/order-helper.js +++ b/src/helpers/order-helper.js @@ -24,7 +24,9 @@ export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitA store.setSaveSessionPromise(saveSessionPromise); - if (!store.applicationUser.savedSessionId || shouldAwaitSaveSessionQueue) { + // This should await anytime the referral number is not set, or the shouldAwaitSaveSessionQueue is set to true. + if (!store.order.referralNumber || shouldAwaitSaveSessionQueue) { + console.error('Awaiting save session promise', { shouldAwaitSaveSessionQueue, submitAfterSave, createWorkOrderNumberForPIA, bailoutOnError }); await saveSessionPromise; } } diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index bdbe78ae..783ec075 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -16,6 +16,7 @@ import showIssLoadingModal from '@/helpers/loading-modal-helper'; import applicationConfig from '@/constants/application-config'; import { toPossessive } from '@/helpers/text-helper'; import analyticsMixin from '@/mixins/analytics-mixin'; +import routerParams from '@/router/router-constants/router-params'; export default { name: 'entry-page', @@ -85,8 +86,8 @@ export default { || applicationConfig.CURRENT_ENVIRONMENT === 'Dev' || applicationConfig.CURRENT_ENVIRONMENT === 'SysTest' ) { - this.navigateForward(); - } else { + this.navigateForward(); + } else { // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history. window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`; } @@ -94,9 +95,12 @@ export default { methods: { navigateForward() { + // Har har har I think we were supposed to skip saving session here. this.$router.navigate( this.navigationScenarios.MOVE_FORWARD_ENTRY_PAGE, - this.$route + this.$route, + {}, + { [routerParams.SKIP_SAVE_SESSION]: true } ); }, parseQueryParms() { diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 6f72d2df..2776d4e1 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -370,7 +370,7 @@ export default { } } - await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }) + //await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }) this.navigateForward(); }, async configureZip() { @@ -387,6 +387,7 @@ export default { navigateForward() { if ((this.mainStore.applicationUser.duplicateOrders?.length > 0 ?? false) && !this.answeredContinueModal) { + console.error("Duplicate orders found, navigating to duplicate check page, skipping save session"); this.$router.navigate( this.navigationScenarios.CLICKED_FORWARD_WITH_DUPLICATES, this.$route, diff --git a/src/router/index.js b/src/router/index.js index 1fbe148f..ffb0f39b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -68,7 +68,7 @@ const routes = [ await GoToStartOn404(next); } - return next({name: issPageToUse, query: to.query, params: to.params}); + return next({name: issPageToUse, query: to.query, params: to.params, state: to.state}); } var routeData = []; @@ -129,7 +129,8 @@ const routes = [ next({ name: routeData[0].name, query: Object.assign(to.query, {issPage: routeData[0].name}), - params: to.params + params: to.params, + state: to.state }); return null; } @@ -195,11 +196,18 @@ router.afterEach(async (to, from) => { const shouldRunExperiments = (to.query.issPage !== issPageValues.BAILOUT_PAGE); await analyticsMixin.methods.validateSession(); + + console.error("Router parameters", { routerParams: routerParams, toState: to.state }); - const skipSaveSession = !!router.options.history.state[routerParams.SKIP_SAVE_SESSION]; + const skipSaveSession = !!( + to.state?.[routerParams.SKIP_SAVE_SESSION] + ?? router.options.history.state?.[routerParams.SKIP_SAVE_SESSION] + ); if (from.name !== undefined && !skipSaveSession && !store.hasSubmittedOrder()) { + console.error('Saving session on route change', { from: from.name, to: to.name, skipSaveSession: skipSaveSession, hasSubmittedOrder: store.hasSubmittedOrder() }); await saveSession({ bailoutOnError: from.name === issPageValues.ENTRY_PAGE}); } + console.error('Skipping saving session on route change', { from: from.name, to: to.name, skipSaveSession: skipSaveSession, hasSubmittedOrder: store.hasSubmittedOrder() }); document.title = routerTitles[to.query.issPage] || 'Safelite Solutions®'; From bee2b75253923b1dc92c2556a4f3d53b13167218 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:03:43 -0400 Subject: [PATCH 02/11] Removed non-prod logic behavior. Not sure why this was here. --- src/layouts/entry-page/entry-page.vue | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index 783ec075..012ee066 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -81,21 +81,14 @@ export default { } this.mainStore.applicationUser.coverageAttempts = 0; - if ( - applicationConfig.CURRENT_ENVIRONMENT === 'Localhost' - || applicationConfig.CURRENT_ENVIRONMENT === 'Dev' - || applicationConfig.CURRENT_ENVIRONMENT === 'SysTest' - ) { - this.navigateForward(); - } else { - // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history. - window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`; - } + + // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history. + window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`; }, methods: { navigateForward() { - // Har har har I think we were supposed to skip saving session here. + // If we use navigateForward we need to skip saving session (creating referral). this.$router.navigate( this.navigationScenarios.MOVE_FORWARD_ENTRY_PAGE, this.$route, From ef077e276fc8f73ba3cb1fa12a51684a64d98a3b Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:05:28 -0400 Subject: [PATCH 03/11] Updates. --- src/layouts/welcome-page/welcome-page.vue | 1 - src/router/index.js | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 268534e2..00f6b1d0 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -371,7 +371,6 @@ export default { } } - //await saveSession({ shouldAwaitSaveSessionQueue: true, bailoutOnError: true }) this.navigateForward(); }, async configureZip() { diff --git a/src/router/index.js b/src/router/index.js index ffb0f39b..c2245b4e 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -196,18 +196,14 @@ router.afterEach(async (to, from) => { const shouldRunExperiments = (to.query.issPage !== issPageValues.BAILOUT_PAGE); await analyticsMixin.methods.validateSession(); - - console.error("Router parameters", { routerParams: routerParams, toState: to.state }); const skipSaveSession = !!( to.state?.[routerParams.SKIP_SAVE_SESSION] ?? router.options.history.state?.[routerParams.SKIP_SAVE_SESSION] ); if (from.name !== undefined && !skipSaveSession && !store.hasSubmittedOrder()) { - console.error('Saving session on route change', { from: from.name, to: to.name, skipSaveSession: skipSaveSession, hasSubmittedOrder: store.hasSubmittedOrder() }); await saveSession({ bailoutOnError: from.name === issPageValues.ENTRY_PAGE}); } - console.error('Skipping saving session on route change', { from: from.name, to: to.name, skipSaveSession: skipSaveSession, hasSubmittedOrder: store.hasSubmittedOrder() }); document.title = routerTitles[to.query.issPage] || 'Safelite Solutions®'; From 57ec95fb2a894c42919ee07d6cb676f721ee2dcb Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:06:31 -0400 Subject: [PATCH 04/11] Removed some debugging code. --- src/helpers/order-helper.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/helpers/order-helper.js b/src/helpers/order-helper.js index b10df4ae..449f79b6 100644 --- a/src/helpers/order-helper.js +++ b/src/helpers/order-helper.js @@ -26,7 +26,6 @@ export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitA // This should await anytime the referral number is not set, or the shouldAwaitSaveSessionQueue is set to true. if (!store.order.referralNumber || shouldAwaitSaveSessionQueue) { - console.error('Awaiting save session promise', { shouldAwaitSaveSessionQueue, submitAfterSave, createWorkOrderNumberForPIA, bailoutOnError }); await saveSessionPromise; } } From 73a6ac1dcc5137c949c7565c12a8a6752488e2ec Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:14:34 -0400 Subject: [PATCH 05/11] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/layouts/welcome-page/welcome-page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 00f6b1d0..38b35558 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -387,7 +387,7 @@ export default { navigateForward() { if ((this.mainStore.applicationUser.duplicateOrders?.length > 0 ?? false) && !this.answeredContinueModal) { - console.error("Duplicate orders found, navigating to duplicate check page, skipping save session"); + // Duplicate orders found; navigating to duplicate check page and skipping save session. this.$router.navigate( this.navigationScenarios.CLICKED_FORWARD_WITH_DUPLICATES, this.$route, From b9649d91538917f357316d248174008cbd2bfa4d Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:28:04 -0400 Subject: [PATCH 06/11] Added unit test specifically for afterEach method due to its large size. --- src/router/router.afterEach.spec.js | 113 ++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/router/router.afterEach.spec.js diff --git a/src/router/router.afterEach.spec.js b/src/router/router.afterEach.spec.js new file mode 100644 index 00000000..0f1b07f4 --- /dev/null +++ b/src/router/router.afterEach.spec.js @@ -0,0 +1,113 @@ +import issPageValues from '@/router/router-constants/issPage-values'; +import routerParams from '@/router/router-constants/router-params'; + +let router; +let saveSession; +let mockAfterEachHandler; +let mockStore; + +jest.mock('vue-router', () => ({ + createWebHistory: jest.fn(() => ({ state: {} })), + createRouter: jest.fn((options) => ({ + options, + beforeEach: jest.fn(), + afterEach: jest.fn((handler) => { + mockAfterEachHandler = handler; + }), + addRoute: jest.fn(), + getRoutes: jest.fn(() => []), + hasRoute: jest.fn(() => true), + push: jest.fn(), + go: jest.fn(), + currentRoute: { value: { query: { issPage: 'welcomePage' } } } + })) +})); + +jest.mock('@/helpers/order-helper.js', () => ({ + saveSession: jest.fn(() => Promise.resolve()) +})); + +jest.mock('@/mixins/analytics-mixin', () => ({ + __esModule: true, + default: { + methods: { + validateSession: jest.fn(() => Promise.resolve()), + logDigitalConsumer: jest.fn(), + pushIssSessionData: jest.fn(), + pushPageViewToGA: jest.fn(), + pushExperimentsToDataLayer: jest.fn(), + pushOrderToDataLayer: jest.fn() + } + } +})); + +jest.mock('@/store', () => ({ + useMainStore: jest.fn(() => mockStore) +})); + +describe('Router afterEach skipSaveSession', () => { + beforeAll(() => { + router = require('@/router/').default; + ({ saveSession } = require('@/helpers/order-helper.js')); + }); + + beforeEach(() => { + mockStore = { + updateLastPageVisited: jest.fn(), + clearSaveSessionPromise: jest.fn(), + hasSubmittedOrder: jest.fn(() => false) + }; + + router.options.history.state = {}; + jest.clearAllMocks(); + }); + + it('should skip saveSession when skipSaveSession is true on to.state', async () => { + await mockAfterEachHandler( + { + name: issPageValues.WELCOME_PAGE, + query: { issPage: issPageValues.WELCOME_PAGE }, + state: { [routerParams.SKIP_SAVE_SESSION]: true } + }, + { + name: issPageValues.ENTRY_PAGE, + redirectedFrom: undefined + } + ); + + expect(saveSession).not.toHaveBeenCalled(); + }); + + it('should skip saveSession when skipSaveSession is true on history state', async () => { + router.options.history.state = { [routerParams.SKIP_SAVE_SESSION]: true }; + + await mockAfterEachHandler( + { + name: issPageValues.WELCOME_PAGE, + query: { issPage: issPageValues.WELCOME_PAGE } + }, + { + name: issPageValues.ENTRY_PAGE, + redirectedFrom: undefined + } + ); + + expect(saveSession).not.toHaveBeenCalled(); + }); + + it('should call saveSession when skipSaveSession is not present', async () => { + await mockAfterEachHandler( + { + name: issPageValues.WELCOME_PAGE, + query: { issPage: issPageValues.WELCOME_PAGE } + }, + { + name: issPageValues.ENTRY_PAGE, + redirectedFrom: undefined + } + ); + + expect(saveSession).toHaveBeenCalledTimes(1); + expect(saveSession).toHaveBeenCalledWith({ bailoutOnError: true }); + }); +}); \ No newline at end of file From 09368a32ad53e1e502018667fd1dac564a5f46f1 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:28:41 -0400 Subject: [PATCH 07/11] Removed unused reference. --- src/layouts/entry-page/entry-page.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index 012ee066..e4f73f17 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -13,7 +13,6 @@ import { validateISSClientTag, validateISSClientSignature } from '@/helpers/clie import { getISSCookie, updateOrCreateISSCookie } from '@/helpers/cookie-helper.js'; import { useMainStore } from '@/store'; import showIssLoadingModal from '@/helpers/loading-modal-helper'; -import applicationConfig from '@/constants/application-config'; import { toPossessive } from '@/helpers/text-helper'; import analyticsMixin from '@/mixins/analytics-mixin'; import routerParams from '@/router/router-constants/router-params'; From 5234905a2b8e1f737dc6dd4c558599c4a36acd3f Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:35:19 -0400 Subject: [PATCH 08/11] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/router/router.afterEach.spec.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/router/router.afterEach.spec.js b/src/router/router.afterEach.spec.js index 0f1b07f4..2a2185dc 100644 --- a/src/router/router.afterEach.spec.js +++ b/src/router/router.afterEach.spec.js @@ -53,6 +53,8 @@ describe('Router afterEach skipSaveSession', () => { beforeEach(() => { mockStore = { + applicationUser: { triggeredSiteEntry: true }, + runExperimentsForTrigger: jest.fn(() => Promise.resolve()), updateLastPageVisited: jest.fn(), clearSaveSessionPromise: jest.fn(), hasSubmittedOrder: jest.fn(() => false) From f504e4dccb549ed6a492b4cf2b162a5d9e578f93 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 30 Jun 2026 14:40:25 +0000 Subject: [PATCH 09/11] Return after GoToStartOn404 in router guard --- src/router/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/router/index.js b/src/router/index.js index c2245b4e..5d8077e5 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -65,7 +65,7 @@ const routes = [ } if (!arePagePrerequisitesValid(component)) { - await GoToStartOn404(next); + return await GoToStartOn404(next); } return next({name: issPageToUse, query: to.query, params: to.params, state: to.state}); From 340cbec043f2b6f2554f4e631cb75f7510b27e21 Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:42:40 -0400 Subject: [PATCH 10/11] Revert "Return after GoToStartOn404 in router guard" This reverts commit f504e4dccb549ed6a492b4cf2b162a5d9e578f93. --- src/router/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/router/index.js b/src/router/index.js index 5d8077e5..c2245b4e 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -65,7 +65,7 @@ const routes = [ } if (!arePagePrerequisitesValid(component)) { - return await GoToStartOn404(next); + await GoToStartOn404(next); } return next({name: issPageToUse, query: to.query, params: to.params, state: to.state}); From 97be6289992525f79cecdf7177451d8794a70ecd Mon Sep 17 00:00:00 2001 From: Jeremy-Z Date: Tue, 30 Jun 2026 10:43:52 -0400 Subject: [PATCH 11/11] Added return after 404 redirect. --- src/router/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/router/index.js b/src/router/index.js index c2245b4e..0c33cae4 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -46,6 +46,7 @@ const routes = [ if (getISSCookie() !== null && !isSavedSessionStillActive()) { // await baseMixin.methods.dispatchStoreAction(storeActions.RESET_STATE); await GoToStartOn404(next); + return null; } // Process ISS cookie. @@ -66,6 +67,7 @@ const routes = [ if (!arePagePrerequisitesValid(component)) { await GoToStartOn404(next); + return null; } return next({name: issPageToUse, query: to.query, params: to.params, state: to.state}); @@ -123,6 +125,7 @@ const routes = [ const tempMsgCopy = 'Pre Requisites failed, need to handle. Default is Welcome Page.'; const tempMsgHeadline = `${issPageToUse}: pre-req failed...`; await GoToStartOn404(next, tempMsgCopy, tempMsgHeadline); + return null; } // Assign current query string parameters, as well as our issPage one.