react-instantsearch-nextjs
Version:
React InstantSearch SSR utilities for Next.js
135 lines (133 loc) • 5.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "InitializePromise", {
enumerable: true,
get: function() {
return InitializePromise;
}
});
var _object_spread = require("@swc/helpers/_/_object_spread");
var _object_spread_props = require("@swc/helpers/_/_object_spread_props");
var _server = require("instantsearch.js/cjs/lib/server");
var _utils = require("instantsearch.js/cjs/lib/utils");
var _navigation = require("next/navigation");
var _react = require("react");
var _reactinstantsearchcore = require("react-instantsearch-core");
var _createInsertHTML = require("./createInsertHTML");
function isWithinIsolatedIndex(index) {
var current = index;
while(current){
if (current._isolated) {
return true;
}
current = current.getParent();
}
return false;
}
function InitializePromise(param) {
var nonce = param.nonce;
var search = (0, _reactinstantsearchcore.useInstantSearchContext)();
var _useRSCContext = (0, _reactinstantsearchcore.useRSCContext)(), waitForResultsRef = _useRSCContext.waitForResultsRef, resolveWaitForResultsRef = _useRSCContext.resolveWaitForResultsRef;
var insertHTML = (0, _react.useContext)(_navigation.ServerInsertedHTMLContext) || function() {
throw new Error('Missing ServerInsertedHTMLContext');
};
// Extract search parameters from the search client to use them
// later during hydration.
var requestParamsList;
if (search.compositionID) {
search.mainHelper.setClient(_object_spread_props._(_object_spread._({}, search.mainHelper.getClient()), {
search: function search1(query) {
requestParamsList = [
query.requestBody.params
];
return search.client.search(query);
}
}));
} else {
search.mainHelper.setClient(_object_spread_props._(_object_spread._({}, search.mainHelper.getClient()), {
search: function search1(queries) {
requestParamsList = queries.map(function(param) {
var params = param.params;
return params;
});
return search.client.search(queries);
}
}));
}
(0, _utils.resetWidgetId)();
var waitForResults = function waitForResults() {
return new Promise(function(resolve) {
var searchReceived = false;
var recommendReceived = false;
var settled = false;
var derivedHelper = search.mainHelper.derivedHelpers[0];
var settle = function settle() {
if (settled) {
return;
}
settled = true;
if (resolveWaitForResultsRef) {
resolveWaitForResultsRef.current = null;
}
resolve();
};
var onResult = function onResult() {
searchReceived = true;
if (!search._hasRecommendWidget || recommendReceived) {
settle();
}
};
var onRecommendResult = function onRecommendResult() {
recommendReceived = true;
if (!search._hasSearchWidget || searchReceived) {
settle();
}
};
if (resolveWaitForResultsRef) {
resolveWaitForResultsRef.current = function() {
derivedHelper.removeListener('result', onResult);
derivedHelper.removeListener('recommend:result', onRecommendResult);
settle();
};
}
derivedHelper.once('result', onResult);
derivedHelper.once('recommend:result', onRecommendResult);
});
};
var injectInitialResults = function injectInitialResults() {
var options = {
inserted: false
};
var results = (0, _server.getInitialResults)(search.mainIndex, search._hasSearchWidget ? requestParamsList || [] : []);
insertHTML((0, _createInsertHTML.createInsertHTML)({
options: options,
results: results,
nonce: nonce
}));
};
if ((waitForResultsRef === null || waitForResultsRef === void 0 ? void 0 : waitForResultsRef.current) === null) {
waitForResultsRef.current = (0, _reactinstantsearchcore.wrapPromiseWithState)(waitForResults().then(function() {
var shouldRefetch = false;
(0, _utils.walkIndex)(search.mainIndex, function(index) {
if (isWithinIsolatedIndex(index)) {
return;
}
shouldRefetch = shouldRefetch || index.getWidgets().some(_utils.isTwoPassWidget);
});
if (shouldRefetch) {
var _search__resetScheduleSearch;
(_search__resetScheduleSearch = search._resetScheduleSearch) === null || _search__resetScheduleSearch === void 0 ? void 0 : _search__resetScheduleSearch.call(search);
waitForResultsRef.current = (0, _reactinstantsearchcore.wrapPromiseWithState)(waitForResults().then(injectInitialResults));
}
return shouldRefetch;
}).then(function(shouldRefetch) {
if (shouldRefetch) {
return;
}
injectInitialResults();
}));
}
return null;
}