react-instantsearch-core 7.42.0 → 7.44.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.
@@ -24,6 +24,10 @@ function InstantSearchSSRProvider(_0) {
24
24
  var ssrSearchRef = _react.default.useRef(null);
25
25
  // This is used to re-map the result index to the requesting widget
26
26
  var recommendIdx = _react.default.useRef(0);
27
+ var hydrationCompleteRef = _react.default.useRef(false);
28
+ _react.default.useEffect(function() {
29
+ hydrationCompleteRef.current = true;
30
+ }, []);
27
31
  // When <DynamicWidgets> is mounted, a second provider is used above the user-land
28
32
  // <InstantSearchSSRProvider> in `getServerState()`.
29
33
  // To avoid the user's provider overriding the context value with an empty object,
@@ -31,10 +35,12 @@ function InstantSearchSSRProvider(_0) {
31
35
  if (Object.keys(props).length === 0) {
32
36
  return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, children);
33
37
  }
38
+ var contextValue = _object_spread_props._(_object_spread._({}, props), {
39
+ ssrSearchRef: ssrSearchRef,
40
+ recommendIdx: recommendIdx,
41
+ hydrationCompleteRef: hydrationCompleteRef
42
+ });
34
43
  return /*#__PURE__*/ _react.default.createElement(_InstantSearchSSRContext.InstantSearchSSRContext.Provider, {
35
- value: _object_spread_props._(_object_spread._({}, props), {
36
- ssrSearchRef: ssrSearchRef,
37
- recommendIdx: recommendIdx
38
- })
44
+ value: contextValue
39
45
  }, children);
40
46
  }
@@ -37,6 +37,7 @@ function useChat(props, additionalWidgetProperties) {
37
37
  error: undefined,
38
38
  id: 'id' in props && props.id || '',
39
39
  messages: [],
40
+ open: false,
40
41
  status: 'ready',
41
42
  suggestions: undefined
42
43
  });
