UNPKG

@yext/search-headless-react

Version:

The official React UI Bindings layer for Search Headless

73 lines (67 loc) 2.33 kB
// 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