{"version":3,"file":"url-manager-6eb13125.js","sources":["../../../../src/scripts/coveo/components/result-list.tsx","../../../../src/scripts/coveo/components/clear.tsx","../../../../src/scripts/coveo/components/url-manager.tsx"],"sourcesContent":["import React, { useContext, useEffect, useState } from 'react';\nimport {\n  Result,\n  ResultList as ResultListType,\n  ResultTemplatesManager,\n  SearchEngine,\n  loadSearchActions,\n  loadSearchAnalyticsActions\n} from '@coveo/headless';\nimport { headlessEngine } from '../engine';\nimport ErrorMessage from '../../react-components/listing-states/error';\nimport Loader from '../../react-components/listing-states/loader';\nimport SecondCall from './second-call-context';\nimport { maxResultsPerPage } from '../controllers/controller';\n\ntype ResultListProps = {\n  className?: string;\n  additionalSettings?: {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    [key: string]: any;\n  };\n  resultTemplatesManager: ResultTemplatesManager;\n  controller: ResultListType;\n  preventFirstCall?: boolean;\n  keyword?: string;\n  resultsCustomizer?: (result: Result[]) => Result[];\n};\n\nfunction ResultList({\n  className,\n  additionalSettings,\n  resultTemplatesManager,\n  controller,\n  preventFirstCall,\n  keyword,\n  resultsCustomizer\n}: ResultListProps) {\n  const classes = className || undefined;\n  const { dataset } = document.getElementsByClassName(\n    'coveo-listing__data-wrapper'\n  )[0] as HTMLElement;\n  const errorMessage = dataset.errorMessage as string;\n  const noResultsMessage = dataset.noResultsMessage as string;\n  const noResultsKeywordMessage = dataset.noResultsKeywordMessage as string;\n  const noResultsAdditionalMessage =\n    dataset.noResultsAdditionalMessage as string;\n  const loaderText = dataset.loaderText as string;\n  const [state, setState] = useState(controller.state);\n  const [results, setResults] = useState<Result[]>([]);\n  const secondCallContext = useContext(SecondCall);\n\n  useEffect(() => {\n    if (!preventFirstCall) {\n      const { logInterfaceLoad } = loadSearchAnalyticsActions(\n        headlessEngine as SearchEngine\n      );\n      const { executeSearch } = loadSearchActions(\n        headlessEngine as SearchEngine\n      );\n      (headlessEngine as SearchEngine).dispatch(\n        executeSearch(logInterfaceLoad())\n      );\n    }\n    controller.subscribe(() => setState(controller.state));\n  }, [controller]);\n\n  useEffect(() => {\n    if (resultsCustomizer) {\n      setResults(resultsCustomizer(state.results));\n    } else {\n      setResults(state.results);\n    }\n  }, [state.results]);\n\n  if (state.isLoading) {\n    return <Loader loaderText={loaderText} />;\n  }\n\n  if (state.hasError) {\n    <ErrorMessage\n      errorMessage={errorMessage}\n      noResultsMessage={noResultsMessage}\n      noResultsKeywordMessage={noResultsKeywordMessage}\n      showError={true}\n    />;\n  }\n\n  if (!results.length) {\n    return (\n      <ErrorMessage\n        errorMessage={errorMessage}\n        noResultsMessage={noResultsMessage}\n        noResultsKeywordMessage={noResultsKeywordMessage}\n        noResultsAdditionalMessage={noResultsAdditionalMessage}\n        keyword={keyword}\n      />\n    );\n  }\n\n  const renderResult = (result: Result, index: number) => {\n    const customResult = {\n      ...result,\n      index: index + 1,\n      additionalSettings\n    };\n\n    const template = resultTemplatesManager.selectTemplate(\n      customResult\n    ) as CallableFunction;\n\n    if (!template)\n      throw new Error(`No result template provided for ${customResult.title}.`);\n\n    return template(customResult);\n  };\n\n  return (\n    <ul className={classes}>\n      {secondCallContext.secondCall\n        ? secondCallContext.filteredResults.map((result, index) => {\n            const page = secondCallContext.selectedPage;\n            const start = (page - 1) * maxResultsPerPage;\n            const end = page * maxResultsPerPage;\n\n            if (index >= start && index < end)\n              return renderResult(result, index);\n            else return null;\n          })\n        : results?.map((result, index) => renderResult(result, index))}\n    </ul>\n  );\n}\n\nexport default ResultList;\n","import React, { useState, useEffect } from 'react';\nimport {\n  BreadcrumbManager,\n  BreadcrumbManagerState,\n  QuerySummary,\n  QuerySummaryState\n} from '@coveo/headless';\nimport { headlessEngine } from '../engine';\nimport { facetBreadcrumb, querySummary } from '../controllers/controller';\nimport { createDataLayerString } from '../../helpers/helpers';\n\ntype ClearProps = {\n  label: string;\n};\n\nfunction Clear({ label }: ClearProps) {\n  const [controller, setController] = useState<BreadcrumbManager | null>(null);\n  const [state, setState] = useState<BreadcrumbManagerState | null>(null);\n\n  const [, setSearchController] = useState<QuerySummary | null>(null);\n  const [searchState, setSearchState] = useState<QuerySummaryState | null>(\n    null\n  );\n\n  useEffect(() => {\n    if (headlessEngine) {\n      setController(facetBreadcrumb as BreadcrumbManager);\n      setState((facetBreadcrumb as BreadcrumbManager).state);\n      (facetBreadcrumb as BreadcrumbManager).subscribe(() => {\n        setState((facetBreadcrumb as BreadcrumbManager).state);\n      });\n\n      setSearchController(querySummary as QuerySummary);\n      setSearchState((querySummary as QuerySummary).state);\n      (querySummary as QuerySummary).subscribe(() => {\n        setSearchState((querySummary as QuerySummary).state);\n      });\n    }\n  }, []);\n\n  const handleClearAllFilters = () => {\n    if (controller) controller.deselectAll();\n  };\n\n  return (\n    <>\n      {state?.hasBreadcrumbs || searchState?.hasQuery ? (\n        <button\n          data-layer={createDataLayerString([\n            {\n              event: 'clear_all_filters',\n              event_category: 'refinement usage',\n              event_action: 'clear all filters'\n            }\n          ])}\n          className=\"btn btn--primary btn--clear-all-filters\"\n          onClick={handleClearAllFilters}\n          type=\"button\"\n        >\n          {label}\n        </button>\n      ) : null}\n    </>\n  );\n}\n\nexport default Clear;\n","import {\n  SearchEngine,\n  buildSearchStatus,\n  buildUrlManager\n} from '@coveo/headless';\n\n/**\n * Search parameters, defined in the url's hash, should not be restored until all components are registered.\n *\n * Additionally, a search should not be executed until search parameters are restored.\n *\n * @param engine - A headless search engine instance.\n * @returns An unsubscribe function to remove attached event listeners.\n */\n\nexport function bindUrlManager(engine: SearchEngine) {\n  const fragment = window.location.hash.slice(1);\n  const urlManager = buildUrlManager(engine, {\n    initialState: { fragment }\n  });\n\n  const searchStatus = buildSearchStatus(engine);\n\n  const onHashChange = () => {\n    const fragment = window.location.hash.slice(1);\n    urlManager.synchronize(fragment);\n  };\n\n  window.addEventListener('hashchange', onHashChange);\n  const unsubscribeManager = urlManager.subscribe(() => {\n    const hash = `#${urlManager.state.fragment}`;\n    if (!searchStatus.state.firstSearchExecuted) {\n      history.replaceState(null, document.title, hash);\n\n      return;\n    }\n\n    history.pushState(null, document.title, hash);\n  });\n\n  return () => {\n    window.removeEventListener('hashchange', onHashChange);\n    unsubscribeManager();\n  };\n}\n"],"names":["ResultList","className","additionalSettings","resultTemplatesManager","controller","preventFirstCall","keyword","resultsCustomizer","classes","dataset","errorMessage","noResultsMessage","noResultsKeywordMessage","noResultsAdditionalMessage","loaderText","state","setState","useState","results","setResults","secondCallContext","useContext","SecondCall","useEffect","logInterfaceLoad","loadSearchAnalyticsActions","headlessEngine","executeSearch","loadSearchActions","React","Loader","ErrorMessage","renderResult","result","index","customResult","template","page","start","maxResultsPerPage","end","Clear","label","setController","setSearchController","searchState","setSearchState","facetBreadcrumb","querySummary","handleClearAllFilters","createDataLayerString","bindUrlManager","engine","fragment","urlManager","buildUrlManager","searchStatus","buildSearchStatus","onHashChange","unsubscribeManager","hash"],"mappings":"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"}