react-instantsearch-nextjs
Version:
React InstantSearch SSR utilities for Next.js
118 lines (116 loc) • 5.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: Object.getOwnPropertyDescriptor(all, name).get
});
}
_export(exports, {
get InstantSearchNext () {
return InstantSearchNext;
},
get createInstantSearchNextInstance () {
return createInstantSearchNextInstance;
}
});
var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
var _object_spread = require("@swc/helpers/_/_object_spread");
var _object_spread_props = require("@swc/helpers/_/_object_spread_props");
var _object_without_properties = require("@swc/helpers/_/_object_without_properties");
var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array");
var _utils = require("instantsearch.js/cjs/lib/utils");
var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
var _reactinstantsearchcore = require("react-instantsearch-core");
var _InitializePromise = require("./InitializePromise");
var _TriggerSearch = require("./TriggerSearch");
var _useDynamicRouteWarning = require("./useDynamicRouteWarning");
var _useInstantSearchRouting = require("./useInstantSearchRouting");
var _useNextHeaders = require("./useNextHeaders");
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 = _object_without_properties._(_0, [
"children",
"routing",
"instance",
"ignoreMultipleHooksWarning"
]);
var isMounting = (0, _react.useRef)(true);
var isServer = typeof window === 'undefined';
(0, _react.useEffect)(function() {
isMounting.current = false;
}, []);
var headers = (0, _useNextHeaders.useNextHeaders)();
var nonce = (0, _utils.safelyRunOnBrowser)(function() {
return undefined;
}, {
fallback: function fallback() {
return (headers === null || headers === void 0 ? void 0 : headers.get('x-nonce')) || undefined;
}
});
(0, _useDynamicRouteWarning.useDynamicRouteWarning)({
isServer: isServer,
isMounting: isMounting,
instance: instance
});
var routing = (0, _useInstantSearchRouting.useInstantSearchRouting)(passedRouting, isMounting);
return /*#__PURE__*/ _react.default.createElement(ServerOrHydrationProvider, {
isServer: isServer,
instance: instance,
ignoreMultipleHooksWarning: ignoreMultipleHooksWarning
}, /*#__PURE__*/ _react.default.createElement(_reactinstantsearchcore.InstantSearch, _object_spread_props._(_object_spread._({}, instantSearchProps), {
routing: routing
}), isServer && /*#__PURE__*/ _react.default.createElement(_InitializePromise.InitializePromise, {
nonce: nonce
}), children, isServer && /*#__PURE__*/ _react.default.createElement(_TriggerSearch.TriggerSearch, null)));
}
function ServerOrHydrationProvider(param) {
var isServer = param.isServer, children = param.children, instance = param.instance, ignoreMultipleHooksWarning = param.ignoreMultipleHooksWarning;
var promiseRef = (0, _react.useRef)(null);
var resolvePromiseRef = (0, _react.useRef)(null);
var countRef = (0, _react.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 = _sliced_to_array._((0, _react.useState)(function() {
return (0, _utils.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.
(0, _react.useEffect)(function() {
(0, _utils.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.default.createElement(_reactinstantsearchcore.InstantSearchRSCContext.Provider, {
value: {
waitForResultsRef: rscWaitRef,
resolveWaitForResultsRef: resolvePromiseRef,
countRef: countRef,
ignoreMultipleHooksWarning: ignoreMultipleHooksWarning
}
}, /*#__PURE__*/ _react.default.createElement(_reactinstantsearchcore.InstantSearchSSRContext.Provider, {
value: {
initialResults: initialResults,
ssrSearchRef: isServer ? undefined : instance
}
}, children));
}