{"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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"}