{"version":3,"sources":["webpack:///./src/pages/catalog/Catalog.js","webpack:///./src/gtm-events/partCatalogue.js","webpack:///./src/gtm-events/findBikePart.js","webpack:///./src/gtm-events/findBikePartChild.js"],"names":["Catalog","isHeaderPinned","useIsHeaderPinned","useSearchParams","searchParams","navigate","useNavigate","dispatch","useDispatch","getLabel","useLabel","getCta","useCta","stepperContainer","useRef","faqsContainer","useState","breadcrumb","setBreadcrumb","bikeId","get","modelId","catalogPageId","product","catalogContainer","bike","useSelector","getBike","catalogList","getCatalogList","faqs","getFaqs","useHideElement","useEffect","a","getBikeModel","data","setBike","setError","doSearch","getCatalogueByBikeModel","params","URLSearchParams","window","location","search","catalogue","id","set","toString","replace","scrollToTopOfPartsGrid","requestAnimationFrame","top","current","getBoundingClientRect","document","documentElement","scrollTop","querySelector","clientHeight","scrollTo","behaviour","getCataloguePage","name","path","breadCrumbs","map","item","Name","onClick","toQueryString","Id","setCatalogList","ref","PartsStepper","bikeSearchCompleted","cta","hideCta","questions","length","undefined","onCtaClick","withLockedHeader","scrollIntoView","title","summary","catalog","category","to","image","_links","isCatalogueLink","rel","isTopLevel","pushToDataLayer","action","label","clickText","props","configuratorBikeName","configuratorBikeId","configuratorBikeYear","year","findBikePartEvent","configuratorAccessoryCategory","findBikePartChildEvent"],"mappings":"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","file":"0fc6e70bdc4951d27bfd.js","sourcesContent":["import React, { useEffect, useState, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { getBike, getCatalogList, getFaqs } from 'src/redux/app/selectors';\nimport { toQueryString, useHideElement, useIsHeaderPinned, StickyHeader, withLockedHeader } from '@triumph/shared';\nimport { setBike, setCatalogList, setError } from 'src/redux/app/actions';\nimport { useLabel } from 'src/hooks';\nimport { BikeDetails, Loader, PartsCatalog } from 'components';\nimport getCatalogueByBikeModel from 'src/requests/getCatalogueByBikeModel';\nimport getBikeModel from 'src/requests/getBikeModel';\nimport getCataloguePage from 'src/requests/getCataloguePage';\nimport PartsStepper from 'components/parts-stepper/PartsStepper';\nimport findBikePartEvent from 'src/gtm-events/findBikePart';\nimport findBikePartChildEvent from 'src/gtm-events/findBikePartChild';\nimport partCatalogueEvent from 'src/gtm-events/partCatalogue';\nimport useCta from 'src/hooks/useCta';\nimport FAQs from '../../components/faqs';\n\nconst Catalog = () => {\n  const isHeaderPinned = useIsHeaderPinned();\n  const [searchParams] = useSearchParams();\n  const navigate = useNavigate();\n  const dispatch = useDispatch();\n  const getLabel = useLabel();\n  const getCta = useCta();\n  const stepperContainer = useRef();\n  const faqsContainer = useRef();\n  const [breadcrumb, setBreadcrumb] = useState([]);\n\n  const bikeId = searchParams.get('bikeId');\n  const modelId = searchParams.get('modelId');\n  const catalogPageId = searchParams.get('catalogPageId');\n  const product = searchParams.get('product');\n\n  const catalogContainer = useRef();\n\n  const bike = useSelector(getBike);\n  const catalogList = useSelector(getCatalogList);\n  const faqs = useSelector(getFaqs);\n\n  useHideElement('.breadcrumb');\n  useHideElement('[data-navigation-target=\"header-basket\"]');\n\n  useEffect(() => {\n    const doSearch = async () => {\n      try {\n        const { data } = await getBikeModel(bikeId, modelId);\n        dispatch(setBike(data.bike));\n      } catch (error) {\n        dispatch(setError(error));\n        throw error;\n      }\n    };\n\n    doSearch();\n  }, [bikeId]);\n\n  useEffect(() => {\n    if (catalogPageId) {\n      return;\n    }\n\n    const doSearch = async () => {\n      try {\n        const { data } = await getCatalogueByBikeModel(modelId);\n        const params = new URLSearchParams(window.location.search);\n\n        if (data?.catalogue?.[0]?.id) params.set('catalogPageId', data.catalogue[0].id);\n\n        navigate({ search: params.toString() }, { replace: true });\n      } catch (error) {\n        dispatch(setError(error));\n        throw error;\n      }\n    };\n    doSearch();\n  }, [modelId]);\n\n  const scrollToTopOfPartsGrid = () => {\n    window.requestAnimationFrame(() => {\n      const top =\n        (catalogContainer.current?.getBoundingClientRect()?.top || 0) +\n        document.documentElement.scrollTop -\n        (isHeaderPinned ? document.querySelector('.header').clientHeight : 0) -\n        (stepperContainer.current?.clientHeight || 0);\n\n      window.scrollTo({\n        top,\n        behaviour: 'smooth',\n      });\n    });\n  };\n\n  useEffect(() => {\n    if (!catalogPageId) {\n      return;\n    }\n\n    const doSearch = async () => {\n      try {\n        const { data } = await getCataloguePage(catalogPageId);\n\n        setBreadcrumb([\n          {\n            name: getLabel('bikeSelectorTitle'),\n            path: getCta('bikeSearch'),\n          },\n          ...data.breadCrumbs.map((item) => ({\n            name: item.Name,\n            onClick: () => {\n              navigate({\n                search: toQueryString({\n                  bikeId,\n                  modelId,\n                  catalogPageId: item.Id,\n                  ...(product ? { product } : {}),\n                }),\n              });\n              scrollToTopOfPartsGrid();\n            },\n          })),\n        ]);\n\n        dispatch(setCatalogList(data.catalogue));\n      } catch (error) {\n        dispatch(setError(error));\n        throw error;\n      }\n    };\n\n    doSearch();\n  }, [catalogPageId]);\n\n  return (\n    <>\n      <StickyHeader>\n        <div ref={stepperContainer}>\n          <PartsStepper bikeSearchCompleted />\n        </div>\n      </StickyHeader>\n      {bike && (\n        <BikeDetails\n          cta={faqs.hideCta || !faqs.questions?.length ? undefined : getLabel('bikeSelectorCta')}\n          onCtaClick={async () =>\n            withLockedHeader(() => faqsContainer.current?.scrollIntoView({ behaviour: 'smooth' }))\n          }\n          title={getLabel('bikeSelectorTitle')}\n          summary={getLabel('bikeSelectorSubtitle')}\n          bike={bike}\n        />\n      )}\n      {catalogList && (\n        <div ref={catalogContainer}>\n          <PartsCatalog\n            breadcrumb={breadcrumb}\n            catalog={catalogList.map((category) => {\n              const { id, image, name, _links } = category;\n\n              const isCatalogueLink = _links?.[0].rel === 'catalogue';\n              const isTopLevel = !isCatalogueLink && breadcrumb.length < 2;\n\n              let to;\n\n              if (!isCatalogueLink) {\n                to = `/parts/${bikeId}/${modelId}/${id}`;\n              }\n\n              if (product) {\n                to = `${to}/${product}`;\n              }\n\n              return {\n                id,\n                image,\n                name,\n                to,\n                onClick: () => {\n                  if (isCatalogueLink) {\n                    const params = new URLSearchParams(window.location.search);\n                    params.set('catalogPageId', id);\n                    navigate({ search: params.toString() });\n\n                    scrollToTopOfPartsGrid();\n\n                    partCatalogueEvent({ category, bike, clickText: name });\n                  }\n\n                  if (isTopLevel) {\n                    findBikePartEvent({ category, bike, clickText: name });\n                  }\n\n                  if (!isTopLevel) {\n                    findBikePartChildEvent({ category, bike, clickText: name });\n                  }\n                },\n              };\n            })}\n          />\n        </div>\n      )}\n      {!faqs.hideCta && !!faqs.questions?.length && (\n        <div ref={faqsContainer}>\n          <FAQs title={faqs.title} questions={faqs.questions} bike={bike} />\n        </div>\n      )}\n      {!catalogList && <Loader />}\n    </>\n  );\n};\n\nexport default Catalog;\n","import { pushToDataLayer } from \"@triumph/shared\";\n\nexport default () => pushToDataLayer({\n  name: 'partCatalogue',\n  category: 'Parts',\n  action: `Step`,\n  label: `Parts Catalogue`,\n});","import { pushToDataLayer } from \"@triumph/shared\";\n\nexport default ({ bike, clickText }) => pushToDataLayer({\n  name: 'findBikePart',\n  category: 'Parts',\n  action: `Find Parts - ${bike.name}`,\n  label: clickText,\n  props: {\n    configuratorBikeName: bike.name,\n    configuratorBikeId: bike.id,\n    configuratorBikeYear: bike.year,\n  },\n});","import { pushToDataLayer } from '@triumph/shared';\n\nexport default ({ bike, category, clickText }) =>\n  pushToDataLayer({\n    name: 'findBikePartChild',\n    category: 'Parts',\n    action: `Find Parts - ${bike.name}`,\n    label: `${category.name} ${clickText}`,\n    props: {\n      configuratorBikeName: bike.name,\n      configuratorBikeId: bike.id,\n      configuratorBikeYear: bike.year,\n      configuratorAccessoryCategory: category.name,\n    },\n  });\n"],"sourceRoot":""}