react-instantsearch-core 7.9.0 → 7.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,9 @@ function InstantSearchSSRProvider(_ref) {
27
27
  // `InstantSearch` on mount.
28
28
  var ssrSearchRef = _react.default.useRef(null);
29
29
 
30
+ // This is used to re-map the result index to the requesting widget
31
+ var recommendIdx = _react.default.useRef(0);
32
+
30
33
  // When <DynamicWidgets> is mounted, a second provider is used above the user-land
31
34
  // <InstantSearchSSRProvider> in `getServerState()`.
32
35
  // To avoid the user's provider overriding the context value with an empty object,
@@ -36,7 +39,8 @@ function InstantSearchSSRProvider(_ref) {
36
39
  }
37
40
  return /*#__PURE__*/_react.default.createElement(_InstantSearchSSRContext.InstantSearchSSRContext.Provider, {
38
41
  value: _objectSpread(_objectSpread({}, props), {}, {
39
- ssrSearchRef: ssrSearchRef
42
+ ssrSearchRef: ssrSearchRef,
43
+ recommendIdx: recommendIdx
40
44
  })
41
45
  }, children);
42
46
  }
@@ -11,6 +11,7 @@ var _getIndexSearchResults = require("../lib/getIndexSearchResults");
11
11
  var _useIndexContext = require("../lib/useIndexContext");
12
12
  var _useInstantSearchContext = require("../lib/useInstantSearchContext");
13
13
  var _useInstantSearchServerContext = require("../lib/useInstantSearchServerContext");
14
+ var _useInstantSearchSSRContext = require("../lib/useInstantSearchSSRContext");
14
15
  var _useStableValue = require("../lib/useStableValue");
15
16
  var _useWidget = require("../lib/useWidget");
16
17
  var _excluded = ["instantSearchInstance", "widgetParams"],
@@ -32,6 +33,7 @@ function useConnector(connector) {
32
33
  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
33
34
  var additionalWidgetProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
34
35
  var serverContext = (0, _useInstantSearchServerContext.useInstantSearchServerContext)();
36
+ var ssrContext = (0, _useInstantSearchSSRContext.useInstantSearchSSRContext)();
35
37
  var search = (0, _useInstantSearchContext.useInstantSearchContext)();
36
38
  var parentIndex = (0, _useIndexContext.useIndexContext)();
37
39
  var stableProps = (0, _useStableValue.useStableValue)(props);
@@ -96,7 +98,8 @@ function useConnector(connector) {
96
98
  })) || helper.state;
97
99
  var _getIndexSearchResult = (0, _getIndexSearchResults.getIndexSearchResults)(parentIndex),
98
100
  results = _getIndexSearchResult.results,
99
- scopedResults = _getIndexSearchResult.scopedResults;
101
+ scopedResults = _getIndexSearchResult.scopedResults,
102
+ recommendResults = _getIndexSearchResult.recommendResults;
100
103
 
101
104
  // We get the widget render state by providing the same parameters as
102
105
  // InstantSearch provides to the widget's `render` method.
@@ -105,10 +108,7 @@ function useConnector(connector) {
105
108
  helper: helper,
106
109
  parent: parentIndex,
107
110
  instantSearchInstance: search,
108
- results: widget.dependsOn === 'recommend' ?
109
- // @TODO: this is to avoid using wrong hits in SSR,
110
- // will be replace with SSR support for recommend
111
- null : results,
111
+ results: widget.dependsOn === 'recommend' && recommendResults && ssrContext ? recommendResults[ssrContext.recommendIdx.current++] : results,
112
112
  scopedResults: scopedResults,
113
113
  state: helper.state,
114
114
  renderState: search.renderState,
@@ -27,6 +27,7 @@ function getIndexSearchResults(indexWidget) {
27
27
  });
28
28
  return {
29
29
  results: results,
30
- scopedResults: scopedResults
30
+ scopedResults: scopedResults,
31
+ recommendResults: helper.lastRecommendResults
31
32
  };
32
33
  }
