@yext/search-headless-react
Version:
The official React UI Bindings layer for Search Headless
73 lines (67 loc) • 2.33 kB
JavaScript
// src/useSearchActions.ts
import { useContext } from "react";
// src/SearchHeadlessContext.ts
import { createContext } from "react";
var SearchHeadlessContext = createContext({});
// src/useSearchActions.ts
function useSearchActions() {
const searchHeadless = useContext(SearchHeadlessContext);
if (searchHeadless.state === void 0) {
throw new Error("Attempted to call useSearchActions() outside of SearchHeadlessProvider. Please ensure that 'useSearchActions()' is called within an SearchHeadlessProvider component.");
}
return searchHeadless;
}
// src/useSearchState.ts
import { useCallback, useContext as useContext2, useEffect, useRef } from "react";
import { useSyncExternalStoreWithSelector } from "use-sync-external-store/shim/with-selector.js";
function useSearchState(stateSelector) {
const search = useContext2(SearchHeadlessContext);
if (search.state === void 0) {
throw new Error("Attempted to call useSearchState() outside of SearchHeadlessProvider. Please ensure that 'useSearchState()' is called within an SearchHeadlessProvider component.");
}
const getSnapshot = useCallback(() => search.state, [search.state]);
const isMountedRef = useRef(false);
useEffect(() => {
isMountedRef.current = true;
return () => {
isMountedRef.current = false;
};
}, []);
const subscribe = useCallback((cb) => search.addListener({
valueAccessor: (state) => state,
callback: () => {
if (!isMountedRef.current) {
return;
}
cb();
}
}), [search]);
const selectedState = useSyncExternalStoreWithSelector(
subscribe,
getSnapshot,
getSnapshot,
stateSelector
);
return selectedState;
}
// src/useSearchUtilities.ts
import { useContext as useContext3 } from "react";
function useSearchUtilities() {
return useContext3(SearchHeadlessContext).utilities;
}
// src/SearchHeadlessProvider.tsx
import React from "react";
function SearchHeadlessProvider(props) {
const { children, searcher } = props;
return /* @__PURE__ */ React.createElement(SearchHeadlessContext.Provider, { value: searcher }, children);
}
// src/index.ts
export * from "@yext/search-headless";
export {
SearchHeadlessContext,
SearchHeadlessProvider,
useSearchActions,
useSearchState,
useSearchUtilities
};
//# sourceMappingURL=index.mjs.map