diff --git a/src/helpers/cookie-helper.js b/src/helpers/cookie-helper.js index 2b93484b..bf88ace6 100644 --- a/src/helpers/cookie-helper.js +++ b/src/helpers/cookie-helper.js @@ -112,7 +112,9 @@ function setISSCookieProperties(properties) { Will update the cookie if present, or create a new one if not. */ export function updateOrCreateISSCookie() { + console.log('in cookie function'); const store = useMainStore(); + console.log(store); // Set up cookie with all the props. setISSCookieProperties({ @@ -122,7 +124,8 @@ export function updateOrCreateISSCookie() { ReferralNumber: store.order.referralNumber, ReferralDate: store.order.referralDate, ReferralCorrelationId: store.order.referralCorrelationId, - ReferralParentAccountNumber: store.order.accountNumber + ReferralParentAccountNumber: store.order.accountNumber, + SavedSessionId: store.applicationUser.savedSessionId }); } diff --git a/src/helpers/order-helper.js b/src/helpers/order-helper.js new file mode 100644 index 00000000..290b4c0e --- /dev/null +++ b/src/helpers/order-helper.js @@ -0,0 +1,60 @@ +import { useMainStore } from '@/store'; +import { updateOrCreateISSCookie } from '@/helpers/cookie-helper'; + +/* + Will call API to save existing order, or create new one depending where it's called from. + This will also set Referral information in the store after saving, and then + update the cookie. To force synchronous behavior pass in 'true' for shouldAwaitSaveSessionQueue +*/ +// encapsulate when you transition back into heritage +// we need eon from first call to get pricing +// eon is a number that some services require +// save session takes time +// not necessary for much throughout the flow +// we want each save session call to happen sequentially, but asynchronously +export async function saveSession({ shouldAwaitSaveSessionQueue = false }) { + const store = useMainStore(); + console.log('order helper'); + console.log(store); + var saveSessionPromise; + if (store.applicationUser.saveSessionPromise){ + console.log('if promise exists'); + console.log(store.applicationUser.saveSessionPromise); + + // .then returns another promise but waiting for another to finish + saveSessionPromise = store.applicationUser.saveSessionPromise + .then(() => { + console.log('then'); + return saveSessionHelper(store); + }) + .catch((error) => { + console.log("saveSessionPromise failed: " + error.message); + }); + } + else { + console.log('else'); + saveSessionPromise = saveSessionHelper(store); + } + // var saveSessionPromise = + // store.applicationUser.saveSessionPromise + // ? store.applicationUser.saveSessionPromise.then(() => { return saveSessionHelper(store); }) + // : saveSessionHelper(store); + console.log('promise exists'); + store.setSaveSessionPromise(saveSessionPromise); + console.log('set information'); + if (!store.applicationUser.savedSessionId || shouldAwaitSaveSessionQueue) { + console.log('pre await'); + await saveSessionPromise; + } + console.log('done'); +} + +/* + Encapsulates asynchronous Save Session logic inside a promise to allow for Save Session queuing +*/ +async function saveSessionHelper(store) { + console.log('helper helper called'); + const savedSessionInfo = await store.saveSession(); + store.setSaveSessionInfo(savedSessionInfo.data); + updateOrCreateISSCookie(); +} \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 6406096d..be341fbb 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -16,6 +16,7 @@ import applicationConfig from '@/constants/application-config'; import analyticsMixin from '@/mixins/analytics-mixin'; import navigationScenarios from './router-constants/navigation-scenarios'; +import { saveSession } from "@/helpers/order-helper.js"; const routes = [ { @@ -87,12 +88,18 @@ router.afterEach(async (to, from) => { const store = useMainStore(); // Update lastPageVisited in the store store.updateLastPageVisited(to.name); - await store.saveSession()?.catch(() => { - if(from.name === issPageValues.WELCOME_PAGE) { + console.log('after each'); + + await saveSession({shouldAwaitSaveSessionQueue: true}).then(() => { + console.log('then'); + }).catch((error) => { + console.log(error); + console.log("catch"); + if (from.name === issPageValues.WELCOME_PAGE) { router.navigate(navigationScenarios.SAVE_SESSION_FAILED, {query: {issPage: issPageValues.WELCOME_PAGE}}) } }); - + if (to.query.issPage !== issPageValues.ENTRY_PAGE) { // Push page view to GA analyticsMixin.methods.pushPageViewToGA(); diff --git a/src/store/index.js b/src/store/index.js index b2b9d9df..35a71604 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -109,7 +109,7 @@ const getDefaultState = () => ({ }, referralNumber: null, referralDate: null, - referralCorrelationId: null, + referralCorrelationId: '00000000-0000-0000-0000-000000000000', referralSequenceNumber: null, eon: null, workOrderNumber: null @@ -338,8 +338,6 @@ export const useMainStore = defineStore({ } }, getCoveragePolicyInfo({ accountNumber, policyNumber, dateOfLoss, zipCode }) { - // TODO: replace place holder correlationId with the real thing - const placeHolderCorrelationId = '00000000-0000-0000-0000-000000000000'; const { policy } = this.order; try { const response = globalMethods.callHttpClient({ @@ -350,7 +348,7 @@ export const useMainStore = defineStore({ policyNumber, dateOfLoss, zipCode, - correlationId: placeHolderCorrelationId + correlationId: this.order.referralCorrelationId } }).then((r) => { const responsePolicy = r.data.policies?.[0]; @@ -371,8 +369,6 @@ export const useMainStore = defineStore({ } }, registerClaim() { - // TODO: replace place holder correlationId with the real thing - const placeHolderCorrelationId = '00000000-0000-0000-0000-000000000000'; const nonNumberCharRegex = /[^0-9]/g; const { order } = this; return new Promise((resolve, reject) => { @@ -381,7 +377,7 @@ export const useMainStore = defineStore({ endpoint: endpoints.RegisterClaim.url, payload: { - correlationId: placeHolderCorrelationId, + correlationId: this.order.referralCorrelationId, accountNumber: this.issConfig.accountNumber?.toString() ?? '', insured: { firstName: this.order.customer.firstName, @@ -688,129 +684,128 @@ export const useMainStore = defineStore({ }); }, + setSaveSessionInfo(response){ + this.order.referralNumber = response.referralNumber; + this.order.referralSequenceNumber = response.referralSequenceNumber; + this.order.referralDate = response.referralDate; + this.order.referralCorrelationId = response.referralCorrelationId; + this.order.eon = response.eon; + this.order.workOrderNumber = response.workOrderNumber; + this.applicationUser.savedSessionId = response.savedSessionId; + this.applicationUser.crmCustomerId = response.crmCustomerId.toString(); + }, + saveSession() { const { vehicle, damage, policy, customer, contactInfo, payment, lineItems, serviceLocation, schedule } = this.order; const newGlassToReplace = convertGlassPieceNamingForApi(damage.glassToReplace); - return new Promise((resolve, reject) => { - globalMethods.callHttpClient({ - method: endpoints.SaveSession.method, - endpoint: endpoints.SaveSession.url, - payload: { - applicationUser: { - crmCustomerId: this.applicationUser.crmCustomerId, - experiments: this.applicationUser.experiments, - lastPage: this.applicationUser.lastPageVisited, - pageData: this.applicationUser.pageData, - savedSessionId: this.applicationUser.savedSessionId - }, - vehicle: { - year: vehicle.year, - make: vehicle.make, - model: vehicle.model, - style: vehicle.style, - vin: vehicle.vin, - carId: vehicle.carId, - licensePlateNumber: vehicle.registration?.licensePlate - }, - damage: { - numberOfChips: damage.numberOfChips, - glassToReplace: newGlassToReplace, - isRepair: damage.isRepair, - partQuestionAnswers: damage.partQuestionAnswers, - moldingQuestionAnswers: damage.moldingQuestionAnswers, - capabilityQuestionAnswers: damage.capabilityQuestionAnswers, - dateOfLoss: policy.dateOfLoss, - damageCause: policy.damageCause, - damageState: policy.damageState, - damageCity: policy.damageCity, - isDamageGlassOnly: policy.isDamageGlassOnly - }, - policy: { - policyHolder: { - policyFirstName: customer.firstName, - policyLastName: customer.lastName, - policyPhoneNumber: customer.phoneNumber, - policyEmail: customer.emailAddress - }, - policyNumber: policy.policyNumber, - policyZipCode: policy.policyZipCode, - noCoverage: policy.noCoverage, - policyLookupSuccessful: policy.policyLookupSuccessful, - originalDeductible: this.order.originalDeductible, - currentDeductible: this.order.currentDeductible - }, - customer: { - address: { - streetAddress: customer.address?.streetAddress, - streetAddress2: customer.address?.streetAddress2, - city: customer.address?.city, - state: customer.address?.state, - zipCode: customer.address?.zipCode - }, - emailAddress: contactInfo.emailAddress, - firstName: contactInfo.firstName, - lastName: contactInfo.lastName, - phoneNumber: contactInfo.phoneNumber, - optInSms: contactInfo.requestTextUpdates ?? false - }, - lineItems: { - glassParts: lineItems.glassParts, - supportingItems: lineItems.supportingItems, - vaps: lineItems.vaps - }, - payment: { - InsuranceCoverage: { - isVerified: payment.insuranceCoverage?.isVerified ?? false, - coverageStatus: payment.insuranceCoverage?.coverageStatus - }, - isInsurance: payment.isInsurance ?? true, - parentAccountNumber: this.issConfig.accountNumber - }, - serviceLocation: { - address: { - streetAddress: serviceLocation.address, - city: serviceLocation.city, - state: serviceLocation.state, - zipCode: serviceLocation.zipCode, - zipCodeCtu: serviceLocation.zipCodeCtu - }, - techNotes: contactInfo.notesForTechnician - }, - schedule: { - date: schedule.date, - startTime: schedule.startTime, - endTime: schedule.endTime, - routeCode: schedule.routeCode, - jobMaxMinutes: schedule.jobMaxMinutes - }, - referralDate: this.order.referralDate, - referralNumber: this.order.referralNumber?.toString(), - referralCorrelationId: this.order.referralCorrelationId, - referralSequenceNumber: this.order.referralSequenceNumber, - eon: this.order.eon + return globalMethods.callHttpClient({ + method: endpoints.SaveSession.method, + endpoint: endpoints.SaveSession.url, + payload: { + applicationUser: { + crmCustomerId: this.applicationUser.crmCustomerId, + experiments: this.applicationUser.experiments, + lastPage: this.applicationUser.lastPageVisited, + pageData: this.applicationUser.pageData, + savedSessionId: this.applicationUser.savedSessionId }, - additionalSuccessEventDataHandler: (response) => - `Email provided: ${customer.emailAddress ? 'true' : 'false'}` - }).then((response) => { - if (referralNumber === null) { - this.order.referralNumber = response.referralNumber; - this.order.referralSequenceNumber = response.referralSequenceNumber; - this.order.referralDate = response.referralDate; - this.order.referralCorrelationId = response.referralCorrelationId; - this.order.eon = response.eon; - this.order.workOrderNumber = response.workOrderNumber; - this.applicationUser.savedSessionId = response.savedSessionId; - this.applicationUser.crmCustomerId = response.crmCustomerId; - } - return resolve(response); - }).catch((error) => { - return reject(error); - }); + vehicle: { + year: vehicle.year, + make: vehicle.make, + model: vehicle.model, + style: vehicle.style, + vin: vehicle.vin, + carId: vehicle.carId, + licensePlateNumber: vehicle.registration?.licensePlate + }, + damage: { + numberOfChips: damage.numberOfChips, + glassToReplace: newGlassToReplace, + isRepair: damage.isRepair, + partQuestionAnswers: damage.partQuestionAnswers, + moldingQuestionAnswers: damage.moldingQuestionAnswers, + capabilityQuestionAnswers: damage.capabilityQuestionAnswers, + dateOfLoss: policy.dateOfLoss, + damageCause: policy.damageCause, + damageState: policy.damageState, + damageCity: policy.damageCity, + isDamageGlassOnly: policy.isDamageGlassOnly + }, + policy: { + policyHolder: { + policyFirstName: customer.firstName, + policyLastName: customer.lastName, + policyPhoneNumber: customer.phoneNumber, + policyEmail: customer.emailAddress + }, + policyNumber: policy.policyNumber, + policyZipCode: policy.policyZipCode, + noCoverage: policy.noCoverage, + policyLookupSuccessful: policy.policyLookupSuccessful, + originalDeductible: this.order.originalDeductible, + currentDeductible: this.order.currentDeductible + }, + customer: { + address: { + streetAddress: customer.address?.streetAddress, + streetAddress2: customer.address?.streetAddress2, + city: customer.address?.city, + state: customer.address?.state, + zipCode: customer.address?.zipCode + }, + emailAddress: contactInfo.emailAddress, + firstName: contactInfo.firstName, + lastName: contactInfo.lastName, + phoneNumber: contactInfo.phoneNumber, + optInSms: contactInfo.requestTextUpdates ?? false + }, + lineItems: { + glassParts: lineItems.glassParts, + supportingItems: lineItems.supportingItems, + vaps: lineItems.vaps + }, + payment: { + InsuranceCoverage: { + isVerified: payment.insuranceCoverage?.isVerified ?? false, + coverageStatus: payment.insuranceCoverage?.coverageStatus + }, + isInsurance: payment.isInsurance ?? true, + parentAccountNumber: this.issConfig.accountNumber + }, + serviceLocation: { + address: { + streetAddress: serviceLocation.address, + city: serviceLocation.city, + state: serviceLocation.state, + zipCode: serviceLocation.zipCode, + zipCodeCtu: serviceLocation.zipCodeCtu + }, + techNotes: contactInfo.notesForTechnician + }, + schedule: { + date: schedule.date, + startTime: schedule.startTime, + endTime: schedule.endTime, + routeCode: schedule.routeCode, + jobMaxMinutes: schedule.jobMaxMinutes + }, + referralDate: this.order.referralDate, + referralNumber: this.order.referralNumber?.toString(), + referralCorrelationId: this.order.referralCorrelationId, + referralSequenceNumber: this.order.referralSequenceNumber, + eon: this.order.eon + }, + additionalSuccessEventDataHandler: (response) => + `Email provided: ${customer.emailAddress ? 'true' : 'false'}` }); }, + setSaveSessionPromise(promise){ + this.applicationUser.saveSessionPromise = promise; + }, + saveVehicleDamage(isWindshieldRepair, selectedGlassToReplace, selectedWindshieldChipCount) { const selectedGlassPassedInSorted = selectedGlassToReplace.slice().sort(); const isGlassToReplaceTheSame