From 3f4e6ebf3aa464d25cab1e0d002d1413bb91cce0 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Fri, 26 Jun 2026 22:13:34 -0400 Subject: [PATCH 1/6] INSR-10111: Get carrier phone number earlier, add CMS helper for phone# --- src/constants/dynamic-strings.js | 3 ++- src/helpers/cms-content-helper.js | 27 +++++++++++++++++++++++ src/layouts/welcome-page/welcome-page.vue | 1 + src/store/index.js | 1 - 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/constants/dynamic-strings.js b/src/constants/dynamic-strings.js index 52034987..33646dc6 100644 --- a/src/constants/dynamic-strings.js +++ b/src/constants/dynamic-strings.js @@ -5,7 +5,8 @@ const dynamicStrings = Object.freeze({ MODAL_LINK: 'modalLink', TEXT_LINK: 'textLink', EXTERNAL_LINK: 'externalLink', - PHONE_LINK: 'phoneLink' + PHONE_LINK: 'phoneLink', + PHONE_NUMBER: 'phoneNumber' }); export default dynamicStrings; diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index c8ddf306..47aade98 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -1,5 +1,6 @@ import dynamicStrings from '@/constants/dynamic-strings'; import { useMainStore } from '@/store'; +import { toDisplayPhoneNumber } from './text-helper'; /** * @function getStringWithCustomValues @@ -45,6 +46,9 @@ function processWidgetItemForReplacement(widgetModel, key) { if (widgetModel[key].includes(dynamicStrings.GLOBAL_STATE)) { widgetModel[key] = mapStringToState(widgetModel[key]); } + if (widgetModel[key].includes(dynamicStrings.PHONE_NUMBER)) { + widgetModel[key] = mapStringToPhoneNumber(widgetModel[key]); + } return widgetModel[key]; } @@ -317,6 +321,29 @@ function mapStringToState(str) { return str.trimStart(); } +/** + * @function mapStringToPhoneNumber + * @param str + */ +function mapStringToPhoneNumber(str) { + const startIndex = str.indexOf(`{${dynamicStrings.PHONE_NUMBER}`); + console.log('startIndex', startIndex); + console.log('str', str); + let textToReplace = str.substring(startIndex, str.length); + textToReplace = textToReplace.substring(0, textToReplace.indexOf('}') + 1); + console.log('textToReplace', textToReplace); + const phoneNumber = textToReplace.substring( + dynamicStrings.PHONE_NUMBER.length + 2, + textToReplace.length - 1 + ); + console.log('phoneNumber', phoneNumber); + const displayPhoneNumber = toDisplayPhoneNumber(phoneNumber); + + const returnVal = str.replace(textToReplace, displayPhoneNumber); + + return returnVal; +} + /** * @function getStoreValueFromString * @param str diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 6f72d2df..b95ba858 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -232,6 +232,7 @@ export default { // Set order account number from the issConfig. mainStore.order.parentAccountNumber = mainStore.issConfig.parentAccountNumber; + mainStore.getCarrierAccountInfo(); return { mainStore }; }, diff --git a/src/store/index.js b/src/store/index.js index dee920e0..5f9742df 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -3162,7 +3162,6 @@ export const useMainStore = defineStore({ if (this.hasSubmittedOrder()) { return; } - await this.getCarrierAccountInfo(); const submittedOrder = this.order; const { experiments } = this.applicationUser; const { issConfig, hasRecalibrationPart } = this; From 1149939337c30343384b36be3b77c3899c93fe71 Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Mon, 29 Jun 2026 10:22:14 -0400 Subject: [PATCH 2/6] INSR-10111: Address various Copilot comments - Add unit tests for mapStringToPhoneNumber function - Remove console.log from mapStringToPhoneNumber function - Update welcome-page.vue to await getCarrierAccountInfo() in setup() - getCarrierAccountInfo() again when submitting order, in case of account# change - Change import for toDisplayPhoneNumber to use absolute path --- src/helpers/cms-content-helper.js | 10 ++++------ src/helpers/cms-content-helper.spec.js | 12 +++++++++++- src/layouts/welcome-page/welcome-page.vue | 4 ++-- src/store/index.js | 1 + 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index 47aade98..dae1dadb 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -1,6 +1,6 @@ import dynamicStrings from '@/constants/dynamic-strings'; import { useMainStore } from '@/store'; -import { toDisplayPhoneNumber } from './text-helper'; +import { toDisplayPhoneNumber } from '@/helpers/text-helper'; /** * @function getStringWithCustomValues @@ -325,18 +325,16 @@ function mapStringToState(str) { * @function mapStringToPhoneNumber * @param str */ -function mapStringToPhoneNumber(str) { +export function mapStringToPhoneNumber(str) { const startIndex = str.indexOf(`{${dynamicStrings.PHONE_NUMBER}`); - console.log('startIndex', startIndex); - console.log('str', str); + let textToReplace = str.substring(startIndex, str.length); textToReplace = textToReplace.substring(0, textToReplace.indexOf('}') + 1); - console.log('textToReplace', textToReplace); + const phoneNumber = textToReplace.substring( dynamicStrings.PHONE_NUMBER.length + 2, textToReplace.length - 1 ); - console.log('phoneNumber', phoneNumber); const displayPhoneNumber = toDisplayPhoneNumber(phoneNumber); const returnVal = str.replace(textToReplace, displayPhoneNumber); diff --git a/src/helpers/cms-content-helper.spec.js b/src/helpers/cms-content-helper.spec.js index a69a10c5..a6a4338d 100644 --- a/src/helpers/cms-content-helper.spec.js +++ b/src/helpers/cms-content-helper.spec.js @@ -1,4 +1,4 @@ -import { getStringWithCustomValues } from '@/helpers/cms-content-helper.js'; +import { getStringWithCustomValues, mapStringToPhoneNumber } from '@/helpers/cms-content-helper.js'; describe('getStringWithCustomValues', () => { test.each([ @@ -16,3 +16,13 @@ describe('getStringWithCustomValues', () => { expect(getStringWithCustomValues(str, customValueMap)).toBe(expected); }); }); + +describe('mapStringToPhoneNumber', () => { + test.each([ + ['{phoneNumber:1234567890}', '123-456-7890'], + ['{phoneNumber:12345678901}', '1-234-567-8901'], + ['{phoneNumber:123}', ''], + ])('mapStringToPhoneNumber(%s) should return %s', (str, expected) => { + expect(mapStringToPhoneNumber(str)).toBe(expected); + }); +}); diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index b95ba858..9e082e27 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -227,12 +227,12 @@ export default { vm.checkContinueFromCookie(); }); }, - setup() { + async setup() { const mainStore = useMainStore(); // Set order account number from the issConfig. mainStore.order.parentAccountNumber = mainStore.issConfig.parentAccountNumber; - mainStore.getCarrierAccountInfo(); + await mainStore.getCarrierAccountInfo(); return { mainStore }; }, diff --git a/src/store/index.js b/src/store/index.js index 5f9742df..dee920e0 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -3162,6 +3162,7 @@ export const useMainStore = defineStore({ if (this.hasSubmittedOrder()) { return; } + await this.getCarrierAccountInfo(); const submittedOrder = this.order; const { experiments } = this.applicationUser; const { issConfig, hasRecalibrationPart } = this; From 87e04ad178dfdc75794f035030a82306a4d30fda Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Mon, 29 Jun 2026 13:00:06 -0400 Subject: [PATCH 3/6] INSR-10111: More fixes/suggestions - Setup on welcome page no longer async - Fix welcome pageunit tests to properly mock getCarrierAccountInfo --- src/global-methods.js | 6 ++- src/layouts/welcome-page/welcome-page.spec.js | 40 +++---------------- src/layouts/welcome-page/welcome-page.vue | 4 +- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/global-methods.js b/src/global-methods.js index 99820301..474fb279 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -63,7 +63,7 @@ export default { return new Promise((resolve, reject) => { const store = useMainStore(); const currentPageName = this.getPageNameByQueryString().toLowerCase(); - const cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; + let cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; const payloadAndAnalyticsData = { ...payload, AppName: 'ISS' }; const sessionKey = getSessionKeyValue(); const headers = { @@ -75,6 +75,10 @@ export default { [headerKeys.SESSION_SEQUENCE_NUMBER]: sessionKey }; + console.log(`Making API call to ${endpoint} with method ${method}`); + if (endpoint.toLowerCase().includes(endpoints.RegisterClaim.url.toLowerCase())) + cfDistroUrl = "https://localhost:7249/"; + const url = cfDistroUrl + endpoint; axios({ method, diff --git a/src/layouts/welcome-page/welcome-page.spec.js b/src/layouts/welcome-page/welcome-page.spec.js index 39fd8284..05e35b8a 100644 --- a/src/layouts/welcome-page/welcome-page.spec.js +++ b/src/layouts/welcome-page/welcome-page.spec.js @@ -83,6 +83,11 @@ function setupMocks({ fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); const mountOptions = getMountOptions(mockDataMountOptions); + useMainStore().getCarrierAccountInfo = jest.fn().mockImplementation(() => Promise.resolve({ + data: { + phoneNumber: '1234567890' + } + })); const wrapper = shallowMount(welcomePage, mountOptions); @@ -91,39 +96,6 @@ function setupMocks({ return { wrapper, apiPromise }; } -function getMountedComponent(mainInitialState = {}, initialData = {}) { - const mountOptions = getMountOptions({ - router: { - navigate: jest.fn() - } - }); - - mountOptions.global.stubs = { - siteHeader: true, - recalModal: true, - contentGroupModal: true, - alert: true - }; - mountOptions.global.plugins = [createTestingPinia({ - initialState: { - main: mainInitialState - } - })]; - mountOptions.data = () => ( - initialData - ); - - const apiResponses = { - supportingItems: [] - }; - const apiPromise = Promise.resolve(apiResponses); - settleAllPromises.mockImplementation(() => apiPromise); - fetchCmsContentForPage.mockImplementation(() => Promise.resolve()); - - const wrapper = shallowMount(welcomePage, mountOptions); - return { wrapper }; -} - describe('welcome-page.vue', () => { test('Should render welcomePage sub-components (policyNumber, policyZipCode, dateOfLoss, damageCause etc.)', async () => { // Arrange @@ -180,7 +152,7 @@ describe('navigation', () => { describe('When zip code check succeeds', () => { test('if duplicates found, navigate to duplicate check page', async () => { // Arrange - const { wrapper } = getMountedComponent({}); + const { wrapper } = setupMocks({}); useMainStore().getDuplicateReferrals = jest.fn().mockImplementation(() => Promise.resolve({})); useMainStore().applicationUser.duplicateOrders = [{ test: 'a' }]; wrapper.vm.mainStore.validateZip = jest.fn().mockImplementation(() => Promise.resolve({ diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 9e082e27..39b162bc 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -227,12 +227,12 @@ export default { vm.checkContinueFromCookie(); }); }, - async setup() { + setup() { const mainStore = useMainStore(); // Set order account number from the issConfig. mainStore.order.parentAccountNumber = mainStore.issConfig.parentAccountNumber; - await mainStore.getCarrierAccountInfo(); + mainStore.getCarrierAccountInfo().catch((error) => console.error(`Error in getCarrierAccountInfo ${error}`)); return { mainStore }; }, From d106ebb9d7fe213fe8b45d3232436c6d5fabda3c Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Mon, 29 Jun 2026 13:04:36 -0400 Subject: [PATCH 4/6] INSR-10111: Use regex in mapStringToPhoneNumber --- src/helpers/cms-content-helper.js | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index dae1dadb..998438f8 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -326,20 +326,9 @@ function mapStringToState(str) { * @param str */ export function mapStringToPhoneNumber(str) { - const startIndex = str.indexOf(`{${dynamicStrings.PHONE_NUMBER}`); - - let textToReplace = str.substring(startIndex, str.length); - textToReplace = textToReplace.substring(0, textToReplace.indexOf('}') + 1); - - const phoneNumber = textToReplace.substring( - dynamicStrings.PHONE_NUMBER.length + 2, - textToReplace.length - 1 - ); - const displayPhoneNumber = toDisplayPhoneNumber(phoneNumber); - - const returnVal = str.replace(textToReplace, displayPhoneNumber); - - return returnVal; + // Expected token format: {phoneNumber:##########} (or 11 digits). + const regexExp = new RegExp(`\\{${dynamicStrings.PHONE_NUMBER}:([^{}]*?)\\}`, 'g'); + return str.replace(regexExp, (_match, phoneNumber) => toDisplayPhoneNumber(phoneNumber)); } /** From 27df36a1a71b76acebebb123f706461971ce5fea Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Mon, 29 Jun 2026 13:08:29 -0400 Subject: [PATCH 5/6] INSR-10111: Undo accidentally unstashed change --- src/global-methods.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/global-methods.js b/src/global-methods.js index 474fb279..99820301 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -63,7 +63,7 @@ export default { return new Promise((resolve, reject) => { const store = useMainStore(); const currentPageName = this.getPageNameByQueryString().toLowerCase(); - let cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; + const cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; const payloadAndAnalyticsData = { ...payload, AppName: 'ISS' }; const sessionKey = getSessionKeyValue(); const headers = { @@ -75,10 +75,6 @@ export default { [headerKeys.SESSION_SEQUENCE_NUMBER]: sessionKey }; - console.log(`Making API call to ${endpoint} with method ${method}`); - if (endpoint.toLowerCase().includes(endpoints.RegisterClaim.url.toLowerCase())) - cfDistroUrl = "https://localhost:7249/"; - const url = cfDistroUrl + endpoint; axios({ method, From 3a4083a9fc646a3483fe98b8440969acda6b8ced Mon Sep 17 00:00:00 2001 From: Alex Humphries Date: Mon, 29 Jun 2026 13:21:57 -0400 Subject: [PATCH 6/6] INSR-10111: Fix error handling, better phone regex --- src/helpers/cms-content-helper.js | 7 +++++-- src/layouts/welcome-page/welcome-page.vue | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/helpers/cms-content-helper.js b/src/helpers/cms-content-helper.js index 998438f8..0f7eb8c3 100644 --- a/src/helpers/cms-content-helper.js +++ b/src/helpers/cms-content-helper.js @@ -327,8 +327,11 @@ function mapStringToState(str) { */ export function mapStringToPhoneNumber(str) { // Expected token format: {phoneNumber:##########} (or 11 digits). - const regexExp = new RegExp(`\\{${dynamicStrings.PHONE_NUMBER}:([^{}]*?)\\}`, 'g'); - return str.replace(regexExp, (_match, phoneNumber) => toDisplayPhoneNumber(phoneNumber)); + const regexExp = new RegExp(`\\{${dynamicStrings.PHONE_NUMBER}:([^}]*)\\}`, 'g'); + return str.replace(regexExp, (_match, rawValue) => { + const digits = (rawValue.match(/\d+/g) ?? []).join(''); + return toDisplayPhoneNumber(digits); + }); } /** diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index 39b162bc..92ddeab2 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -232,7 +232,7 @@ export default { // Set order account number from the issConfig. mainStore.order.parentAccountNumber = mainStore.issConfig.parentAccountNumber; - mainStore.getCarrierAccountInfo().catch((error) => console.error(`Error in getCarrierAccountInfo ${error}`)); + mainStore.getCarrierAccountInfo().catch((error) => console.error('Error in getCarrierAccountInfo', error)); return { mainStore }; },