diff --git a/src/layouts/scheduling/scheduling.spec.js b/src/layouts/scheduling/scheduling.spec.js index 3df8ab9a1..5beea1f43 100644 --- a/src/layouts/scheduling/scheduling.spec.js +++ b/src/layouts/scheduling/scheduling.spec.js @@ -48,12 +48,13 @@ jest.mock("@/helpers/page-prerequisites-helper.js", () => ({ hasInsuranceInfo: jest.fn(() => true), })); -function setupMocks() { +function setupMocks({ isAppleBrowser = false } = {}) { const baseMixin = { methods: { getCmsContent: jest.fn(() => ""), setCmsContent: jest.fn(), getTotalLineItemPrice: jest.fn(() => 0), + isAppleBrowser: jest.fn(() => isAppleBrowser), }, }; const mountOptions = getMountOptions({ @@ -249,4 +250,40 @@ describe("scheduling.vue", () => { wrapper.unmount(); }); }); + + describe("in-shop Maps link", () => { + const address = { + city: "Lewis Center", + state: "OH", + streetAddress: "1343 Cameron Ave", + zipCode: "43035", + }; + const query = encodeURIComponent( + "safelite,Safelite Autoglass, 1343 Cameron Ave, Lewis Center, OH 43035" + ); + + test("onInshopAddressClicked opens Maps in a new tab for Google and Apple", () => { + const openSpy = jest.spyOn(window, "open").mockImplementation(() => null); + + const { wrapper } = setupMocks(); + wrapper.vm.onInshopAddressClicked({ address }); + expect(openSpy).toHaveBeenCalledWith( + `https://www.google.com/maps/search/?api=1&query=${query}`, + "_blank", + "noopener,noreferrer" + ); + wrapper.unmount(); + + openSpy.mockClear(); + const { wrapper: appleWrapper } = setupMocks({ isAppleBrowser: true }); + appleWrapper.vm.onInshopAddressClicked({ address }); + expect(openSpy).toHaveBeenCalledWith( + `https://maps.apple.com/?q=${query}`, + "_blank", + "noopener,noreferrer" + ); + appleWrapper.unmount(); + openSpy.mockRestore(); + }); + }); }); diff --git a/src/layouts/scheduling/scheduling.vue b/src/layouts/scheduling/scheduling.vue index 676ddae45..c48e41ede 100644 --- a/src/layouts/scheduling/scheduling.vue +++ b/src/layouts/scheduling/scheduling.vue @@ -130,6 +130,7 @@ const SCHEDULING_RADIO_GROUP_NAME = "schedulingTimeSlot"; const INITIAL_INSHOP_PROVIDER_COUNT = 3; const MAX_INSHOP_PROVIDERS = 9; const VIEW_MORE_SHOPS_BATCH_SIZE = 3; +const INSHOP_MAPS_PLACE_NAME = "safelite,Safelite Autoglass"; /** * Appends days from newSlots into entry.timeSlots, initializing it if absent. @@ -461,9 +462,32 @@ export default { const day = providerEntry?.timeSlots?.days?.find((d) => d.date === this.selectedDate); return day?.timeSlots ?? []; }, + buildInshopMapsQuery(address) { + const streetAddress = address?.streetAddress?.trim(); + if (!streetAddress) { + return null; + } + const street = [streetAddress, address.streetAddress2?.trim()] + .filter(Boolean) + .join(" "); + return `${INSHOP_MAPS_PLACE_NAME}, ${street}, ${address.city}, ${address.state} ${address.zipCode}`; + }, + buildInshopMapsUrl(address) { + const query = this.buildInshopMapsQuery(address); + if (!query) { + return null; + } + if (this.isAppleBrowser()) { + return `https://maps.apple.com/?q=${encodeURIComponent(query)}`; + } + return `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(query)}`; + }, onInshopAddressClicked(provider) { - // TODO: open Google Maps when address link functionality is implemented - console.log("onInshopAddressClicked", provider?.providerNumber); + const url = this.buildInshopMapsUrl(provider?.address); + if (!url) { + return; + } + window.open(url, "_blank", "noopener,noreferrer"); }, onMobileZipCodeClicked() { this.$refs.schedulingZipSearch?.focusZipInput();