{"version":3,"file":"plp.js","sources":["../../../resources/javascript/features/plp/index.js"],"sourcesContent":["import { html, render } from 'lit-html';\nimport { store } from '../../state/store';\nimport { getLocale } from '../../util/locale';\nimport { getCurrency, getPriceField } from '../../util/currency';\nimport { getEventId } from '../../util/offers';\nimport { browse, maxResultsPerPage, selectVariation, toggleFacetVisibility, toggleShowAllFacets, toggleSortVisibility } from './state';\nimport ListingURL from './url';\nimport { addLocalePathPrefix, fixSiteURL } from '../../util/url';\nimport { facetDialogTemplate, listingTemplate, onFacetDialogRendered, onListingRendered } from './listing';\nimport { monitorBreakpoint } from '../../util/viewport';\nimport dialogPolyfill from 'dialog-polyfill'\nimport { updateBreakpointMatches } from './state';\nimport { facetMap } from './facets';\nimport { isEqual } from 'lodash-es';\n\nconst loadResults = async (url) => {\n  const parsedURL = ListingURL.parse(url, { facetMap });\n\n  const facets = {};\n  for (const { name, values } of parsedURL.facets) {\n    facets[name] = values;\n  }\n\n  const { fixedFacet } = parsedURL;\n\n  const { name: filterName, value: filterValue } = parsedURL.browseFilter;\n\n  store.dispatch(browse({\n    filterName,\n    filterValue,\n    facets,\n    fixedFacet,\n    page: parsedURL.page,\n    sortBy: parsedURL.sortBy,\n    sortOrder: parsedURL.sortOrder,\n    async afterBegin() {\n      const urlStr = url.toString();\n      if (window.location.href !== urlStr) {\n        const state = {\n          plp: {\n            changedFacets: {},\n          },\n        };\n\n        const previousURL = ListingURL.parse(new URL(window.location.href), {\n          facetMap,\n        });\n\n        for (const { name, values } of previousURL.facets) {\n          const currentValues = facets[name] ?? [];\n          const previousValues = values ?? [];\n\n          if (\n            currentValues.length !== previousValues.length\n            || !currentValues.every((value, i) => previousValues[i] === value)\n          ) {\n            state.plp.changedFacets[name] = {\n              old: previousValues,\n              new: currentValues,\n            };\n          }\n        }\n\n        history.pushState(state, '', urlStr);\n      }\n    },\n  }));\n};\n\nconst navigate = (url) => loadResults(new URL(url));\n\n/**\n * Return a lit-html template that renders the search page.\n *\n * @param {*} state\n * @param {object} options\n * @returns {TemplateResult}\n */\nconst plpTemplate = (state, { design2025 }) => {\n  const {\n    result,\n    loading,\n    selectedVariations,\n    facets: facetState,\n    showAllFacets,\n    sort,\n    callouts,\n    pageAdjustments,\n    breakpointMatches,\n    scrollType \n  } = state.plp;\n\n  const { tablet: isTabletOrSmaller } = breakpointMatches;\n\n  const locale = getLocale();\n  const currency = getCurrency();\n  const eventId = getEventId();\n\n  return html`\n    ${listingTemplate({\n    mode: 'browse',\n    design2025,\n    locale,\n    currency,\n    eventId,\n    result,\n    loading,\n    selectedVariations,\n    navigate,\n    setSelectedVariation: (payload) => store.dispatch(selectVariation(payload)),\n    facetState,\n    showAllFacets,\n    toggleFacetVisibility: (payload) => store.dispatch(toggleFacetVisibility(payload)),\n    toggleShowAllFacets: (payload) => store.dispatch(toggleShowAllFacets(payload)),\n    sort,\n    toggleSortVisibility: (payload) => store.dispatch(toggleSortVisibility(payload)),\n    callouts,\n    pageAdjustments,\n    maxResultsPerPage,\n    isTabletOrSmaller,\n    scrollType,\n  })}\n  `;\n};\n\nlet searchState;\nlet firstRender = true;\nstore.subscribe(() => {\n  const state = store.getState();\n\n  if (state.plp === searchState) {\n    return;\n  }\n\n  var shouldScrollToTopScrollExperiment = (state.plp.scrollType === 'control');\n\n  // Ensure we scroll to top if filters have been changed\n  if (!isEqual(state.plp.filters ?? {}, searchState?.filters ?? {})) {\n    shouldScrollToTopScrollExperiment = true; \n  }\n\n  const scrollToTop = (state.plp?.loading !== searchState?.loading) && shouldScrollToTopScrollExperiment;\n\n  searchState = state.plp;\n  const currency = getCurrency();\n\n  const { loading, result } = state.plp;\n  const { response } = result ?? {};\n\n  const redirect = response?.redirect?.data?.url;\n  if (redirect) {\n    window.location = fixSiteURL(redirect);\n    return;\n  }\n\n  const totalResultCount = response?.results?.length ?? 0;\n  if (!loading && totalResultCount === 0) {\n    if (!(getPriceField() in (window?.history?.state?.plp?.changedFacets ?? {}))) {\n      const url = addLocalePathPrefix('/shop');\n      if (window.location.href !== url) {\n        window.location = url;\n      } else {\n        window.location = addLocalePathPrefix('/');\n      }\n      return;\n    }\n  }\n\n  const container = document.querySelector('#constructor-browse');\n\n  if (firstRender) {\n    container.innerHTML = '';\n    firstRender = false;\n  }\n\n  const design2025 = window.mv?.plp?.design2025 ?? false;\n  let scrollType = state.plp.scrollType ?? 'control'\n\n  render(plpTemplate(state, { design2025 }), container);\n\n  onListingRendered({\n    container,\n    scrollToTop,\n    scrollType,\n    navigate,\n    loading,\n  });\n\n  const { facets: facetState, showAllFacets, breakpointMatches } = state.plp;\n  const isTabletOrSmaller = breakpointMatches.tablet;\n\n  let facetDialog = document.querySelector('.facet-dialog');\n  const useFacetDialog = isTabletOrSmaller || design2025;\n  if (useFacetDialog) {\n    if (!facetDialog) {\n      facetDialog = document.createElement('dialog');\n      facetDialog.classList.add('facet-dialog');\n      dialogPolyfill.registerDialog(facetDialog);\n      document.body.appendChild(facetDialog);\n    }\n\n    render(facetDialogTemplate({\n      result,\n      navigate,\n      toggleFacetVisibility: (payload) => store.dispatch(toggleFacetVisibility(payload)),\n      toggleShowAllFacets: (payload) => store.dispatch(toggleShowAllFacets(payload)),\n      facetState,\n      sort: state.plp.sort,\n      toggleSortVisibility: (payload) => store.dispatch(toggleSortVisibility(payload)),\n      totalResultCount,\n      currency,\n      design2025,\n    }), facetDialog);\n  }\n\n  if (facetDialog) {\n    onFacetDialogRendered({\n      dialog: facetDialog,\n      open: showAllFacets && useFacetDialog,\n      firstRender,\n      navigate,\n    });\n  }\n});\n\nloadResults(new URL(window.location.href));\n\nwindow.addEventListener('popstate', () => {\n  loadResults(new URL(window.location.href));\n});\n\nmonitorBreakpoint('tablet', ({ matches }) => {\n  store.dispatch(updateBreakpointMatches({ tablet: matches }));\n});\n"],"names":["loadResults","async","parsedURL","ListingURL","parse","url","facetMap","facets","name","values","fixedFacet","filterName","value","filterValue","browseFilter","store","dispatch","browse","page","sortBy","sortOrder","afterBegin","urlStr","toString","window","location","href","state","plp","changedFacets","previousURL","URL","_facets$name","currentValues","previousValues","length","every","i","old","new","history","pushState","navigate","searchState","firstRender","subscribe","_state$plp$filters","_searchState$filters","_searchState","_state$plp","_searchState2","_response$redirect","_response$results$len","_response$results","_window$mv$plp$design","_window$mv","_state$plp$scrollType","getState","shouldScrollToTopScrollExperiment","scrollType","isEqual","filters","scrollToTop","loading","currency","getCurrency","result","response","redirect","data","fixSiteURL","totalResultCount","results","_window$history$state","_window","getPriceField","addLocalePathPrefix","container","document","querySelector","innerHTML","design2025","mv","render","plpTemplate","selectedVariations","facetState","showAllFacets","sort","callouts","pageAdjustments","breakpointMatches","tablet","isTabletOrSmaller","locale","getLocale","eventId","getEventId","html","_t","_","listingTemplate","mode","setSelectedVariation","payload","selectVariation","toggleFacetVisibility","toggleShowAllFacets","toggleSortVisibility","maxResultsPerPage","onListingRendered","facetDialog","useFacetDialog","createElement","classList","add","dialogPolyfill","registerDialog","body","appendChild","facetDialogTemplate","onFacetDialogRendered","dialog","open","addEventListener","monitorBreakpoint","matches","updateBreakpointMatches"],"mappings":"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"}