@@ -32,17 +32,15 @@ function useNativeIsHydrated() {
32
32
  // `InstantSearchSSRProvider` flow: the server context covers state collection,
33
33
  // and the SSR context covers HTML rendering and hydration.
34
34
  //
35
- // This can cost an extra render: a mount inside a provider that carries server
36
- // state is withheld once even when there is no server markup to reproduce. A
37
- // mount outside both contexts is never withheld.
38
- //
39
35
  // The shim's React 16 and 17 fallback ignores the server snapshot, so using it
40
- // here would not change this limitation.
36
+ // here would not distinguish initial hydration from later provider children.
41
37
  function useLegacyIsHydrated() {
38
+ var _ssrContext_hydrationCompleteRef;
42
39
  var serverContext = (0, _useInstantSearchServerContext.useInstantSearchServerContext)();
43
40
  var ssrContext = (0, _useInstantSearchSSRContext.useInstantSearchSSRContext)();
44
41
  var isServerRendered = serverContext !== null || ssrContext !== null;
45
- var _React_useState = _sliced_to_array._(_react.useState(!isServerRendered), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
42
+ var isProviderHydrated = (ssrContext === null || ssrContext === void 0 ? void 0 : (_ssrContext_hydrationCompleteRef = ssrContext.hydrationCompleteRef) === null || _ssrContext_hydrationCompleteRef === void 0 ? void 0 : _ssrContext_hydrationCompleteRef.current) === true;
43
+ var _React_useState = _sliced_to_array._(_react.useState(!isServerRendered || isProviderHydrated), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
46
44
  _react.useEffect(function() {
47
45
  setIsHydrated(true);
48
46
  }, []);
@@ -9,4 +9,4 @@ Object.defineProperty(exports, "default", {
9
9
  return _default;
10
10
  }
11
11
  });
12
- var _default = '7.42.0';
12
+ var _default = '7.44.0';
@@ -16,6 +16,10 @@ import { InstantSearchSSRContext } from '../lib/InstantSearchSSRContext.js';
16
16
  var ssrSearchRef = React__default.useRef(null);
17
17
  // This is used to re-map the result index to the requesting widget
18
18
  var recommendIdx = React__default.useRef(0);
19
+ var hydrationCompleteRef = React__default.useRef(false);
20
+ React__default.useEffect(function() {
21
+ hydrationCompleteRef.current = true;
22
+ }, []);
19
23
  // When <DynamicWidgets> is mounted, a second provider is used above the user-land
20
24
  // <InstantSearchSSRProvider> in `getServerState()`.
21
25
  // To avoid the user's provider overriding the context value with an empty object,
@@ -23,11 +27,13 @@ import { InstantSearchSSRContext } from '../lib/InstantSearchSSRContext.js';
23
27
  if (Object.keys(props).length === 0) {
24
28
  return /*#__PURE__*/ React__default.createElement(React__default.Fragment, null, children);
25
29
  }
30
+ var contextValue = _$1(_$2({}, props), {
31
+ ssrSearchRef: ssrSearchRef,
32
+ recommendIdx: recommendIdx,
33
+ hydrationCompleteRef: hydrationCompleteRef
34
+ });
26
35
  return /*#__PURE__*/ React__default.createElement(InstantSearchSSRContext.Provider, {
27
- value: _$1(_$2({}, props), {
28
- ssrSearchRef: ssrSearchRef,
29
- recommendIdx: recommendIdx
30
- })
36
+ value: contextValue
31
37
  }, children);
32
38
  }
33
39
 
@@ -26,6 +26,7 @@ function useChat(props, additionalWidgetProperties) {
26
26
  error: undefined,
27
27
  id: 'id' in props && props.id || '',
28
28
  messages: [],
29
+ open: false,
29
30
  status: 'ready',
30
31
  suggestions: undefined
31
32
  });
@@ -21,17 +21,15 @@ function useNativeIsHydrated() {
21
21
  // `InstantSearchSSRProvider` flow: the server context covers state collection,
22
22
  // and the SSR context covers HTML rendering and hydration.
23
23
  //
24
- // This can cost an extra render: a mount inside a provider that carries server
25
- // state is withheld once even when there is no server markup to reproduce. A
26
- // mount outside both contexts is never withheld.
27
- //
28
24
  // The shim's React 16 and 17 fallback ignores the server snapshot, so using it
29
- // here would not change this limitation.
25
+ // here would not distinguish initial hydration from later provider children.
30
26
  function useLegacyIsHydrated() {
27
+ var _ssrContext_hydrationCompleteRef;
31
28
  var serverContext = useInstantSearchServerContext();
32
29
  var ssrContext = useInstantSearchSSRContext();
33
30
  var isServerRendered = serverContext !== null || ssrContext !== null;
34
- var _React_useState = _(React.useState(!isServerRendered), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
31
+ var isProviderHydrated = (ssrContext === null || ssrContext === void 0 ? void 0 : (_ssrContext_hydrationCompleteRef = ssrContext.hydrationCompleteRef) === null || _ssrContext_hydrationCompleteRef === void 0 ? void 0 : _ssrContext_hydrationCompleteRef.current) === true;
32
+ var _React_useState = _(React.useState(!isServerRendered || isProviderHydrated), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
35
33
  React.useEffect(function() {
36
34
  setIsHydrated(true);
37
35
  }, []);
@@ -1,7 +1,7 @@
1
- import { useLayoutEffect } from 'react';
1
+ import { useEffect } from 'react';
2
2
  /**
3
3
  * `useLayoutEffect` that doesn't show a warning when server-side rendering.
4
4
  *
5
5
  * It uses `useEffect` on the server (no-op), and `useLayoutEffect` on the browser.
6
6
  */
7
- export declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
7
+ export declare const useIsomorphicLayoutEffect: typeof useEffect;
@@ -1,2 +1,2 @@
1
- declare const _default: "7.42.0";
1
+ declare const _default: "7.44.0";
2
2
  export default _default;
@@ -1,3 +1,3 @@
1
- var version = '7.42.0';
1
+ var version = '7.44.0';
2
2
 
3
3
  export { version as default };
@@ -1,4 +1,4 @@
1
- /*! React InstantSearch Core 7.42.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
1
+ /*! React InstantSearch Core 7.44.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
2
2
  (function (global, factory) {
3
3
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
4
4
  typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
@@ -24,7 +24,7 @@
24
24
 
25
25
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
26
26
 
27
- var version$2 = '7.42.0';
27
+ var version$2 = '7.44.0';
28
28
 
29
29
  function _define_property(obj, key, value) {
30
30
  if (key in obj) {
@@ -6291,22 +6291,29 @@
6291
6291
  *
6292
6292
  * Parameters set on a widget win, so an explicit `queryParameters.userToken`
6293
6293
  * keeps overriding the middleware.
6294
+ *
6295
+ * The fallback query is a regular search, so it gets the same treatment — but
6296
+ * only merged into a `fallbackParameters` the widget already set. See below.
6294
6297
  */ function addInsightsToRecommendParameters(recommendParameters, param) {
6295
6298
  var userToken = param.userToken, clickAnalytics = param.clickAnalytics;
6296
6299
  if (userToken === undefined && clickAnalytics === undefined) {
6297
6300
  return recommendParameters;
6298
6301
  }
6302
+ var insightsParameters = _object_spread({}, clickAnalytics === undefined ? {} : {
6303
+ clickAnalytics: clickAnalytics
6304
+ }, userToken === undefined ? {} : {
6305
+ userToken: userToken
6306
+ });
6299
6307
  return new algoliasearchHelper.RecommendParameters({
6300
6308
  params: recommendParameters.params.map(function(params) {
6301
- // v4 `TrendingFacetsQuery` doesn't include `queryParameters`, but the v5
6302
- // API and the helper support them, like `connectTrendingFacets` does.
6303
- var queryParameters = params.queryParameters;
6304
- return _object_spread_props(_object_spread({}, params), {
6305
- queryParameters: _object_spread({}, clickAnalytics === undefined ? {} : {
6306
- clickAnalytics: clickAnalytics
6307
- }, userToken === undefined ? {} : {
6308
- userToken: userToken
6309
- }, queryParameters)
6309
+ // v4 `TrendingFacetsQuery` doesn't include `queryParameters` or
6310
+ // `fallbackParameters`, but the v5 API and the helper support them, like
6311
+ // `connectTrendingFacets` does.
6312
+ var queryParameters = params.queryParameters, fallbackParameters = params.fallbackParameters;
6313
+ return _object_spread(_object_spread_props(_object_spread({}, params), {
6314
+ queryParameters: _object_spread({}, insightsParameters, queryParameters)
6315
+ }), fallbackParameters && {
6316
+ fallbackParameters: _object_spread({}, insightsParameters, fallbackParameters)
6310
6317
  });
6311
6318
  })
6312
6319
  });
@@ -9242,7 +9249,7 @@
9242
9249
  });
9243
9250
  }
9244
9251
 
9245
- var version = '4.109.0';
9252
+ var version = '4.111.0';
9246
9253
 
9247
9254
  var ANONYMOUS_TOKEN_COOKIE_KEY = '_ALGOLIA';
9248
9255
  function getCookie(name) {
@@ -12138,6 +12145,10 @@
12138
12145
  var ssrSearchRef = React.useRef(null);
12139
12146
  // This is used to re-map the result index to the requesting widget
12140
12147
  var recommendIdx = React.useRef(0);
12148
+ var hydrationCompleteRef = React.useRef(false);
12149
+ React.useEffect(function() {
12150
+ hydrationCompleteRef.current = true;
12151
+ }, []);
12141
12152
  // When <DynamicWidgets> is mounted, a second provider is used above the user-land
12142
12153
  // <InstantSearchSSRProvider> in `getServerState()`.
12143
12154
  // To avoid the user's provider overriding the context value with an empty object,
@@ -12145,11 +12156,13 @@
12145
12156
  if (Object.keys(props).length === 0) {
12146
12157
  return /*#__PURE__*/ React.createElement(React.Fragment, null, children);
12147
12158
  }
12159
+ var contextValue = _object_spread_props(_object_spread({}, props), {
12160
+ ssrSearchRef: ssrSearchRef,
12161
+ recommendIdx: recommendIdx,
12162
+ hydrationCompleteRef: hydrationCompleteRef
12163
+ });
12148
12164
  return /*#__PURE__*/ React.createElement(InstantSearchSSRContext.Provider, {
12149
- value: _object_spread_props(_object_spread({}, props), {
12150
- ssrSearchRef: ssrSearchRef,
12151
- recommendIdx: recommendIdx
12152
- })
12165
+ value: contextValue
12153
12166
  }, children);
12154
12167
  }
12155
12168
 
@@ -14193,13 +14206,17 @@
14193
14206
  if (!chatRenderState) {
14194
14207
  return false;
14195
14208
  }
14196
- (_chatRenderState_setOpen = chatRenderState.setOpen) === null || _chatRenderState_setOpen === void 0 ? void 0 : _chatRenderState_setOpen.call(chatRenderState, true);
14197
14209
  var trimmed = (_ref1 = message === null || message === void 0 ? void 0 : message.trim()) !== null && _ref1 !== void 0 ? _ref1 : '';
14198
14210
  if (!trimmed) {
14199
- var _chatRenderState_focusInput;
14200
- (_chatRenderState_focusInput = chatRenderState.focusInput) === null || _chatRenderState_focusInput === void 0 ? void 0 : _chatRenderState_focusInput.call(chatRenderState);
14211
+ if (chatRenderState.focusInput) {
14212
+ chatRenderState.focusInput();
14213
+ } else {
14214
+ var _chatRenderState_setOpen1;
14215
+ (_chatRenderState_setOpen1 = chatRenderState.setOpen) === null || _chatRenderState_setOpen1 === void 0 ? void 0 : _chatRenderState_setOpen1.call(chatRenderState, true);
14216
+ }
14201
14217
  return false;
14202
14218
  }
14219
+ (_chatRenderState_setOpen = chatRenderState.setOpen) === null || _chatRenderState_setOpen === void 0 ? void 0 : _chatRenderState_setOpen.call(chatRenderState, true);
14203
14220
  if (isChatBusy(chatRenderState) || !chatRenderState.sendMessage) {
14204
14221
  return false;
14205
14222
  }
@@ -14422,6 +14439,58 @@
14422
14439
  name: 'chat',
14423
14440
  connector: true
14424
14441
  });
14442
+ var OPEN_STATE_CACHE_KEY = 'instantsearch-chat-open-state';
14443
+ function normalizePersistence(persistence, hasCustomChat) {
14444
+ if (hasCustomChat) {
14445
+ return {
14446
+ messages: false,
14447
+ open: persistence === undefined || (typeof persistence === "undefined" ? "undefined" : _type_of(persistence)) === 'object' && persistence.open === true
14448
+ };
14449
+ }
14450
+ if (persistence === undefined || persistence === true) {
14451
+ return {
14452
+ messages: true,
14453
+ open: true
14454
+ };
14455
+ }
14456
+ if (persistence === false) {
14457
+ return {
14458
+ messages: false,
14459
+ open: false
14460
+ };
14461
+ }
14462
+ return {
14463
+ messages: persistence.messages === true,
14464
+ open: persistence.open === true
14465
+ };
14466
+ }
14467
+ function getOpenStateCacheKey(type) {
14468
+ return "".concat(OPEN_STATE_CACHE_KEY, "-").concat(type);
14469
+ }
14470
+ function readPersistedOpen(type) {
14471
+ try {
14472
+ return safelyRunOnBrowser(function(param) {
14473
+ var browserWindow = param.window;
14474
+ return browserWindow.sessionStorage.getItem(getOpenStateCacheKey(type)) === 'true';
14475
+ }, {
14476
+ fallback: function fallback() {
14477
+ return false;
14478
+ }
14479
+ });
14480
+ } catch (unused) {
14481
+ return false;
14482
+ }
14483
+ }
14484
+ function writePersistedOpen(type, open) {
14485
+ try {
14486
+ safelyRunOnBrowser(function(param) {
14487
+ var browserWindow = param.window;
14488
+ browserWindow.sessionStorage.setItem(getOpenStateCacheKey(type), String(open));
14489
+ });
14490
+ } catch (unused) {
14491
+ // Storage availability must not block the visible state change.
14492
+ }
14493
+ }
14425
14494
  function getAttributesToClear$1(param) {
14426
14495
  var results = param.results, helper = param.helper;
14427
14496
  return uniq(getRefinements(results, helper.state, true).map(function(refinement) {
@@ -14481,10 +14550,11 @@
14481
14550
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
14482
14551
  checkRendering(renderFn, withUsage$q());
14483
14552
  return function(widgetParams) {
14484
- var _ref = widgetParams || {}, _ref_resume = _ref.resume, resume = _ref_resume === void 0 ? false : _ref_resume, _ref_tools = _ref.tools, tools = _ref_tools === void 0 ? {} : _ref_tools, _ref_type = _ref.type, type = _ref_type === void 0 ? 'chat' : _ref_type, context = _ref.context, initialUserMessage = _ref.initialUserMessage, initialMessages = _ref.initialMessages, _ref_disableTriggerValidation = _ref.disableTriggerValidation, disableTriggerValidation = _ref_disableTriggerValidation === void 0 ? false : _ref_disableTriggerValidation, _ref_sendAutomaticallyWhen = _ref.sendAutomaticallyWhen, sendAutomaticallyWhen = _ref_sendAutomaticallyWhen === void 0 ? lastAssistantMessageIsCompleteWithToolCalls : _ref_sendAutomaticallyWhen, _ref_requiresSearch = _ref.requiresSearch, requiresSearch = _ref_requiresSearch === void 0 ? true : _ref_requiresSearch, options = _object_without_properties(_ref, [
14553
+ var _ref = widgetParams || {}, _ref_resume = _ref.resume, resume = _ref_resume === void 0 ? false : _ref_resume, _ref_tools = _ref.tools, tools = _ref_tools === void 0 ? {} : _ref_tools, _ref_type = _ref.type, type = _ref_type === void 0 ? 'chat' : _ref_type, persistence = _ref.persistence, context = _ref.context, initialUserMessage = _ref.initialUserMessage, initialMessages = _ref.initialMessages, _ref_disableTriggerValidation = _ref.disableTriggerValidation, disableTriggerValidation = _ref_disableTriggerValidation === void 0 ? false : _ref_disableTriggerValidation, _ref_sendAutomaticallyWhen = _ref.sendAutomaticallyWhen, sendAutomaticallyWhen = _ref_sendAutomaticallyWhen === void 0 ? lastAssistantMessageIsCompleteWithToolCalls : _ref_sendAutomaticallyWhen, _ref_requiresSearch = _ref.requiresSearch, requiresSearch = _ref_requiresSearch === void 0 ? true : _ref_requiresSearch, options = _object_without_properties(_ref, [
14485
14554
  "resume",
14486
14555
  "tools",
14487
14556
  "type",
14557
+ "persistence",
14488
14558
  "context",
14489
14559
  "initialUserMessage",
14490
14560
  "initialMessages",
@@ -14492,6 +14562,7 @@
14492
14562
  "sendAutomaticallyWhen",
14493
14563
  "requiresSearch"
14494
14564
  ]);
14565
+ var normalizedPersistence = normalizePersistence(persistence, 'chat' in options);
14495
14566
  var _chatInstance;
14496
14567
  var input = '';
14497
14568
  var open = false;
@@ -14499,12 +14570,19 @@
14499
14570
  var setInput;
14500
14571
  var setOpen;
14501
14572
  var focusInput;
14573
+ var inputFocusRequested = false;
14502
14574
  var setFeedbackState;
14503
14575
  var hasValidatedEntryPoints = false;
14504
14576
  var agentId = 'agentId' in options ? options.agentId : undefined;
14505
14577
  var feedbackState = {};
14506
14578
  var _sendChatMessageFeedback;
14507
14579
  var feedbackAbortController;
14580
+ var chatSubscriptionUnsubscribers = [];
14581
+ var unsubscribeChatCallbacks = function unsubscribeChatCallbacks() {
14582
+ chatSubscriptionUnsubscribers.splice(0).forEach(function(unsubscribe) {
14583
+ return unsubscribe();
14584
+ });
14585
+ };
14508
14586
  // Extract suggestions from the last assistant message's data-suggestions part
14509
14587
  var getSuggestionsFromMessages = function getSuggestionsFromMessages(messages) {
14510
14588
  // Find the last assistant message (iterate from end)
@@ -14653,6 +14731,7 @@
14653
14731
  throw new Error(withUsage$q('You need to provide either an `agentId` or a `transport`.'));
14654
14732
  }
14655
14733
  return new Chat(_object_spread_props(_object_spread({}, options), {
14734
+ persistence: normalizedPersistence.messages,
14656
14735
  sendAutomaticallyWhen: sendAutomaticallyWhen,
14657
14736
  transport: transport,
14658
14737
  shouldRepairToolInput: function shouldRepairToolInput(toolName) {
@@ -14701,22 +14780,30 @@
14701
14780
  var _this = this;
14702
14781
  var instantSearchInstance = initOptions.instantSearchInstance;
14703
14782
  validateEntryPoints(instantSearchInstance);
14783
+ open = normalizedPersistence.open ? readPersistedOpen(type) : false;
14704
14784
  _chatInstance = makeChatInstance(instantSearchInstance);
14705
14785
  var render = function render() {
14706
14786
  renderFn(_object_spread_props(_object_spread({}, _this.getWidgetRenderState(initOptions)), {
14707
14787
  instantSearchInstance: initOptions.instantSearchInstance
14708
14788
  }), false);
14709
14789
  };
14710
- setOpen = function setOpen(o) {
14711
- open = o;
14790
+ var updateOpen = function updateOpen(nextOpen, requestFocus) {
14791
+ open = nextOpen;
14792
+ inputFocusRequested = nextOpen && (inputFocusRequested || requestFocus);
14793
+ if (normalizedPersistence.open) {
14794
+ writePersistedOpen(type, open);
14795
+ }
14712
14796
  render();
14713
14797
  // `open` is read by sibling widgets (e.g. `chatTrigger`) via the
14714
14798
  // shared `renderState`. Schedule a full re-render so they pick up
14715
14799
  // the new value instead of staying frozen on their initial state.
14716
14800
  initOptions.instantSearchInstance.scheduleRender();
14717
14801
  };
14802
+ setOpen = function setOpen(nextOpen) {
14803
+ updateOpen(nextOpen, nextOpen && !open);
14804
+ };
14718
14805
  focusInput = function focusInput() {
14719
- setOpen(true);
14806
+ updateOpen(true, true);
14720
14807
  };
14721
14808
  setInput = function setInput(i) {
14722
14809
  input = i;
@@ -14750,18 +14837,21 @@
14750
14837
  };
14751
14838
  }
14752
14839
  var hasExistingMessages = _chatInstance.messages.length > 0;
14753
- // Set initialMessages before registering callbacks to avoid
14754
- // triggering re-renders during init. A server render owns no
14755
- // conversation, so it leaves the instance empty.
14840
+ // Unsubscribe previous callbacks before setting initialMessages, then
14841
+ // register the current callbacks after to avoid re-renders during init.
14842
+ // A server render owns no conversation, so it leaves the instance empty.
14756
14843
  safelyRunOnBrowser(function() {
14844
+ unsubscribeChatCallbacks();
14757
14845
  if ((initialMessages === null || initialMessages === void 0 ? void 0 : initialMessages.length) && !resume && !hasExistingMessages) {
14758
14846
  _chatInstance.messages = initialMessages;
14759
14847
  }
14760
14848
  });
14761
14849
  safelyRunOnBrowser(function() {
14762
- _chatInstance['~registerErrorCallback'](render);
14763
- _chatInstance['~registerMessagesCallback'](render);
14764
- _chatInstance['~registerStatusCallback'](render);
14850
+ chatSubscriptionUnsubscribers = [
14851
+ _chatInstance['~registerErrorCallback'](render),
14852
+ _chatInstance['~registerMessagesCallback'](render),
14853
+ _chatInstance['~registerStatusCallback'](render)
14854
+ ];
14765
14855
  });
14766
14856
  // Resuming and sending reach the network, which a server render must
14767
14857
  // not: the HTML pass repeats what `getServerState` already rendered, so
@@ -14780,6 +14870,9 @@
14780
14870
  renderFn(_object_spread_props(_object_spread({}, this.getWidgetRenderState(initOptions)), {
14781
14871
  instantSearchInstance: instantSearchInstance
14782
14872
  }), true);
14873
+ if (open) {
14874
+ instantSearchInstance.scheduleRender();
14875
+ }
14783
14876
  },
14784
14877
  render: function render(renderOptions) {
14785
14878
  validateEntryPoints(renderOptions.instantSearchInstance);
@@ -14846,7 +14939,7 @@
14846
14939
  })
14847
14940
  ].concat(_to_consumable_array(rest)));
14848
14941
  };
14849
- return {
14942
+ var renderState = {
14850
14943
  indexUiState: instantSearchInstance.getUiState()[parent.getIndexId()],
14851
14944
  input: input,
14852
14945
  open: open,
@@ -14855,6 +14948,12 @@
14855
14948
  setInput: setInput,
14856
14949
  setOpen: setOpen,
14857
14950
  focusInput: focusInput,
14951
+ '~consumeInputFocus': function() {
14952
+ var shouldFocus = inputFocusRequested;
14953
+ inputFocusRequested = false;
14954
+ return shouldFocus;
14955
+ },
14956
+ '~isOpenStatePersistenceEnabled': normalizedPersistence.open,
14858
14957
  setMessages: setMessages,
14859
14958
  suggestions: getSuggestionsFromMessages(_chatInstance.messages),
14860
14959
  clearMessages: clearMessages,
@@ -14874,9 +14973,11 @@
14874
14973
  status: _chatInstance.status,
14875
14974
  stop: _chatInstance.stop
14876
14975
  };
14976
+ return renderState;
14877
14977
  },
14878
14978
  dispose: function dispose() {
14879
14979
  feedbackAbortController === null || feedbackAbortController === void 0 ? void 0 : feedbackAbortController.abort();
14980
+ unsubscribeChatCallbacks();
14880
14981
  unmountFn();
14881
14982
  },
14882
14983
  shouldRender: function shouldRender() {
@@ -14907,17 +15008,15 @@
14907
15008
  // `InstantSearchSSRProvider` flow: the server context covers state collection,
14908
15009
  // and the SSR context covers HTML rendering and hydration.
14909
15010
  //
14910
- // This can cost an extra render: a mount inside a provider that carries server
14911
- // state is withheld once even when there is no server markup to reproduce. A
14912
- // mount outside both contexts is never withheld.
14913
- //
14914
15011
  // The shim's React 16 and 17 fallback ignores the server snapshot, so using it
14915
- // here would not change this limitation.
15012
+ // here would not distinguish initial hydration from later provider children.
14916
15013
  function useLegacyIsHydrated() {
15014
+ var _ssrContext_hydrationCompleteRef;
14917
15015
  var serverContext = useInstantSearchServerContext();
14918
15016
  var ssrContext = useInstantSearchSSRContext();
14919
15017
  var isServerRendered = serverContext !== null || ssrContext !== null;
14920
- var _React_useState = _sliced_to_array(React__namespace.useState(!isServerRendered), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
15018
+ var isProviderHydrated = (ssrContext === null || ssrContext === void 0 ? void 0 : (_ssrContext_hydrationCompleteRef = ssrContext.hydrationCompleteRef) === null || _ssrContext_hydrationCompleteRef === void 0 ? void 0 : _ssrContext_hydrationCompleteRef.current) === true;
15019
+ var _React_useState = _sliced_to_array(React__namespace.useState(!isServerRendered || isProviderHydrated), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
14921
15020
  React__namespace.useEffect(function() {
14922
15021
  setIsHydrated(true);
14923
15022
  }, []);
@@ -14952,6 +15051,7 @@
14952
15051
  error: undefined,
14953
15052
  id: 'id' in props && props.id || '',
14954
15053
  messages: [],
15054
+ open: false,
14955
15055
  status: 'ready',
14956
15056
  suggestions: undefined
14957
15057
  });