react-instantsearch-nextjs
Version:
React InstantSearch SSR utilities for Next.js
101 lines (98 loc) • 4.67 kB
JavaScript
import { _ as _$2 } from '@swc/helpers/esm/_object_spread.js';
import { _ as _$1 } from '@swc/helpers/esm/_object_spread_props.js';
import { _ } from '@swc/helpers/esm/_object_without_properties.js';
import { _ as _$3 } from '@swc/helpers/esm/_sliced_to_array.js';
import { safelyRunOnBrowser } from 'instantsearch.js/es/lib/utils/index.js';
import React, { useRef, useEffect, useState } from 'react';
import { InstantSearch, InstantSearchRSCContext, InstantSearchSSRContext } from 'react-instantsearch-core';
import { InitializePromise } from './InitializePromise.js';
import { TriggerSearch } from './TriggerSearch.js';
import { useDynamicRouteWarning } from './useDynamicRouteWarning.js';
import { useInstantSearchRouting } from './useInstantSearchRouting.js';
import { useNextHeaders } from './useNextHeaders.js';
var InstantSearchInitialResults = Symbol.for('InstantSearchInitialResults');
function createInstantSearchNextInstance() {
return {
current: null
};
}
function InstantSearchNext(_0) {
var children = _0.children, passedRouting = _0.routing, instance = _0.instance, _0_ignoreMultipleHooksWarning = _0.ignoreMultipleHooksWarning, ignoreMultipleHooksWarning = _0_ignoreMultipleHooksWarning === void 0 ? false : _0_ignoreMultipleHooksWarning, instantSearchProps = _(_0, [
"children",
"routing",
"instance",
"ignoreMultipleHooksWarning"
]);
var isMounting = useRef(true);
var isServer = typeof window === 'undefined';
useEffect(function() {
isMounting.current = false;
}, []);
var headers = useNextHeaders();
var nonce = safelyRunOnBrowser(function() {
return undefined;
}, {
fallback: function fallback() {
return (headers === null || headers === void 0 ? void 0 : headers.get('x-nonce')) || undefined;
}
});
useDynamicRouteWarning({
isServer: isServer,
isMounting: isMounting,
instance: instance
});
var routing = useInstantSearchRouting(passedRouting, isMounting);
return /*#__PURE__*/ React.createElement(ServerOrHydrationProvider, {
isServer: isServer,
instance: instance,
ignoreMultipleHooksWarning: ignoreMultipleHooksWarning
}, /*#__PURE__*/ React.createElement(InstantSearch, _$1(_$2({}, instantSearchProps), {
routing: routing
}), isServer && /*#__PURE__*/ React.createElement(InitializePromise, {
nonce: nonce
}), children, isServer && /*#__PURE__*/ React.createElement(TriggerSearch, null)));
}
function ServerOrHydrationProvider(param) {
var isServer = param.isServer, children = param.children, instance = param.instance, ignoreMultipleHooksWarning = param.ignoreMultipleHooksWarning;
var promiseRef = useRef(null);
var resolvePromiseRef = useRef(null);
var countRef = useRef(0);
// Capture once on first render. Side-effect-free read keeps hydration
// deterministic across StrictMode double-invocation and React 19 / Next.js
// metadata streaming re-renders.
var _useState = _$3(useState(function() {
return safelyRunOnBrowser(function(param) {
var window1 = param.window;
return window1[InstantSearchInitialResults];
});
}), 1), initialResults = _useState[0];
// After commit, clear the global so a later <InstantSearchNext> mount —
// typically the destination of an App Router <Link> click — does not
// recycle this mount's serialized state.
useEffect(function() {
safelyRunOnBrowser(function(param) {
var window1 = param.window;
if (window1[InstantSearchInitialResults] !== undefined) {
window1[InstantSearchInitialResults] = undefined;
}
});
}, []);
// `useInstantSearchApi` reads a truthy `waitForResultsRef` as "SSR results
// are arriving" and skips the initial search. On client mounts without
// results (typical for SPA navigation) we must let it fall through.
var rscWaitRef = !isServer && !initialResults ? null : promiseRef;
return /*#__PURE__*/ React.createElement(InstantSearchRSCContext.Provider, {
value: {
waitForResultsRef: rscWaitRef,
resolveWaitForResultsRef: resolvePromiseRef,
countRef: countRef,
ignoreMultipleHooksWarning: ignoreMultipleHooksWarning
}
}, /*#__PURE__*/ React.createElement(InstantSearchSSRContext.Provider, {
value: {
initialResults: initialResults,
ssrSearchRef: isServer ? undefined : instance
}
}, children));
}
export { InstantSearchNext, createInstantSearchNextInstance };