{"version":3,"file":"search.js","sources":["../../../resources/javascript/features/search/index.js"],"sourcesContent":["import { html, render } from 'lit-html';\nimport { store } from '../../state/store';\nimport { getLocale } from '../../util/locale';\nimport { getCurrency } from '../../util/currency';\nimport { getEventId } from '../../util/offers';\nimport { search, selectVariation, toggleFacetVisibility, toggleShowAllFacets, toggleSortVisibility, updateBreakpointMatches } from './state';\nimport ListingURL from '../plp/url';\nimport { addLocalePathPrefix, fixSiteURL } from '../../util/url';\nimport { facetDialogTemplate, listingTemplate, onFacetDialogRendered, onListingRendered } from '../plp/listing';\nimport { monitorBreakpoint } from '../../util/viewport';\nimport dialogPolyfill from 'dialog-polyfill'\nimport { maxResultsPerPage } from '../plp/state';\nimport { facetMap } from '../plp/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  store.dispatch(search({\n    query: parsedURL.query,\n    facets,\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        history.pushState({}, '', 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 {object} state\n * @param {object} options\n * @returns {TemplateResult}\n */\nconst searchTemplate = (state, { design2025 }) => {\n  const {\n    query,\n    result,\n    loading,\n    selectedVariations,\n    facets: facetState,\n    showAllFacets,\n    sort,\n    pageAdjustments,\n    breakpointMatches,\n    scrollType,\n  } = state.search;\n\n  const { tablet: isTabletOrSmaller } = breakpointMatches;\n\n  const locale = getLocale();\n  const currency = getCurrency();\n  const eventId = getEventId();\n\n  return html`\n    <div class=\"listing-banner\">\n      <div class=\"wrap\">\n        <div class=\"listing-banner__content\">\n          <h1 class=\"listing-banner__title\">Search results for \"${query}\"</h1>\n        </div>\n      </div>\n    </div>\n\n    ${listingTemplate({\n      mode: 'search',\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      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.search === searchState) {\n    return;\n  }\n\n  var shouldScrollToTopScrollExperiment = (state.search.scrollType === 'control');\n\n  const scrollToTop = (state.search?.loading !== searchState?.loading) && shouldScrollToTopScrollExperiment;\n\n  if (!isEqual(state.search.filters ?? {}, searchState?.filters ?? {})) {\n    shouldScrollToTopScrollExperiment = true; \n  }\n\n  searchState = state.search;\n  const currency = getCurrency();\n\n  const { loading, query, result } = state.search;\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  const url = new URL(window.location.href);\n\n  if (!loading && totalResultCount === 0 && !url.searchParams.has('q')) {\n    const url = addLocalePathPrefix('/no-results');\n    url.searchParams.set('q', query);\n    window.location = url;\n    return;\n  }\n\n  document.title = `Search results for '${state.search.query}'`;\n\n  const container = document.querySelector('#constructor-search');\n\n  if (firstRender) {\n    container.innerHTML = '';\n    firstRender = false;\n  }\n\n  const design2025 = window.mv?.plp?.design2025 ?? false;\n  const scrollType = state.search.scrollType ?? 'control';\n  render(searchTemplate(state, { design2025 }), container);\n\n  onListingRendered({\n    container,\n    scrollType,\n    scrollToTop,\n    navigate,\n    loading\n  });\n\n  const { facets: facetState, showAllFacets, breakpointMatches } = state.search;\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.search.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    });\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","store","dispatch","search","query","page","sortBy","sortOrder","afterBegin","urlStr","toString","window","location","href","history","pushState","navigate","URL","searchState","firstRender","subscribe","_state$search","_searchState","_state$search$filters","_searchState$filters","_searchState2","_response$redirect","_response$results$len","_response$results","_window$mv$plp$design","_window$mv","_state$search$scrollT","state","getState","shouldScrollToTopScrollExperiment","scrollType","scrollToTop","loading","isEqual","filters","currency","getCurrency","result","response","redirect","data","fixSiteURL","totalResultCount","results","length","searchParams","has","addLocalePathPrefix","set","document","title","container","querySelector","innerHTML","design2025","mv","plp","render","searchTemplate","selectedVariations","facetState","showAllFacets","sort","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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"}