react-instantsearch-core
7.25.07.26.0
dist/es/lib/useInstantSearchApi.js~
dist/es/lib/useInstantSearchApi.jsModified+174−191
Index: package/dist/es/lib/useInstantSearchApi.js
===================================================================
--- package/dist/es/lib/useInstantSearchApi.js
+++ package/dist/es/lib/useInstantSearchApi.js
@@ -1,212 +1,195 @@
-function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
-function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
-function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
-function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
-function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
-function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
-import InstantSearch, { INSTANTSEARCH_FUTURE_DEFAULTS } from "instantsearch.js/es/lib/InstantSearch.js";
-import { useCallback, useRef, version as ReactVersion } from 'react';
-import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
-import version from "../version.js";
-import { dequal } from "./dequal.js";
-import { useForceUpdate } from "./useForceUpdate.js";
-import { useInstantSearchServerContext } from "./useInstantSearchServerContext.js";
-import { useInstantSearchSSRContext } from "./useInstantSearchSSRContext.js";
-import { useRSCContext } from "./useRSCContext.js";
-import { warn } from "./warn.js";
-var defaultUserAgents = ["react (".concat(ReactVersion, ")"), "react-instantsearch (".concat(version, ")"), "react-instantsearch-core (".concat(version, ")")];
-var serverUserAgent = "react-instantsearch-server (".concat(version, ")");
+import { _ as _$1 } from '@swc/helpers/cjs/_object_spread.cjs';
+import { _ } from '@swc/helpers/cjs/_to_consumable_array.cjs';
+import InstantSearch, { INSTANTSEARCH_FUTURE_DEFAULTS } from 'instantsearch.js/es/lib/InstantSearch.js';
+import { useRef, useCallback, version } from 'react';
+import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';
+import version$1 from '../version.js';
+import { dequal } from './dequal.js';
+import { useForceUpdate } from './useForceUpdate.js';
+import { useInstantSearchServerContext } from './useInstantSearchServerContext.js';
+import { useInstantSearchSSRContext } from './useInstantSearchSSRContext.js';
+import { useRSCContext } from './useRSCContext.js';
+
+var defaultUserAgents = [
+ "react (".concat(version, ")"),
+ "react-instantsearch (".concat(version$1, ")"),
+ "react-instantsearch-core (".concat(version$1, ")")
+];
+var serverUserAgent = "react-instantsearch-server (".concat(version$1, ")");
var nextUserAgent = function nextUserAgent(nextVersion) {
- return nextVersion ? "next.js (".concat(nextVersion, ")") : null;
+ return nextVersion ? "next.js (".concat(nextVersion, ")") : null;
};
-export function useInstantSearchApi(props) {
- var forceUpdate = useForceUpdate();
- var serverContext = useInstantSearchServerContext();
- var serverState = useInstantSearchSSRContext();
- var _useRSCContext = useRSCContext(),
- waitForResultsRef = _useRSCContext.waitForResultsRef;
- var initialResults = serverState === null || serverState === void 0 ? void 0 : serverState.initialResults;
- var prevPropsRef = useRef(props);
- var shouldRenderAtOnce = serverContext || initialResults || waitForResultsRef;
- var searchRef = useRef(null);
- // As we need to render on mount with SSR, using the local ref above in `StrictMode` will
- // create and start two instances of InstantSearch. To avoid this, we instead discard it and use
- // an upward ref from `InstantSearchSSRContext` as it has already been mounted a second time at this point.
- if (serverState !== null && serverState !== void 0 && serverState.ssrSearchRef) {
- searchRef = serverState.ssrSearchRef;
- }
- if (searchRef.current === null) {
- // We don't use the `instantsearch()` function because it comes with other
- // top-level APIs that we don't need.
- // See https://github.com/algolia/instantsearch/blob/5b529f43d8acc680f85837eaaa41f7fd03a3f833/src/index.es.ts#L63-L86
- var search = new InstantSearch(props);
- search._schedule = function _schedule(cb) {
- search._schedule.queue.push(cb);
- clearTimeout(search._schedule.timer);
- search._schedule.timer = setTimeout(function () {
- search._schedule.queue.forEach(function (callback) {
- callback();
- });
+function useInstantSearchApi(props) {
+ var forceUpdate = useForceUpdate();
+ var serverContext = useInstantSearchServerContext();
+ var serverState = useInstantSearchSSRContext();
+ var waitForResultsRef = useRSCContext().waitForResultsRef;
+ var initialResults = serverState === null || serverState === void 0 ? void 0 : serverState.initialResults;
+ var prevPropsRef = useRef(props);
+ var shouldRenderAtOnce = serverContext || initialResults || waitForResultsRef;
+ var searchRef = useRef(null);
+ // As we need to render on mount with SSR, using the local ref above in `StrictMode` will
+ // create and start two instances of InstantSearch. To avoid this, we instead discard it and use
+ // an upward ref from `InstantSearchSSRContext` as it has already been mounted a second time at this point.
+ if (serverState === null || serverState === void 0 ? void 0 : serverState.ssrSearchRef) {
+ searchRef = serverState.ssrSearchRef;
+ }
+ if (searchRef.current === null) {
+ // We don't use the `instantsearch()` function because it comes with other
+ // top-level APIs that we don't need.
+ // See https://github.com/algolia/instantsearch/blob/5b529f43d8acc680f85837eaaa41f7fd03a3f833/src/index.es.ts#L63-L86
+ var search = new InstantSearch(props);
+ search._schedule = function _schedule(cb) {
+ search._schedule.queue.push(cb);
+ clearTimeout(search._schedule.timer);
+ search._schedule.timer = setTimeout(function() {
+ search._schedule.queue.forEach(function(callback) {
+ callback();
+ });
+ search._schedule.queue = [];
+ }, 0);
+ };
search._schedule.queue = [];
- }, 0);
- };
- search._schedule.queue = [];
- if (shouldRenderAtOnce) {
- // InstantSearch.js has a private Initial Results API that lets us inject
- // results on the search instance.
- // On the server, we default the initial results to an empty object so that
- // InstantSearch.js doesn't schedule a search that isn't used, leading to
- // an additional network request. (This is equivalent to monkey-patching
- // `scheduleSearch` to a noop.)
- search._initialResults = initialResults || {};
- // We don't rely on the `defer` to reset the schedule search, but will call
- // `search._resetScheduleSearch()` manually in the effect after children
- // mount in `InstantSearch`.
- search._manuallyResetScheduleSearch = true;
+ if (shouldRenderAtOnce) {
+ // InstantSearch.js has a private Initial Results API that lets us inject
+ // results on the search instance.
+ // On the server, we default the initial results to an empty object so that
+ // InstantSearch.js doesn't schedule a search that isn't used, leading to
+ // an additional network request. (This is equivalent to monkey-patching
+ // `scheduleSearch` to a noop.)
+ search._initialResults = initialResults || {};
+ // We don't rely on the `defer` to reset the schedule search, but will call
+ // `search._resetScheduleSearch()` manually in the effect after children
+ // mount in `InstantSearch`.
+ search._manuallyResetScheduleSearch = true;
+ }
+ addAlgoliaAgents(props.searchClient, _(defaultUserAgents).concat([
+ serverContext && serverUserAgent,
+ nextUserAgent(getNextVersion())
+ ]));
+ // On the server, we start the search early to compute the search parameters.
+ // On SSR, we start the search early to directly catch up with the lifecycle
+ // and render.
+ if (shouldRenderAtOnce) {
+ search.start();
+ }
+ if (serverContext) {
+ // We notify `getServerState()` of the InstantSearch internals to retrieve
+ // the server state and pass it to the render on SSR.
+ serverContext.notifyServer({
+ search: search
+ });
+ }
+ warnNextRouter(props.routing);
+ searchRef.current = search;
}
- addAlgoliaAgents(props.searchClient, [].concat(defaultUserAgents, [serverContext && serverUserAgent, nextUserAgent(getNextVersion())]));
-
- // On the server, we start the search early to compute the search parameters.
- // On SSR, we start the search early to directly catch up with the lifecycle
- // and render.
- if (shouldRenderAtOnce) {
- search.start();
- }
- if (serverContext) {
- // We notify `getServerState()` of the InstantSearch internals to retrieve
- // the server state and pass it to the render on SSR.
- serverContext.notifyServer({
- search: search
- });
- }
- warnNextRouter(props.routing);
- warnNextAppDir(Boolean(waitForResultsRef));
- searchRef.current = search;
- }
- {
- var _search = searchRef.current;
- var prevProps = prevPropsRef.current;
- if (prevProps.indexName !== props.indexName) {
- _search.helper.setIndex(props.indexName || '').search();
- prevPropsRef.current = props;
- }
- if (prevProps.searchClient !== props.searchClient) {
- process.env.NODE_ENV === 'development' ? warn(false, 'The `searchClient` prop of `<InstantSearch>` changed between renders, which may cause more search requests than necessary. If this is an unwanted behavior, please provide a stable reference: https://www.algolia.com/doc/api-reference/widgets/instantsearch/react/#widget-param-searchclient') : void 0;
- addAlgoliaAgents(props.searchClient, [].concat(defaultUserAgents, [serverContext && serverUserAgent]));
- _search.mainHelper.setClient(props.searchClient).search();
- prevPropsRef.current = props;
- }
- if (prevProps.onStateChange !== props.onStateChange) {
- _search.onStateChange = props.onStateChange;
- prevPropsRef.current = props;
- }
- if (prevProps.searchFunction !== props.searchFunction) {
- // Updating the `searchFunction` to `undefined` is not supported by
- // InstantSearch.js, so it will throw an error.
- // This is a fair behavior until we add an update API in InstantSearch.js.
- _search._searchFunction = props.searchFunction;
- prevPropsRef.current = props;
- }
- if (prevProps.stalledSearchDelay !== props.stalledSearchDelay) {
- var _props$stalledSearchD;
- // The default `stalledSearchDelay` in InstantSearch.js is 200ms.
- // We need to reset it when it's undefined to get back to the original value.
- _search._stalledSearchDelay = (_props$stalledSearchD = props.stalledSearchDelay) !== null && _props$stalledSearchD !== void 0 ? _props$stalledSearchD : 200;
- prevPropsRef.current = props;
- }
- if (!dequal(prevProps.future, props.future)) {
- _search.future = _objectSpread(_objectSpread({}, INSTANTSEARCH_FUTURE_DEFAULTS), props.future);
- prevPropsRef.current = props;
- }
-
+ {
+ var search1 = searchRef.current;
+ var prevProps = prevPropsRef.current;
+ if (prevProps.indexName !== props.indexName) {
+ search1.helper.setIndex(props.indexName || '').search();
+ prevPropsRef.current = props;
+ }
+ if (prevProps.searchClient !== props.searchClient) {
+ addAlgoliaAgents(props.searchClient, _(defaultUserAgents).concat([
+ serverContext && serverUserAgent
+ ]));
+ search1.mainHelper.setClient(props.searchClient).search();
+ prevPropsRef.current = props;
+ }
+ if (prevProps.onStateChange !== props.onStateChange) {
+ search1.onStateChange = props.onStateChange;
+ prevPropsRef.current = props;
+ }
+ if (prevProps.searchFunction !== props.searchFunction) {
+ // Updating the `searchFunction` to `undefined` is not supported by
+ // InstantSearch.js, so it will throw an error.
+ // This is a fair behavior until we add an update API in InstantSearch.js.
+ search1._searchFunction = props.searchFunction;
+ prevPropsRef.current = props;
+ }
+ if (prevProps.stalledSearchDelay !== props.stalledSearchDelay) {
+ var _props_stalledSearchDelay;
+ // The default `stalledSearchDelay` in InstantSearch.js is 200ms.
+ // We need to reset it when it's undefined to get back to the original value.
+ search1._stalledSearchDelay = (_props_stalledSearchDelay = props.stalledSearchDelay) !== null && _props_stalledSearchDelay !== void 0 ? _props_stalledSearchDelay : 200;
+ prevPropsRef.current = props;
+ }
+ if (!dequal(prevProps.future, props.future)) {
+ search1.future = _$1({}, INSTANTSEARCH_FUTURE_DEFAULTS, props.future);
+ prevPropsRef.current = props;
+ }
// Updating the `routing` prop is not supported because InstantSearch.js
// doesn't let us change it. This might not be a problem though, because `routing`
// shouldn't need to be dynamic.
// If we find scenarios where `routing` needs to change, we can always expose
// it privately on the InstantSearch instance. Another way would be to
// manually inject the routing middleware in this library, and not rely
// on the provided `routing` prop.
- }
- var cleanupTimerRef = useRef(null);
- var store = useSyncExternalStore(useCallback(function () {
- var search = searchRef.current;
-
- // Scenario 1: the component mounts.
- if (cleanupTimerRef.current === null) {
- // On SSR, the instance is already started so we don't start it again.
- if (!search.started) {
- search.start();
- forceUpdate();
- }
}
- // Scenario 2: the component updates.
- else {
- // We cancel the previous cleanup function because we don't want to
- // dispose the search during an update.
- clearTimeout(cleanupTimerRef.current);
- search._preventWidgetCleanup = false;
- }
- return function () {
- if (serverState !== null && serverState !== void 0 && serverState.ssrSearchRef) {
- return;
- }
- function cleanup() {
- search.dispose();
- }
- clearTimeout(search._schedule.timer);
- // We clean up only when the component that uses this subscription unmounts,
- // but not when it updates, because it would dispose the instance, which
- // would remove all the widgets and break routing.
- // Executing the cleanup function in a `setTimeout()` lets us cancel it
- // in the next effect.
- // (There might be better ways to do this.)
- cleanupTimerRef.current = setTimeout(cleanup);
- // We need to prevent the `useWidget` cleanup function so that widgets
- // are not removed before the instance is disposed, triggering
- // an unwanted search request.
- search._preventWidgetCleanup = true;
- };
- }, [forceUpdate, serverState]), function () {
- return searchRef.current;
- }, function () {
- return searchRef.current;
- });
- return store;
+ var cleanupTimerRef = useRef(null);
+ var store = useSyncExternalStore(useCallback(function() {
+ var search = searchRef.current;
+ // Scenario 1: the component mounts.
+ if (cleanupTimerRef.current === null) {
+ // On SSR, the instance is already started so we don't start it again.
+ if (!search.started) {
+ search.start();
+ forceUpdate();
+ }
+ } else {
+ // We cancel the previous cleanup function because we don't want to
+ // dispose the search during an update.
+ clearTimeout(cleanupTimerRef.current);
+ search._preventWidgetCleanup = false;
+ }
+ return function() {
+ if (serverState === null || serverState === void 0 ? void 0 : serverState.ssrSearchRef) {
+ return;
+ }
+ function cleanup() {
+ search.dispose();
+ }
+ clearTimeout(search._schedule.timer);
+ // We clean up only when the component that uses this subscription unmounts,
+ // but not when it updates, because it would dispose the instance, which
+ // would remove all the widgets and break routing.
+ // Executing the cleanup function in a `setTimeout()` lets us cancel it
+ // in the next effect.
+ // (There might be better ways to do this.)
+ cleanupTimerRef.current = setTimeout(cleanup);
+ // We need to prevent the `useWidget` cleanup function so that widgets
+ // are not removed before the instance is disposed, triggering
+ // an unwanted search request.
+ search._preventWidgetCleanup = true;
+ };
+ }, [
+ forceUpdate,
+ serverState
+ ]), function() {
+ return searchRef.current;
+ }, function() {
+ return searchRef.current;
+ });
+ return store;
}
function addAlgoliaAgents(searchClient, userAgents) {
- if (typeof searchClient.addAlgoliaAgent !== 'function') {
- return;
- }
- userAgents.filter(Boolean).forEach(function (userAgent) {
- searchClient.addAlgoliaAgent(userAgent);
- });
+ if (typeof searchClient.addAlgoliaAgent !== 'function') {
+ return;
+ }
+ userAgents.filter(Boolean).forEach(function(userAgent) {
+ searchClient.addAlgoliaAgent(userAgent);
+ });
}
function warnNextRouter(routing) {
- if (process.env.NODE_ENV === 'development') {
- var _routing$router;
- if (!routing || typeof window === 'undefined' || !('__NEXT_DATA__' in window)) {
- return;
- }
- var isUsingNextRouter =
- // @ts-expect-error: _isNextRouter is only set on the Next.js router
- routing !== true && (routing === null || routing === void 0 ? void 0 : (_routing$router = routing.router) === null || _routing$router === void 0 ? void 0 : _routing$router._isNextRouter);
- process.env.NODE_ENV === 'development' ? warn(isUsingNextRouter, "\nYou are using Next.js with InstantSearch without the \"react-instantsearch-router-nextjs\" package.\nThis package is recommended to make the routing work correctly with Next.js.\nPlease check its usage instructions: https://github.com/algolia/instantsearch/tree/master/packages/react-instantsearch-router-nextjs\n\nYou can ignore this warning if you are using a custom router that suits your needs, it won't be outputted in production builds.") : void 0;
- }
}
-function warnNextAppDir(isRscContextDefined) {
- var _next;
- if (!(process.env.NODE_ENV === 'development') || typeof window === 'undefined' || isRscContextDefined) {
- return;
- }
- process.env.NODE_ENV === 'development' ? warn(Boolean((_next = window.next) === null || _next === void 0 ? void 0 : _next.appDir) === false, "\nWe've detected you are using Next.js with the App Router.\nWe released a package called \"react-instantsearch-nextjs\" that makes SSR work with the App Router.\nPlease check its usage instructions: https://www.algolia.com/doc/guides/building-search-ui/going-further/server-side-rendering/react/#with-nextjs-app-router\n\nThis warning will not be outputted in production builds.") : void 0;
-}
-
/**
* Gets the version of Next.js if it is available in the `window` object,
* otherwise it returns the NEXT_RUNTIME environment variable (in SSR),
* which is either `nodejs` or `edge`.
- */
-function getNextVersion() {
- var _next2, _process$env;
- return typeof window !== 'undefined' && ((_next2 = window.next) === null || _next2 === void 0 ? void 0 : _next2.version) || (typeof process !== 'undefined' ? (_process$env = process.env) === null || _process$env === void 0 ? void 0 : _process$env.NEXT_RUNTIME : undefined);
-}
\ No newline at end of file
+ */ function getNextVersion() {
+ var _window_next, _process_env;
+ return typeof window !== 'undefined' && ((_window_next = window.next) === null || _window_next === void 0 ? void 0 : _window_next.version) || (typeof process !== 'undefined' ? (_process_env = process.env) === null || _process_env === void 0 ? void 0 : _process_env.NEXT_RUNTIME : undefined);
+}
+
+export { useInstantSearchApi };