{"version":3,"file":"index-1c9c659b.js","sources":["../../../../src/scripts/coveo/modules/shingle-result-listing/swiper-image.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/shingle-swiper-inline.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/card.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/templates.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/compare-tray.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/index.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\ntype imageType = {\n media_url: string;\n hover_media_url?: string;\n alt_text: string;\n color_name?: string;\n color_id?: string;\n handleSelected: (id: string) => void;\n};\n\nexport const ShingleSwiperImage = ({\n media_url,\n hover_media_url,\n alt_text,\n color_name,\n color_id,\n handleSelected\n}: imageType) => {\n const [hover, setHover] = useState(false);\n return (\n <div className=\"color-swiper__card color-swiper__img--inline\">\n <div className=\"color-swiper__img-wrapper\">\n <img\n className=\"color-swiper__img \"\n src={hover ? hover_media_url : media_url}\n alt={alt_text}\n height=\"135\"\n width=\"135\"\n loading=\"lazy\"\n />\n </div>\n <button\n className=\"color-swiper__label link\"\n onClick={() => {\n handleSelected(color_id as string);\n }}\n onMouseEnter={() => {\n if (hover_media_url) {\n setHover(true);\n }\n }}\n onMouseLeave={() => setHover(false)}\n >\n <span>{color_name}</span>\n </button>\n </div>\n );\n};\n\nexport default ShingleSwiperImage;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Swiper as SwiperModule } from 'swiper/react';\nimport Swiper, { Navigation } from 'swiper';\nimport { SwiperSlide } from 'swiper/react';\nimport SwiperImage from './swiper-image';\nimport 'swiper/css';\nimport 'swiper/css/navigation';\nimport { useDebounce } from '../../../helpers/debounce';\nimport {\n DataLayerObject,\n ExtendedWindowType\n} from '../../../helpers/global-types';\n\ntype imageType = {\n media_url: string;\n alt_text: string;\n color_name?: string;\n color_id?: string;\n hover_media_url?: string;\n};\n\ntype ShingleSwiperInlineProps = {\n images: imageType[];\n productId: string;\n nextLabel: string;\n prevLabel: string;\n link: string;\n};\n\nexport const ShingleSwiperInline = ({\n images,\n nextLabel,\n prevLabel,\n productId,\n link\n}: ShingleSwiperInlineProps) => {\n const [swiper, setSwiper] = useState<Swiper | undefined>();\n const [swiperWidth, setSwiperWidth] = useState(0);\n const [touch, setTouch] = useState(false);\n const [shouldPushLayer, setShouldPushLayer] = useState<Swiper | null>(null);\n const [padding, setPadding] = useState(\n window.matchMedia('(max-width: 700px)').matches ? 40 : 64\n );\n const nextButton = useRef(null);\n const backButton = useRef(null);\n\n const handleSelected = (id: string) => {\n sessionStorage.setItem('selectedColor', id);\n\n window.location.href = link;\n };\n\n useEffect(() => {\n if (shouldPushLayer) {\n const interactLayer = `{\"event\":\"carousel_interaction\",\"event_action\":\"${\n touch ? 'swipe' : 'arrow click'\n }\",\"event_category\":\"content_interaction\",\"event_label\":\"${(\n shouldPushLayer.activeIndex + 1\n ).toString()} of ${shouldPushLayer.slides.length}\"}`;\n (window as ExtendedWindowType).dataLayer.push(\n JSON.parse(interactLayer) as DataLayerObject\n );\n setShouldPushLayer(null);\n }\n }, [shouldPushLayer, touch]);\n\n useEffect(() => {\n setSwiperWidth(\n (document.querySelector('.shingle-listing__results') as HTMLElement)\n ?.offsetWidth\n );\n\n if (swiper) {\n (swiper as Swiper).updateSize();\n }\n }, [swiper]);\n\n const handleSwiperLayerEvent = (swiper: Swiper) => {\n setShouldPushLayer(swiper);\n };\n\n const handleResize = useDebounce(() => {\n setSwiperWidth(\n (document.querySelector('.shingle-listing__results') as HTMLElement)\n ?.offsetWidth\n );\n\n setPadding(window.matchMedia('(max-width: 700px)').matches ? 40 : 64);\n if (swiper) {\n swiper?.updateSize();\n }\n }, 1000);\n\n useEffect(() => {\n window.addEventListener('resize', () => handleResize());\n\n return () => {\n window.removeEventListener('resize', () => handleResize());\n };\n }, []);\n return (\n <>\n <div\n className=\"color-swiper color-swiper--inline\"\n style={{\n inlineSize: `${swiperWidth - padding}px`,\n position: 'relative'\n }}\n >\n <SwiperModule\n id={`color-swiper-${productId}`}\n slidesPerView={2}\n spaceBetween={20}\n slidesOffsetBefore={20}\n slidesOffsetAfter={0}\n breakpoints={{\n 300: {\n slidesPerView: 2.2,\n slidesOffsetBefore: 24,\n spaceBetween: 12\n },\n 768: {\n slidesPerView: 4,\n slidesOffsetBefore: 0,\n spaceBetween: 0\n },\n 1440: {\n slidesPerView: 4,\n slidesOffsetBefore: 0,\n slidesOffsetAfter: 30,\n spaceBetween: 20\n },\n 1920: {\n slidesPerView: 6,\n slidesOffsetBefore: 0,\n spaceBetween: 20\n }\n }}\n navigation={{\n nextEl: nextButton.current,\n prevEl: backButton.current\n }}\n modules={[Navigation]}\n onSwiper={swiper => setSwiper(swiper)}\n onSlideChange={swiper => handleSwiperLayerEvent(swiper)}\n onTouchEnd={() => setTouch(true)}\n onMouseUp={() => setTouch(false)}\n >\n {images.map(image => (\n <SwiperSlide key={`${image.color_id}-${productId}`}>\n <SwiperImage\n key={`${image.color_id}-${productId}`}\n {...image}\n handleSelected={handleSelected}\n />\n </SwiperSlide>\n ))}\n </SwiperModule>\n <button\n ref={backButton}\n className=\"swiper-button-prev\"\n aria-label={prevLabel || 'previous slide'}\n title={prevLabel || 'previous slide'}\n ></button>\n <button\n ref={nextButton}\n className=\"swiper-button-next\"\n aria-label={nextLabel || 'next slide'}\n title={nextLabel || 'next slide'}\n ></button>\n </div>\n </>\n );\n};\n\nexport default ShingleSwiperInline;\n","import React, { useMemo } from 'react';\nimport { ShingleSwiperInline } from './shingle-swiper-inline';\nimport { CardType } from './types';\nimport { Result } from '@coveo/headless';\nimport { fieldsObject } from '../../controllers/controller';\nimport { ResultLink } from '../../components/interactive-result';\n\ntype ShingleImageType = {\n media_url: string;\n hover_media_url: string;\n alt_text: string;\n color_name?: string;\n color_id?: string;\n};\ntype ShingleCardProps = {\n nextLabel: string;\n prevLabel: string;\n shinglePageUrl: string;\n shingleHeading: string;\n shingleProductId: string;\n shingleCopy: string;\n compareLabel: string;\n bazaarReview: string;\n compareCards: CardType[];\n setCompareCards: React.Dispatch<React.SetStateAction<CardType[]>>;\n setModalFull: React.Dispatch<React.SetStateAction<boolean>>;\n shingleChildren?: Result[];\n result: Result;\n};\n\nfunction ShingleCard({\n nextLabel,\n prevLabel,\n shinglePageUrl,\n shingleHeading,\n shingleProductId,\n shingleCopy,\n bazaarReview,\n compareLabel,\n compareCards,\n setCompareCards,\n setModalFull,\n shingleChildren,\n result\n}: ShingleCardProps) {\n const handleChangeCompare = (productId: string) => {\n const cardIndex = compareCards.findIndex(\n card => card.product_id === productId\n );\n if (cardIndex === -1) {\n if (compareCards.length === 4) {\n setModalFull(true);\n } else {\n if (_shingleImages && _shingleImages.length > 0) {\n setCompareCards([\n ...compareCards,\n {\n product_id: productId,\n media_url: _shingleImages[0].media_url,\n alt_text: _shingleImages[0].alt_text,\n product_name: shingleHeading\n }\n ]);\n }\n }\n } else {\n setCompareCards(prev => {\n prev.splice(cardIndex, 1);\n return [...prev];\n });\n }\n };\n\n const _shingleImages = useMemo(\n () =>\n shingleChildren?.reduce((shingleImageArray, child) => {\n const shingleImage: ShingleImageType = {\n media_url: child.raw[fieldsObject.childImage] as string,\n alt_text: child.raw[fieldsObject.childImageAlt] as string,\n color_name: child.raw[fieldsObject.childTitle] as string,\n color_id: child.raw[fieldsObject.childProductId] as string,\n hover_media_url: child.raw[fieldsObject.childImageHover] as string\n };\n\n if (shingleImage.color_id) {\n shingleImageArray.push(shingleImage);\n }\n return shingleImageArray;\n }, [] as ShingleImageType[]),\n [shingleChildren]\n );\n\n return (\n <article className=\"shingle-card\">\n <div className=\"shingle-card__top-wrapper\">\n <div className=\"shingle-card__top-flex\">\n <ResultLink className=\"link\" link={shinglePageUrl} result={result}>\n <span>\n <h3 className=\"shingle-card__heading\">{shingleHeading}</h3>\n </span>\n </ResultLink>\n <div className=\"field field--checkbox shingle-card__compare--desktop\">\n <input\n className=\"field__checkbox-input\"\n type=\"checkbox\"\n name=\"checkbox\"\n id=\"checkbox\"\n onChange={() => handleChangeCompare(shingleProductId)}\n checked={\n compareCards.findIndex(\n object => object.product_id === shingleProductId\n ) !== -1\n }\n />\n <div className=\"field__checkbox-label-wrapper\">\n <label className=\"field__checkbox-label\" htmlFor=\"checkbox\">\n {compareLabel}\n </label>\n </div>\n </div>\n </div>\n\n <div\n className=\"shingle-card__bazaar-review\"\n dangerouslySetInnerHTML={{\n __html: bazaarReview?.replace('{prod}', shingleProductId)\n }}\n ></div>\n\n <p className=\"shingle-card__description\">{shingleCopy}</p>\n\n <div className=\"field field--checkbox shingle-card__compare--mobile\">\n <input\n className=\"field__checkbox-input\"\n type=\"checkbox\"\n name=\"checkbox\"\n id=\"checkbox\"\n onChange={() => handleChangeCompare(shingleProductId)}\n checked={\n compareCards.findIndex(\n object => object.product_id === shingleProductId\n ) !== -1\n }\n />\n <div className=\"field__checkbox-label-wrapper\">\n <label className=\"field__checkbox-label\" htmlFor=\"checkbox\">\n {compareLabel}\n </label>\n </div>\n </div>\n </div>\n {_shingleImages && _shingleImages.length > 0 && (\n <ShingleSwiperInline\n images={_shingleImages}\n productId={shingleProductId}\n nextLabel={nextLabel}\n prevLabel={prevLabel}\n link={shinglePageUrl}\n />\n )}\n </article>\n );\n}\n\nexport default ShingleCard;\n","import React from 'react';\nimport {\n buildResultTemplatesManager,\n ResultTemplate,\n Result,\n SearchEngine\n} from '@coveo/headless';\nimport { headlessEngine } from '../../engine';\nimport {\n fieldsToInclude,\n labelsObj,\n fieldsObject\n} from '../../controllers/controller';\nimport ShingleCard from './card';\nimport { CardType } from './types';\n\ntype ShingleListingResultProps = Result & {\n title: string;\n description: string;\n image: string;\n imageAlt: string;\n childResults: Result[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n additionalSettings: { [key: string]: any };\n};\n\nexport const resultTemplatesManager = buildResultTemplatesManager(\n headlessEngine as SearchEngine\n);\n\nconst ShingleListingResultTemplate: ResultTemplate = {\n conditions: [],\n fields: ['UniqueId', 'Uri', ...fieldsToInclude],\n\n content: (result: ShingleListingResultProps) => (\n <li key={result.uniqueId}>\n {result.childResults.length > 0 && (\n <ShingleCard\n nextLabel={labelsObj.nextLabel}\n prevLabel={labelsObj.prevLabel}\n compareLabel={labelsObj.compareLabel}\n shinglePageUrl={result.raw[fieldsObject.link] as string}\n shingleHeading={result.raw[fieldsObject.title] as string}\n shingleProductId={result.raw[fieldsObject.productId] as string}\n shingleCopy={result.raw[fieldsObject.description] as string}\n bazaarReview={result.additionalSettings.bazaarReview as string}\n shingleChildren={result.childResults}\n compareCards={result.additionalSettings.compareCards as CardType[]}\n setCompareCards={\n result.additionalSettings.setCards as React.Dispatch<\n React.SetStateAction<CardType[]>\n >\n }\n setModalFull={result.additionalSettings.setModalFull}\n result={result}\n />\n )}\n </li>\n )\n};\n\nresultTemplatesManager.registerTemplates(ShingleListingResultTemplate);\n","import React, { useRef, useState, useEffect, useId } from 'react';\nimport { FocusTrap, createFocusTrap } from 'focus-trap';\nimport {\n disableBodyScroll,\n clearAllBodyScrollLocks,\n BodyScrollOptions\n} from 'body-scroll-lock';\n\nimport { CardType } from './types';\n\ntype CompareTrayProps = {\n compareLabels: string;\n compareCards: CardType[];\n setCompareCards: React.Dispatch<React.SetStateAction<CardType[]>>;\n expanded: boolean;\n setExpanded: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nfunction CompareTray({\n compareLabels,\n compareCards,\n setCompareCards,\n expanded,\n setExpanded\n}: CompareTrayProps) {\n const [focusTrap, setFocusTrap] = useState<FocusTrap | null>(null);\n const accordionRef = useRef<HTMLDivElement | null>(null);\n const accordionId = useId();\n const {\n compareTrigger,\n expand,\n collapse,\n compareTitle,\n compareDescription,\n compareButton,\n compareUrl,\n clearAll,\n deselectLabel\n } = JSON.parse(compareLabels);\n\n useEffect(() => {\n if (accordionRef.current) {\n const options = {\n reserveScrollBarGap: true,\n allowTouchMove: (el: HTMLElement) => {\n return el.closest('.mobile-filters__accordion') !== null;\n }\n } as BodyScrollOptions;\n\n const trap = createFocusTrap(accordionRef.current, {\n clickOutsideDeactivates: true,\n returnFocusOnDeactivate: true,\n onActivate() {\n disableBodyScroll(document.body, options);\n },\n onDeactivate() {\n clearAllBodyScrollLocks();\n }\n });\n\n setFocusTrap(trap);\n }\n\n document.body.classList.toggle('compare-tray--fixed', true);\n return () => {\n clearAllBodyScrollLocks();\n document.body.classList.toggle('compare-tray--fixed', false);\n };\n }, []);\n\n useEffect(() => {\n document.body.style.setProperty(\n '--compare-block-size',\n accordionRef.current?.offsetHeight + 'px'\n );\n }, [accordionRef.current]);\n\n const handleDeselect = (productId: string) => {\n const cardIndex = (compareCards as CardType[]).findIndex(\n card => card.product_id === productId\n );\n if (cardIndex !== -1) {\n setCompareCards(prev => {\n prev.splice(cardIndex, 1);\n return [...prev];\n });\n }\n };\n\n const handleRedirect = () => {\n window.location.href = `${\n window.location.origin\n }${compareUrl}?ids=${compareCards.map(card => card.product_id).join(',')}`;\n };\n\n const handleExpanded = () => {\n setExpanded(!expanded);\n if (focusTrap) {\n if (expanded) {\n focusTrap.deactivate();\n } else {\n focusTrap.activate();\n }\n }\n };\n\n return (\n <div\n ref={accordionRef}\n className={`compare-tray${expanded ? ' compare-tray--expanded' : ''}`}\n >\n <button\n aria-expanded={expanded}\n id={`trigger-${accordionId}`}\n aria-controls={`panel-${accordionId}`}\n onClick={() => handleExpanded()}\n className=\"compare-tray__trigger\"\n >\n {expanded\n ? compareTitle.replace('{number}', compareCards.length)\n : compareTrigger.replace('{number}', compareCards.length)}\n <span className=\"sr-only\">{expanded ? expand : collapse}</span>\n </button>\n <div\n className=\"compare-tray__content container\"\n aria-labelledby={`trigger-${accordionId}`}\n id={`panel-${accordionId}`}\n role=\"region\"\n >\n <div className=\"row\">\n <div className=\"compare-tray__left-col\">\n <p className=\"compare-tray__description\"> {compareDescription}</p>\n <div className=\"compare-tray__cta-wrapper compare-tray__cta-wrapper--desktop\">\n <button\n onClick={() => handleRedirect()}\n className=\"btn btn--primary\"\n >\n {compareButton}\n </button>\n <button\n onClick={() => setCompareCards([])}\n className=\"btn btn--secondary\"\n >\n {clearAll}\n </button>\n </div>\n </div>\n <div className=\"compare-tray__right-col\">\n <div className=\"compare-tray__cards-grid\">\n {compareCards.map(card => (\n <div\n key={card.product_id}\n className=\"compare-tray__card-wrapper\"\n >\n <img\n className=\"compare-tray__card-img\"\n src={card.media_url}\n alt={card.alt_text}\n height=\"135\"\n width=\"135\"\n loading=\"lazy\"\n />\n <span className=\"compare-tray__card-heading\">\n {card.product_name}\n </span>\n\n <button\n className=\"compare-tray__card-cancel\"\n title={deselectLabel}\n aria-label={deselectLabel}\n onClick={() => {\n handleDeselect(card.product_id as string);\n }}\n ></button>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"compare-tray__cta-wrapper compare-tray__cta-wrapper--mobile\">\n <button\n className=\"btn btn--primary\"\n onClick={() => handleRedirect()}\n >\n {compareButton}\n </button>\n <button\n className=\"btn btn--secondary\"\n onClick={() => setCompareCards([])}\n >\n {clearAll}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nexport default CompareTray;\n","import React, { useRef, useEffect, useState } from 'react';\nimport ResultList from '../../components/result-list';\nimport { resultTemplatesManager } from './templates';\nimport { resultList, defaultQuery, facets } from '../../controllers/controller';\nimport {\n SearchEngine,\n ResultList as ResultListType,\n buildFacet,\n buildNumericFacet,\n buildNumericRange,\n loadAdvancedSearchQueryActions,\n loadSearchActions,\n loadSearchAnalyticsActions,\n Facet as FacetType,\n ContextPayload,\n Result\n} from '@coveo/headless';\nimport { headlessEngine } from '../../engine';\nimport { bindUrlManager } from '../../components/url-manager';\nimport MobileFilters from '../../components/mobile-filters';\nimport Facet from '../../components/facet';\nimport FacetBreadcrumbs from '../../components/facet-breadcrumbs';\nimport CompareTray from './compare-tray';\nimport { ShingleListingProps, CardType } from './types';\nimport Autocomplete from '../../../react-components/shingle-detail-masthead/autocomplete';\nimport {\n getStoredGeolocationData,\n getLocationByIpAddress\n} from '../../../helpers/geolocation';\nimport { CoveoContext } from '../../components/context';\nimport { ExtendedWindowType } from '../../../helpers/global-types';\nimport { shingleDetailContent } from '../../../helpers/personalize';\n\nconst facetsObj = facets.map(facet => ({\n title: facet.title,\n isWarrantiesLabel: facet.isWarrantiesLabel,\n isColor: facet.isColor,\n isPrice: facet.isPrice,\n range: facet.isPrice,\n rangeLabels:\n facet.sortCriteria === 'ascending'\n ? facet.rangeLabels\n : facet.rangeLabels?.reverse(),\n colors: facet.colors,\n controller: facet.isPrice\n ? buildNumericFacet(headlessEngine as SearchEngine, {\n options: {\n field: facet.field,\n generateAutomaticRanges: false,\n sortCriteria: facet.sortCriteria ? facet.sortCriteria : 'descending',\n numberOfValues: 999,\n currentValues: facet.rangeValues?.map(range =>\n buildNumericRange({ start: range.start, end: range.end })\n )\n }\n })\n : buildFacet(headlessEngine as SearchEngine, {\n options: {\n field: facet.field,\n filterFacetCount: true,\n numberOfValues: 999\n }\n }),\n customOrder: facet.customOrder\n}));\n\ntype ResultWithChildren = Result & {\n childResults: Result[];\n};\n\nfunction ShingleResultListing({\n labels,\n compareAppLabels,\n bazaarReview,\n searchLabels,\n searchFields,\n summaryText,\n summaryTextAddress,\n endpointColors,\n coveoContext,\n filterColor\n}: ShingleListingProps) {\n const [advancedQuery, setAdvancedQuery] = useState('');\n const labelsObj = JSON.parse(labels);\n const searchLabelsObj = JSON.parse(searchLabels);\n const searchFieldsObj = JSON.parse(searchFields);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const fullModal = useRef<HTMLDialogElement | null>(null);\n const [searchValue, setSearchValue] = useState({\n address: '',\n zip: '',\n country: ''\n });\n const [expanded, setExpanded] = useState(false);\n const [ready, setReady] = useState(false);\n const [modalFull, setModalFull] = useState(false);\n const [compareCards, setCompareCards] = useState<CardType[]>([]);\n const [colorAvailable, setColorAvailable] = useState<object | undefined>(\n undefined\n );\n const [addressError, setAddressError] = useState(false);\n const [promoCards, setPromoCards] = useState('');\n\n const handleDefaultGeolocation = async () => {\n let geolocation = { address: '', zip: '', country: '' };\n const storedData = getStoredGeolocationData();\n if (storedData) {\n geolocation = {\n address: storedData.address || '',\n zip: storedData.zip,\n country: storedData.country\n };\n (window as ExtendedWindowType).dataLayer.push({\n event_attributes: {\n zip_code: storedData.zip,\n zip_code_country: storedData.country\n },\n event: 'zip_code',\n event_category: 'geo info',\n event_action: 'zip code automatically detected'\n });\n } else {\n const maxmindData = await getLocationByIpAddress();\n if (maxmindData) {\n geolocation = {\n address: '',\n zip: maxmindData.zip,\n country: maxmindData.country\n };\n }\n }\n\n setSearchValue({\n address: geolocation.address || '',\n zip: geolocation.zip || '',\n country: geolocation.country || ''\n });\n\n setReady(true);\n };\n\n useEffect(() => {\n if (searchValue.zip !== '') {\n shingleDetailContent(searchValue.zip);\n }\n }, [searchValue]);\n\n useEffect(() => {\n const context = CoveoContext();\n if (coveoContext) {\n context?.set(JSON.parse(coveoContext) as ContextPayload);\n }\n handleDefaultGeolocation();\n\n let observer: MutationObserver;\n\n const targetNode = document.querySelector('.coveo-listing__promo-cards');\n\n if (targetNode) {\n const targetInnerHtml = targetNode.innerHTML;\n\n setPromoCards(targetInnerHtml);\n\n const config = { attributes: true, childList: true, subtree: true };\n\n const callback = (mutationList: MutationRecord[]) => {\n for (const mutation of mutationList) {\n if (mutation.type === 'childList') {\n setPromoCards(targetNode.innerHTML);\n }\n }\n };\n\n observer = new MutationObserver(callback);\n observer.observe(targetNode, config);\n }\n\n return () => {\n if (observer) observer.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (ready) {\n if (searchValue.zip !== '') {\n let _country = searchValue.country;\n if (_country.toUpperCase() === 'US') {\n _country = 'USA';\n } else if (_country.toUpperCase() === 'CA') {\n _country = 'CAN';\n }\n\n fetch(\n endpointColors\n .replace('{zipCode}', searchValue.zip.replace(' ', ''))\n .replace('{countryCode}', _country),\n {\n method: 'GET'\n }\n )\n .then(response => {\n return response.json();\n })\n .then(data => {\n setColorAvailable(data.availableColors);\n })\n .catch(error => {\n console.error('Error:', error);\n });\n } else {\n setColorAvailable([]);\n }\n }\n }, [ready, searchValue.zip]);\n\n useEffect(() => {\n if (colorAvailable !== undefined) {\n if (headlessEngine) {\n bindUrlManager(headlessEngine);\n\n let advancedQuery = '';\n\n const listOfColProd = Object.entries(colorAvailable).reduce(\n (accProdCol, product) => {\n const _product = product[0];\n const colProduct = product[1].map(\n (color: string) => `${_product}_${color}`\n );\n return [...accProdCol, ...colProduct];\n },\n [] as string[]\n );\n\n if (listOfColProd.length > 0) {\n advancedQuery = `@${filterColor}==(${listOfColProd\n .map(color => `\"${color}\"`)\n .join(',')})`;\n }\n\n if (defaultQuery) {\n advancedQuery = `${advancedQuery} ${defaultQuery}`;\n }\n\n setAdvancedQuery(advancedQuery);\n\n const advancedQuerySearchActionCreator =\n loadAdvancedSearchQueryActions(headlessEngine);\n\n headlessEngine?.dispatch(\n advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n aq: advancedQuery\n })\n );\n const { logInterfaceLoad } = loadSearchAnalyticsActions(headlessEngine);\n const { executeSearch } = loadSearchActions(headlessEngine);\n\n headlessEngine.dispatch(executeSearch(logInterfaceLoad()));\n return;\n }\n }\n }, [colorAvailable]);\n\n const filterResults = (results: Result[]) => {\n const newResults = results.map(_result => {\n const result = _result as ResultWithChildren;\n\n if (result.childResults.length > 0) {\n const childResults = result.childResults.filter(childResult => {\n if (advancedQuery.includes(searchFieldsObj.productColorId)) {\n return advancedQuery.includes(\n childResult.raw[searchFieldsObj.productColorId] as string\n );\n } else {\n return true;\n }\n });\n\n return {\n ...result,\n childResults\n };\n } else {\n return result;\n }\n });\n\n return newResults;\n };\n\n const renderFilters = (isMobile?: boolean) => {\n return (\n <div\n className={`shingle-listing__facets ${\n isMobile\n ? 'shingle-listing__facets--mobile'\n : 'shingle-listing__facets--desktop'\n }`}\n >\n {facetsObj.map(facet => {\n if (facet.isColor) {\n return (\n <Facet\n key={facet.title}\n controller={facet.controller as FacetType}\n title={facet.title}\n defaultExpanded={isMobile ? false : true}\n colors={facet.colors}\n />\n );\n }\n\n return (\n <Facet\n key={facet.title}\n controller={facet.controller as FacetType}\n title={facet.title}\n customOrder={facet.customOrder}\n warranties={facet.isWarrantiesLabel ? true : false}\n isPrice={facet.isPrice}\n rangeLabels={facet.rangeLabels}\n certificationsLabel={\n facet.isWarrantiesLabel ? facet.isWarrantiesLabel : ''\n }\n defaultExpanded={isMobile ? false : true}\n />\n );\n })}\n </div>\n );\n };\n\n useEffect(() => {\n if (modalFull) {\n fullModal.current?.showModal();\n } else {\n fullModal.current?.close();\n }\n }, [modalFull]);\n\n return (\n <div ref={containerRef} className=\"shingle-listing__wrapper row\">\n <div className=\"shingle-listing__filters\">\n <div className=\"searchbox\">\n <h2 className=\"searchbox__heading\">\n {searchLabelsObj.searchHeading}\n </h2>\n {searchLabelsObj.searchCopy && (\n <p className=\"searchbox__copy\">{searchLabelsObj.searchCopy}</p>\n )}\n <Autocomplete\n label={searchLabelsObj.searchLabel}\n name={searchLabelsObj.searchName}\n placeholder={searchLabelsObj.searchPlaceholder}\n tooltip={searchLabelsObj.searchTooltip}\n errorLabel={searchLabelsObj.errorLabel}\n clearLabel={searchLabelsObj.clearLabel}\n type=\"text\"\n error={addressError}\n setError={setAddressError}\n value={searchValue.address}\n setValue={setSearchValue}\n countries={['us', 'ca']}\n />\n </div>\n <MobileFilters\n label={labelsObj.mobileFilterBy}\n containerRef={containerRef}\n refinementLayer={true}\n >\n {renderFilters(true)}\n </MobileFilters>\n {renderFilters()}\n <div\n className=\"shingle-listing__promo-cards shingle-listing__promo-cards--desktop\"\n dangerouslySetInnerHTML={{ __html: promoCards }}\n />\n </div>\n <div className=\"shingle-listing__main\">\n <div className=\"shingle-listing__main-filters\">\n <div className=\"shingle-listing__summary\">\n <div\n className=\"query-summary\"\n dangerouslySetInnerHTML={{\n __html:\n searchValue.zip !== ''\n ? summaryTextAddress.replace('{zip}', searchValue.zip)\n : summaryText\n }}\n />\n <FacetBreadcrumbs\n clearLabel={labelsObj.clearAll}\n extraClasses=\"shingle-listing__breadcrumbs\"\n />\n </div>\n </div>\n <ResultList\n resultsCustomizer={filterResults}\n controller={resultList as ResultListType}\n additionalSettings={{\n bazaarReview: bazaarReview,\n setCards: setCompareCards,\n setModalFull: setModalFull,\n compareCards: compareCards,\n endpointColors\n }}\n className=\"shingle-listing__results\"\n resultTemplatesManager={resultTemplatesManager}\n preventFirstCall={true}\n />\n <div\n className=\"shingle-listing__promo-cards shingle-listing__promo-cards--mobile\"\n dangerouslySetInnerHTML={{ __html: promoCards }}\n />\n </div>\n {modalFull && (\n <div onClick={() => setModalFull(false)}>\n <dialog\n id=\"compare-tray-is-full\"\n className=\"modal container--no-margin\"\n ref={fullModal}\n >\n {JSON.parse(compareAppLabels).errorMessage}\n <button\n className=\"modal__close-button\"\n title={JSON.parse(compareAppLabels).closeModal}\n aria-label={JSON.parse(compareAppLabels).closeModal}\n onClick={() => setModalFull(false)}\n ></button>\n </dialog>\n </div>\n )}\n {compareCards && compareCards.length > 0 && (\n <CompareTray\n compareLabels={compareAppLabels}\n compareCards={compareCards}\n setCompareCards={setCompareCards}\n expanded={expanded}\n setExpanded={setExpanded}\n />\n )}\n </div>\n );\n}\n\nexport default ShingleResultListing;\n"],"names":["ShingleSwiperImage","media_url","hover_media_url","alt_text","color_name","color_id","handleSelected","hover","setHover","useState","React","ShingleSwiperInline","images","nextLabel","prevLabel","productId","link","swiper","setSwiper","swiperWidth","setSwiperWidth","touch","setTouch","shouldPushLayer","setShouldPushLayer","padding","setPadding","nextButton","useRef","backButton","id","useEffect","interactLayer","_a","handleSwiperLayerEvent","handleResize","useDebounce","SwiperModule","Navigation","image","SwiperSlide","SwiperImage","ShingleCard","shinglePageUrl","shingleHeading","shingleProductId","shingleCopy","bazaarReview","compareLabel","compareCards","setCompareCards","setModalFull","shingleChildren","result","handleChangeCompare","cardIndex","card","_shingleImages","prev","useMemo","shingleImageArray","child","shingleImage","fieldsObject","ResultLink","object","resultTemplatesManager","buildResultTemplatesManager","headlessEngine","ShingleListingResultTemplate","fieldsToInclude","labelsObj","CompareTray","compareLabels","expanded","setExpanded","focusTrap","setFocusTrap","accordionRef","accordionId","useId","compareTrigger","expand","collapse","compareTitle","compareDescription","compareButton","compareUrl","clearAll","deselectLabel","options","el","trap","createFocusTrap","disableBodyScroll","clearAllBodyScrollLocks","handleDeselect","handleRedirect","handleExpanded","facetsObj","facets","facet","buildNumericFacet","_b","range","buildNumericRange","buildFacet","ShingleResultListing","labels","compareAppLabels","searchLabels","searchFields","summaryText","summaryTextAddress","endpointColors","coveoContext","filterColor","advancedQuery","setAdvancedQuery","searchLabelsObj","searchFieldsObj","containerRef","fullModal","searchValue","setSearchValue","ready","setReady","modalFull","colorAvailable","setColorAvailable","addressError","setAddressError","promoCards","setPromoCards","handleDefaultGeolocation","geolocation","storedData","getStoredGeolocationData","maxmindData","getLocationByIpAddress","shingleDetailContent","context","CoveoContext","observer","targetNode","targetInnerHtml","config","callback","mutationList","mutation","_country","response","data","error","bindUrlManager","listOfColProd","accProdCol","product","_product","colProduct","color","defaultQuery","advancedQuerySearchActionCreator","loadAdvancedSearchQueryActions","logInterfaceLoad","loadSearchAnalyticsActions","executeSearch","loadSearchActions","filterResults","results","_result","childResults","childResult","renderFilters","isMobile","Facet","Autocomplete","MobileFilters","FacetBreadcrumbs","ResultList","resultList"],"mappings":"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"}