@yext/search-headless
Version:
A library for powering UI components for Yext Search integrations
69 lines • 3.18 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { provideCore } from '@yext/search-core';
import HttpManager from './http-manager';
import ReduxStateManager from './redux-state-manager';
import SearchHeadless from './search-headless';
import { createBaseStore } from './store';
import HeadlessReducerManager from './headless-reducer-manager';
import { DEFAULT_HEADLESS_ID } from './constants';
import * as searchUtilities from './search-utilities';
import { getHttpHeaders } from './utils/client-sdk-utils';
export * from './search-core-re-exports';
export * from './models';
export * from './constants';
export * from './utils/filter-creators';
export { searchUtilities };
let firstHeadlessInstance;
const store = createBaseStore();
const headlessReducerManager = new HeadlessReducerManager();
// eslint-disable-next-line @yext/export-star/no-duplicate-exports
export function provideHeadless(config, additionalHttpHeaders) {
const { verticalKey, headlessId } = config, searchConfig = __rest(config, ["verticalKey", "headlessId"]);
if (headlessId === DEFAULT_HEADLESS_ID) {
throw new Error(`Cannot instantiate a SearchHeadless using the default headlessId "${headlessId}". `
+ 'Specify a different headlessId.');
}
const searchCore = provideCore(searchConfig);
const stateManager = new ReduxStateManager(store, headlessId || DEFAULT_HEADLESS_ID, headlessReducerManager);
const httpManager = new HttpManager();
const httpHeaders = getHttpHeaders(additionalHttpHeaders);
const headless = new SearchHeadless(searchConfig, searchCore, stateManager, httpManager, httpHeaders);
verticalKey
? headless.setVertical(verticalKey)
: headless.setUniversal();
if (!firstHeadlessInstance) {
firstHeadlessInstance = headless;
}
else {
// Two-way bind the current headless instances with the first one instantiated on the page.
// This way, all headless instances on a page will have their sessionTracking states linked.
// We have to be careful not to create an infinite loop here.
linkSessionTracking(firstHeadlessInstance, headless);
linkSessionTracking(headless, firstHeadlessInstance);
}
return headless;
}
/**
* Links the secondHeadless instance to sessionTracking updates made to the firstHeadless
* instance.
*/
function linkSessionTracking(firstHeadless, secondHeadless) {
firstHeadless.addListener({
valueAccessor: state => state.sessionTracking,
callback: sessionTracking => {
secondHeadless.setState(Object.assign(Object.assign({}, secondHeadless.state), { sessionTracking }));
}
});
}
export { SearchHeadless };
//# sourceMappingURL=index.js.map