@@ -19,7 +19,12 @@ function useSearchResults() {
19
19
  var search = (0, _useInstantSearchContext.useInstantSearchContext)();
20
20
  var searchIndex = (0, _useIndexContext.useIndexContext)();
21
21
  var _useState = (0, _react.useState)(function () {
22
- return (0, _getIndexSearchResults.getIndexSearchResults)(searchIndex);
22
+ var indexSearchResults = (0, _getIndexSearchResults.getIndexSearchResults)(searchIndex);
23
+ // We do this not to leak `recommendResults` in the API.
24
+ return {
25
+ results: indexSearchResults.results,
26
+ scopedResults: indexSearchResults.scopedResults
27
+ };
23
28
  }),
24
29
  _useState2 = _slicedToArray(_useState, 2),
25
30
  searchResults = _useState2[0],
@@ -17,6 +17,7 @@ function getServerState(children, _ref) {
17
17
  var searchRef = {
18
18
  current: undefined
19
19
  };
20
+ (0, _utils.resetWidgetId)();
20
21
  var createNotifyServer = function createNotifyServer() {
21
22
  var hasBeenNotified = false;
22
23
  var notifyServer = function notifyServer(_ref2) {
@@ -45,11 +46,13 @@ function getServerState(children, _ref) {
45
46
  });
46
47
  });
47
48
  if (shouldRefetch) {
49
+ (0, _utils.resetWidgetId)();
48
50
  return execute({
49
51
  children: /*#__PURE__*/_react.default.createElement(_.InstantSearchSSRProvider, serverState, children),
50
52
  renderToString: renderToString,
51
53
  searchRef: searchRef,
52
- notifyServer: createNotifyServer()
54
+ notifyServer: createNotifyServer(),
55
+ skipRecommend: true
53
56
  });
54
57
  }
55
58
  return serverState;
@@ -59,7 +62,8 @@ function execute(_ref3) {
59
62
  var children = _ref3.children,
60
63
  renderToString = _ref3.renderToString,
61
64
  notifyServer = _ref3.notifyServer,
62
- searchRef = _ref3.searchRef;
65
+ searchRef = _ref3.searchRef,
66
+ skipRecommend = _ref3.skipRecommend;
63
67
  return Promise.resolve().then(function () {
64
68
  renderToString( /*#__PURE__*/_react.default.createElement(_.InstantSearchServerContext.Provider, {
65
69
  value: {
@@ -84,7 +88,7 @@ function execute(_ref3) {
84
88
  if (!searchRef.current) {
85
89
  throw new Error("Unable to retrieve InstantSearch's server state in `getServerState()`. Did you mount the <InstantSearch> component?");
86
90
  }
87
- return (0, _server.waitForResults)(searchRef.current);
91
+ return (0, _server.waitForResults)(searchRef.current, skipRecommend);
88
92
  }).then(function (requestParamsList) {
89
93
  return {
90
94
  initialResults: (0, _server.getInitialResults)(searchRef.current.mainIndex, requestParamsList)
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = '7.9.0';
7
+ var _default = '7.11.0';
8
8
  exports.default = _default;
@@ -20,6 +20,9 @@ export function InstantSearchSSRProvider(_ref) {
20
20
  // `InstantSearch` on mount.
21
21
  var ssrSearchRef = React.useRef(null);
22
22
 
23
+ // This is used to re-map the result index to the requesting widget
24
+ var recommendIdx = React.useRef(0);
25
+
23
26
  // When <DynamicWidgets> is mounted, a second provider is used above the user-land
24
27
  // <InstantSearchSSRProvider> in `getServerState()`.
25
28
  // To avoid the user's provider overriding the context value with an empty object,
@@ -29,7 +32,8 @@ export function InstantSearchSSRProvider(_ref) {
29
32
  }
30
33
  return /*#__PURE__*/React.createElement(InstantSearchSSRContext.Provider, {
31
34
  value: _objectSpread(_objectSpread({}, props), {}, {
32
- ssrSearchRef: ssrSearchRef
35
+ ssrSearchRef: ssrSearchRef,
36
+ recommendIdx: recommendIdx
33
37
  })
34
38
  }, children);
35
39
  }
@@ -1,6 +1,5 @@
1
1
  import type { AdditionalWidgetProperties } from '../hooks/useConnector';
2
- import type { BaseHit } from 'instantsearch.js';
2
+ import type { GeoHit } from 'instantsearch.js';
3
3
  import type { GeoSearchConnectorParams } from 'instantsearch.js/es/connectors/geo-search/connectGeoSearch';
4
- export type { GeoHit } from 'instantsearch.js/es/connectors/geo-search/connectGeoSearch';
5
- export type UseGeoSearchProps<THit extends BaseHit = BaseHit> = GeoSearchConnectorParams<THit>;
6
- export declare function useGeoSearch<THit extends BaseHit>(props?: UseGeoSearchProps<THit>, additionalWidgetProperties?: AdditionalWidgetProperties): import("instantsearch.js/es/connectors/geo-search/connectGeoSearch").GeoSearchRenderState<THit>;
4
+ export type UseGeoSearchProps<THit extends GeoHit = GeoHit> = GeoSearchConnectorParams<THit>;
5
+ export declare function useGeoSearch<THit extends GeoHit>(props?: UseGeoSearchProps<THit>, additionalWidgetProperties?: AdditionalWidgetProperties): import("instantsearch.js/es/connectors/geo-search/connectGeoSearch").GeoSearchRenderState<THit>;
@@ -20,12 +20,14 @@ import { getIndexSearchResults } from "../lib/getIndexSearchResults.js";
20
20
  import { useIndexContext } from "../lib/useIndexContext.js";
21
21
  import { useInstantSearchContext } from "../lib/useInstantSearchContext.js";
22
22
  import { useInstantSearchServerContext } from "../lib/useInstantSearchServerContext.js";
23
+ import { useInstantSearchSSRContext } from "../lib/useInstantSearchSSRContext.js";
23
24
  import { useStableValue } from "../lib/useStableValue.js";
24
25
  import { useWidget } from "../lib/useWidget.js";
25
26
  export function useConnector(connector) {
26
27
  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
27
28
  var additionalWidgetProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
28
29
  var serverContext = useInstantSearchServerContext();
30
+ var ssrContext = useInstantSearchSSRContext();
29
31
  var search = useInstantSearchContext();
30
32
  var parentIndex = useIndexContext();
31
33
  var stableProps = useStableValue(props);
@@ -90,7 +92,8 @@ export function useConnector(connector) {
90
92
  })) || helper.state;
91
93
  var _getIndexSearchResult = getIndexSearchResults(parentIndex),
92
94
  results = _getIndexSearchResult.results,
93
- scopedResults = _getIndexSearchResult.scopedResults;
95
+ scopedResults = _getIndexSearchResult.scopedResults,
96
+ recommendResults = _getIndexSearchResult.recommendResults;
94
97
 
95
98
  // We get the widget render state by providing the same parameters as
96
99
  // InstantSearch provides to the widget's `render` method.
@@ -99,10 +102,7 @@ export function useConnector(connector) {
99
102
  helper: helper,
100
103
  parent: parentIndex,
101
104
  instantSearchInstance: search,
102
- results: widget.dependsOn === 'recommend' ?
103
- // @TODO: this is to avoid using wrong hits in SSR,
104
- // will be replace with SSR support for recommend
105
- null : results,
105
+ results: widget.dependsOn === 'recommend' && recommendResults && ssrContext ? recommendResults[ssrContext.recommendIdx.current++] : results,
106
106
  scopedResults: scopedResults,
107
107
  state: helper.state,
108
108
  renderState: search.renderState,
@@ -4,5 +4,6 @@ import type { UiState } from 'instantsearch.js';
4
4
  import type { MutableRefObject } from 'react';
5
5
  export type InstantSearchSSRContextApi<TUiState extends UiState, TRouteState = TUiState> = InstantSearchServerState & {
6
6
  ssrSearchRef: MutableRefObject<InternalInstantSearch<TUiState, TRouteState> | null>;
7
+ recommendIdx: MutableRefObject<number>;
7
8
  };
8
9
  export declare const InstantSearchSSRContext: import("react").Context<Partial<InstantSearchSSRContextApi<UiState, UiState>> | null>;
@@ -6,4 +6,5 @@ export declare function getIndexSearchResults(indexWidget: IndexWidget): {
6
6
  indexId: string;
7
7
  helper: import("algoliasearch-helper").AlgoliaSearchHelper;
8
8
  }[];
9
+ recommendResults: import("algoliasearch-helper").RecommendResults<any> | null;
9
10
  };
@@ -21,6 +21,7 @@ export function getIndexSearchResults(indexWidget) {
21
21
  });
22
22
  return {
23
23
  results: results,
24
- scopedResults: scopedResults
24
+ scopedResults: scopedResults,
25
+ recommendResults: helper.lastRecommendResults
25
26
  };
26
27
  }
@@ -13,7 +13,12 @@ export function useSearchResults() {
13
13
  var search = useInstantSearchContext();
14
14
  var searchIndex = useIndexContext();
15
15
  var _useState = useState(function () {
16
- return getIndexSearchResults(searchIndex);
16
+ var indexSearchResults = getIndexSearchResults(searchIndex);
17
+ // We do this not to leak `recommendResults` in the API.
18
+ return {
19
+ results: indexSearchResults.results,
20
+ scopedResults: indexSearchResults.scopedResults
21
+ };
17
22
  }),
18
23
  _useState2 = _slicedToArray(_useState, 2),
19
24
  searchResults = _useState2[0],
@@ -1,5 +1,5 @@
1
1
  import { getInitialResults, waitForResults } from "instantsearch.js/es/lib/server.js";
2
- import { walkIndex } from "instantsearch.js/es/lib/utils/index.js";
2
+ import { walkIndex, resetWidgetId } from "instantsearch.js/es/lib/utils/index.js";
3
3
  import React from 'react';
4
4
  import { InstantSearchServerContext, InstantSearchSSRProvider } from "../index.js";
5
5
  /**
@@ -10,6 +10,7 @@ export function getServerState(children, _ref) {
10
10
  var searchRef = {
11
11
  current: undefined
12
12
  };
13
+ resetWidgetId();
13
14
  var createNotifyServer = function createNotifyServer() {
14
15
  var hasBeenNotified = false;
15
16
  var notifyServer = function notifyServer(_ref2) {
@@ -38,11 +39,13 @@ export function getServerState(children, _ref) {
38
39
  });
39
40
  });
40
41
  if (shouldRefetch) {
42
+ resetWidgetId();
41
43
  return execute({
42
44
  children: /*#__PURE__*/React.createElement(InstantSearchSSRProvider, serverState, children),
43
45
  renderToString: renderToString,
44
46
  searchRef: searchRef,
45
- notifyServer: createNotifyServer()
47
+ notifyServer: createNotifyServer(),
48
+ skipRecommend: true
46
49
  });
47
50
  }
48
51
  return serverState;
@@ -52,7 +55,8 @@ function execute(_ref3) {
52
55
  var children = _ref3.children,
53
56
  renderToString = _ref3.renderToString,
54
57
  notifyServer = _ref3.notifyServer,
55
- searchRef = _ref3.searchRef;
58
+ searchRef = _ref3.searchRef,
59
+ skipRecommend = _ref3.skipRecommend;
56
60
  return Promise.resolve().then(function () {
57
61
  renderToString( /*#__PURE__*/React.createElement(InstantSearchServerContext.Provider, {
58
62
  value: {
@@ -77,7 +81,7 @@ function execute(_ref3) {
77
81
  if (!searchRef.current) {
78
82
  throw new Error("Unable to retrieve InstantSearch's server state in `getServerState()`. Did you mount the <InstantSearch> component?");
79
83
  }
80
- return waitForResults(searchRef.current);
84
+ return waitForResults(searchRef.current, skipRecommend);
81
85
  }).then(function (requestParamsList) {
82
86
  return {
83
87
  initialResults: getInitialResults(searchRef.current.mainIndex, requestParamsList)
@@ -1,2 +1,2 @@
1
- declare const _default: "7.9.0";
1
+ declare const _default: "7.11.0";
2
2
  export default _default;
@@ -1 +1 @@
1
- export default '7.9.0';
1
+ export default '7.11.0';