export function useSearch()

in packages/react-search-ui/src/hooks/useSearch.tsx [12:53]


export function useSearch<T = SearchContextState>(
  mapContextToProps?: (context: SearchContextState) => T
): T {
  const context = useContext(SearchContext);

  if (!context) {
    throw new Error("useSearch must be used within a SearchProvider");
  }

  const [state, setState] = useState<T>(() =>
    mapContextToProps
      ? mapContextToProps({
          ...context.driver.getState(),
          ...context.driver.getActions()
        })
      : ({
          ...context.driver.getState(),
          ...context.driver.getActions()
        } as T)
  );

  useEffect(() => {
    const subscription = (newState: Partial<SearchContextState>) => {
      setState((prevState: T) => {
        const fullContext = {
          ...(prevState as any),
          ...newState
        };
        return mapContextToProps
          ? mapContextToProps(fullContext)
          : (fullContext as T);
      });
    };

    context.driver.subscribeToStateChanges(subscription);
    return () => {
      context.driver.unsubscribeToStateChanges(subscription);
    };
  }, [context.driver, mapContextToProps]);

  return state;
}