diff --git a/src/layouts/scheduling/scheduling.vue b/src/layouts/scheduling/scheduling.vue index a4094f6d9..bb44ee09a 100644 --- a/src/layouts/scheduling/scheduling.vue +++ b/src/layouts/scheduling/scheduling.vue @@ -197,6 +197,58 @@ function fetchMobileTimeSlots({ startDate, endDate, zipCode, pageNameToLog }) { }); } +/** + * Fetches inshop time slots (when providers are given) and mobile time slots (when requested) + * for a date range, settling both requests together. Either request is omitted entirely when + * it has no applicable providers/zip, rather than firing an empty/unnecessary call. + * @param {{ + * startDate: string, + * endDate: string, + * providerNumbers: string[], + * zipCode?: string, + * includeMobile?: boolean, + * pageNameToLog: string, + * }} params + * @returns {Promise<{ inshopTimeSlots?: any, mobileTimeSlots?: any }>} + */ +function fetchTimeSlotsBatch({ + startDate, + endDate, + providerNumbers, + zipCode, + includeMobile, + pageNameToLog, +}) { + return settleAllPromises([ + ...(providerNumbers.length + ? [ + { + resultKey: "inshopTimeSlots", + promise: fetchInshopTimeSlots({ + startDate, + endDate, + providerNumbers, + pageNameToLog, + }), + }, + ] + : []), + ...(includeMobile + ? [ + { + resultKey: "mobileTimeSlots", + promise: fetchMobileTimeSlots({ + startDate, + endDate, + zipCode, + pageNameToLog, + }), + }, + ] + : []), + ]); +} + export default { name: "scheduling", async beforeRouteEnter(to, from, next) { @@ -238,36 +290,14 @@ export default { const startDate = toDateString(0); const endDate = toDateString(SCHEDULE_FETCH_DAYS - 1); const providerNumbers = providers.map((provider) => provider.providerNumber); - const timeSlotsPromiseResultMap = [ - ...(providerNumbers.length - ? [ - { - resultKey: "inshopTimeSlots", - promise: fetchInshopTimeSlots({ - startDate, - endDate, - providerNumbers, - pageNameToLog: to.name, - }), - }, - ] - : []), - // Get the mobile time slots if a mobile provider number is available - ...(mobileProviderNumber - ? [ - { - resultKey: "mobileTimeSlots", - promise: fetchMobileTimeSlots({ - startDate, - endDate, - zipCode: serviceZipCode, - pageNameToLog: to.name, - }), - }, - ] - : []), - ]; - const timeSlotsResultMap = await settleAllPromises(timeSlotsPromiseResultMap); + const timeSlotsResultMap = await fetchTimeSlotsBatch({ + startDate, + endDate, + providerNumbers, + zipCode: serviceZipCode, + includeMobile: Boolean(mobileProviderNumber), + pageNameToLog: to.name, + }); assignInshopTimeSlotsFromV2Response( vm.inshopProvidersAndTimeSlots, timeSlotsResultMap.inshopTimeSlots @@ -398,19 +428,12 @@ export default { this.isLoadingMoreShops = true; try { - const resultMap = await settleAllPromises([ - { - resultKey: "inshopTimeSlots", - promise: fetchInshopTimeSlots({ - startDate: this.datePickerStartDate, - endDate: this.datePickerEndDate, - providerNumbers: newProviders.map( - (provider) => provider.providerNumber - ), - pageNameToLog: this.pageName, - }), - }, - ]); + const resultMap = await fetchTimeSlotsBatch({ + startDate: this.datePickerStartDate, + endDate: this.datePickerEndDate, + providerNumbers: newProviders.map((provider) => provider.providerNumber), + pageNameToLog: this.pageName, + }); assignInshopTimeSlotsFromV2Response(newEntries, resultMap.inshopTimeSlots); } finally { newEntries.forEach((entry) => { @@ -459,36 +482,14 @@ export default { ({ provider }) => provider.providerNumber ); - const promiseResultMap = [ - ...(providerNumbers.length - ? [ - { - resultKey: "inshopTimeSlots", - promise: fetchInshopTimeSlots({ - startDate: newStartDate, - endDate: newEndDate, - providerNumbers, - pageNameToLog: this.pageName, - }), - }, - ] - : []), - ...(this.mobileProviderAndTimeSlot - ? [ - { - resultKey: "mobileTimeSlots", - promise: fetchMobileTimeSlots({ - startDate: newStartDate, - endDate: newEndDate, - zipCode: this.serviceZipCode, - pageNameToLog: this.pageName, - }), - }, - ] - : []), - ]; - - const resultMap = await settleAllPromises(promiseResultMap); + const resultMap = await fetchTimeSlotsBatch({ + startDate: newStartDate, + endDate: newEndDate, + providerNumbers, + zipCode: this.serviceZipCode, + includeMobile: Boolean(this.mobileProviderAndTimeSlot), + pageNameToLog: this.pageName, + }); appendInshopTimeSlotsFromV2Response( this.inshopProvidersAndTimeSlots,