react-instantsearch 7.42.0 → 7.43.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.
@@ -111,6 +111,7 @@ function ChatInner(_0, _1) {
111
111
  "disableTriggerValidation",
112
112
  "showReasoning"
113
113
  ]), _rest1 = _sliced_to_array._(_rest, 1), ref = _rest1[0];
114
+ var _ref3;
114
115
  var promptTranslations = translations.prompt, headerTranslations = translations.header, messageTranslations = translations.message, messagesTranslations = translations.messages;
115
116
  var _useInstantSearch = (0, _reactinstantsearchcore.useInstantSearch)(), indexUiState = _useInstantSearch.indexUiState, setIndexUiState = _useInstantSearch.setIndexUiState;
116
117
  var _useState = _sliced_to_array._((0, _react.useState)(false), 2), maximized = _useState[0], setMaximized = _useState[1];
@@ -136,7 +137,7 @@ function ChatInner(_0, _1) {
136
137
  tools: tools,
137
138
  disableTriggerValidation: effectiveDisableTriggerValidation
138
139
  }));
139
- var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState;
140
+ var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState, consumeInputFocus = chatState['~consumeInputFocus'], isOpenStatePersistenceEnabled = chatState['~isOpenStatePersistenceEnabled'];
140
141
  (0, _react.useImperativeHandle)(ref, function() {
141
142
  return {
142
143
  setOpen: setOpen,
@@ -146,19 +147,14 @@ function ChatInner(_0, _1) {
146
147
  setInput: setInput
147
148
  };
148
149
  });
149
- var wasOpenRef = (0, _react.useRef)(false);
150
150
  (0, _react.useEffect)(function() {
151
- var shouldFocusPrompt = !wasOpenRef.current && open;
152
- if (shouldFocusPrompt) {
151
+ if (consumeInputFocus === null || consumeInputFocus === void 0 ? void 0 : consumeInputFocus()) {
153
152
  window.requestAnimationFrame(function() {
154
153
  var _promptRef_current;
155
154
  (_promptRef_current = promptRef.current) === null || _promptRef_current === void 0 ? void 0 : _promptRef_current.focus();
156
155
  });
157
156
  }
158
- wasOpenRef.current = open;
159
- }, [
160
- open
161
- ]);
157
+ });
162
158
  // Keep the conversation pinned to the bottom while streaming. The stick-to-
163
159
  // bottom ResizeObserver only reacts to content *height* changes, but tool
164
160
  // results such as a horizontally-growing carousel stream in without changing
@@ -176,7 +172,7 @@ function ChatInner(_0, _1) {
176
172
  status,
177
173
  scrollToBottom
178
174
  ]);
179
- var _ref3 = messagesProps !== null && messagesProps !== void 0 ? messagesProps : {}, callerAssistantMessageProps = _ref3.assistantMessageProps, callerUserMessageProps = _ref3.userMessageProps, restMessagesProps = _object_without_properties._(_ref3, [
175
+ var _ref4 = messagesProps !== null && messagesProps !== void 0 ? messagesProps : {}, callerAssistantMessageProps = _ref4.assistantMessageProps, callerUserMessageProps = _ref4.userMessageProps, restMessagesProps = _object_without_properties._(_ref4, [
180
176
  "assistantMessageProps",
181
177
  "userMessageProps"
182
178
  ]);
@@ -249,7 +245,7 @@ function ChatInner(_0, _1) {
249
245
  }, callerUserMessageProps),
250
246
  error: error
251
247
  }),
252
- promptProps: _object_spread._({
248
+ promptProps: _object_spread_props._(_object_spread._({
253
249
  promptRef: promptRef,
254
250
  status: status,
255
251
  value: input,
@@ -268,7 +264,9 @@ function ChatInner(_0, _1) {
268
264
  },
269
265
  headerComponent: promptHeaderComponent,
270
266
  footerComponent: promptFooterComponent
271
- }, promptProps),
267
+ }, promptProps), {
268
+ autoFocus: (_ref3 = promptProps === null || promptProps === void 0 ? void 0 : promptProps.autoFocus) !== null && _ref3 !== void 0 ? _ref3 : !isOpenStatePersistenceEnabled || isInlineLayoutComponent
269
+ }),
272
270
  suggestionsProps: {
273
271
  suggestions: suggestions,
274
272
  onSuggestionClick: function onSuggestionClick(suggestion) {
@@ -75,6 +75,7 @@ function ChatInner(_0, _1) {
75
75
  "disableTriggerValidation",
76
76
  "showReasoning"
77
77
  ]), _rest1 = _$3(_rest, 1), ref = _rest1[0];
78
+ var _ref3;
78
79
  var promptTranslations = translations.prompt, headerTranslations = translations.header, messageTranslations = translations.message, messagesTranslations = translations.messages;
79
80
  var _useInstantSearch = useInstantSearch(), indexUiState = _useInstantSearch.indexUiState, setIndexUiState = _useInstantSearch.setIndexUiState;
80
81
  var _useState = _$3(useState(false), 2), maximized = _useState[0], setMaximized = _useState[1];
@@ -100,7 +101,7 @@ function ChatInner(_0, _1) {
100
101
  tools: tools,
101
102
  disableTriggerValidation: effectiveDisableTriggerValidation
102
103
  }));
103
- var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState;
104
+ var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState, consumeInputFocus = chatState['~consumeInputFocus'], isOpenStatePersistenceEnabled = chatState['~isOpenStatePersistenceEnabled'];
104
105
  useImperativeHandle(ref, function() {
105
106
  return {
106
107
  setOpen: setOpen,
@@ -110,19 +111,14 @@ function ChatInner(_0, _1) {
110
111
  setInput: setInput
111
112
  };
112
113
  });
113
- var wasOpenRef = useRef(false);
114
114
  useEffect(function() {
115
- var shouldFocusPrompt = !wasOpenRef.current && open;
116
- if (shouldFocusPrompt) {
115
+ if (consumeInputFocus === null || consumeInputFocus === void 0 ? void 0 : consumeInputFocus()) {
117
116
  window.requestAnimationFrame(function() {
118
117
  var _promptRef_current;
119
118
  (_promptRef_current = promptRef.current) === null || _promptRef_current === void 0 ? void 0 : _promptRef_current.focus();
120
119
  });
121
120
  }
122
- wasOpenRef.current = open;
123
- }, [
124
- open
125
- ]);
121
+ });
126
122
  // Keep the conversation pinned to the bottom while streaming. The stick-to-
127
123
  // bottom ResizeObserver only reacts to content *height* changes, but tool
128
124
  // results such as a horizontally-growing carousel stream in without changing
@@ -140,7 +136,7 @@ function ChatInner(_0, _1) {
140
136
  status,
141
137
  scrollToBottom
142
138
  ]);
143
- var _ref3 = messagesProps !== null && messagesProps !== void 0 ? messagesProps : {}, callerAssistantMessageProps = _ref3.assistantMessageProps, callerUserMessageProps = _ref3.userMessageProps, restMessagesProps = _$2(_ref3, [
139
+ var _ref4 = messagesProps !== null && messagesProps !== void 0 ? messagesProps : {}, callerAssistantMessageProps = _ref4.assistantMessageProps, callerUserMessageProps = _ref4.userMessageProps, restMessagesProps = _$2(_ref4, [
144
140
  "assistantMessageProps",
145
141
  "userMessageProps"
146
142
  ]);
@@ -213,7 +209,7 @@ function ChatInner(_0, _1) {
213
209
  }, callerUserMessageProps),
214
210
  error: error
215
211
  }),
216
- promptProps: _$5({
212
+ promptProps: _$4(_$5({
217
213
  promptRef: promptRef,
218
214
  status: status,
219
215
  value: input,
@@ -232,7 +228,9 @@ function ChatInner(_0, _1) {
232
228
  },
233
229
  headerComponent: promptHeaderComponent,
234
230
  footerComponent: promptFooterComponent
235
- }, promptProps),
231
+ }, promptProps), {
232
+ autoFocus: (_ref3 = promptProps === null || promptProps === void 0 ? void 0 : promptProps.autoFocus) !== null && _ref3 !== void 0 ? _ref3 : !isOpenStatePersistenceEnabled || isInlineLayoutComponent
233
+ }),
236
234
  suggestionsProps: {
237
235
  suggestions: suggestions,
238
236
  onSuggestionClick: function onSuggestionClick(suggestion) {
@@ -1,4 +1,4 @@
1
- /*! React InstantSearch 7.42.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
1
+ /*! React InstantSearch 7.43.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.43.0';
28
28
 
29
29
  function _define_property(obj, key, value) {
30
30
  if (key in obj) {
@@ -6278,22 +6278,29 @@
6278
6278
  *
6279
6279
  * Parameters set on a widget win, so an explicit `queryParameters.userToken`
6280
6280
  * keeps overriding the middleware.
6281
+ *
6282
+ * The fallback query is a regular search, so it gets the same treatment — but
6283
+ * only merged into a `fallbackParameters` the widget already set. See below.
6281
6284
  */ function addInsightsToRecommendParameters(recommendParameters, param) {
6282
6285
  var userToken = param.userToken, clickAnalytics = param.clickAnalytics;
6283
6286
  if (userToken === undefined && clickAnalytics === undefined) {
6284
6287
  return recommendParameters;
6285
6288
  }
6289
+ var insightsParameters = _object_spread({}, clickAnalytics === undefined ? {} : {
6290
+ clickAnalytics: clickAnalytics
6291
+ }, userToken === undefined ? {} : {
6292
+ userToken: userToken
6293
+ });
6286
6294
  return new algoliasearchHelper.RecommendParameters({
6287
6295
  params: recommendParameters.params.map(function(params) {
6288
- // v4 `TrendingFacetsQuery` doesn't include `queryParameters`, but the v5
6289
- // API and the helper support them, like `connectTrendingFacets` does.
6290
- var queryParameters = params.queryParameters;
6291
- return _object_spread_props(_object_spread({}, params), {
6292
- queryParameters: _object_spread({}, clickAnalytics === undefined ? {} : {
6293
- clickAnalytics: clickAnalytics
6294
- }, userToken === undefined ? {} : {
6295
- userToken: userToken
6296
- }, queryParameters)
6296
+ // v4 `TrendingFacetsQuery` doesn't include `queryParameters` or
6297
+ // `fallbackParameters`, but the v5 API and the helper support them, like
6298
+ // `connectTrendingFacets` does.
6299
+ var queryParameters = params.queryParameters, fallbackParameters = params.fallbackParameters;
6300
+ return _object_spread(_object_spread_props(_object_spread({}, params), {
6301
+ queryParameters: _object_spread({}, insightsParameters, queryParameters)
6302
+ }), fallbackParameters && {
6303
+ fallbackParameters: _object_spread({}, insightsParameters, fallbackParameters)
6297
6304
  });
6298
6305
  })
6299
6306
  });
@@ -9216,7 +9223,7 @@
9216
9223
  });
9217
9224
  }
9218
9225
 
9219
- var version = '4.109.0';
9226
+ var version = '4.110.0';
9220
9227
 
9221
9228
  var ANONYMOUS_TOKEN_COOKIE_KEY = '_ALGOLIA';
9222
9229
  function getCookie(name) {
@@ -12093,6 +12100,10 @@
12093
12100
  var ssrSearchRef = React.useRef(null);
12094
12101
  // This is used to re-map the result index to the requesting widget
12095
12102
  var recommendIdx = React.useRef(0);
12103
+ var hydrationCompleteRef = React.useRef(false);
12104
+ React.useEffect(function() {
12105
+ hydrationCompleteRef.current = true;
12106
+ }, []);
12096
12107
  // When <DynamicWidgets> is mounted, a second provider is used above the user-land
12097
12108
  // <InstantSearchSSRProvider> in `getServerState()`.
12098
12109
  // To avoid the user's provider overriding the context value with an empty object,
@@ -12100,11 +12111,13 @@
12100
12111
  if (Object.keys(props).length === 0) {
12101
12112
  return /*#__PURE__*/ React.createElement(React.Fragment, null, children);
12102
12113
  }
12114
+ var contextValue = _object_spread_props(_object_spread({}, props), {
12115
+ ssrSearchRef: ssrSearchRef,
12116
+ recommendIdx: recommendIdx,
12117
+ hydrationCompleteRef: hydrationCompleteRef
12118
+ });
12103
12119
  return /*#__PURE__*/ React.createElement(InstantSearchSSRContext.Provider, {
12104
- value: _object_spread_props(_object_spread({}, props), {
12105
- ssrSearchRef: ssrSearchRef,
12106
- recommendIdx: recommendIdx
12107
- })
12120
+ value: contextValue
12108
12121
  }, children);
12109
12122
  }
12110
12123
 
@@ -14148,13 +14161,17 @@
14148
14161
  if (!chatRenderState) {
14149
14162
  return false;
14150
14163
  }
14151
- (_chatRenderState_setOpen = chatRenderState.setOpen) === null || _chatRenderState_setOpen === void 0 ? void 0 : _chatRenderState_setOpen.call(chatRenderState, true);
14152
14164
  var trimmed = (_ref1 = message === null || message === void 0 ? void 0 : message.trim()) !== null && _ref1 !== void 0 ? _ref1 : '';
14153
14165
  if (!trimmed) {
14154
- var _chatRenderState_focusInput;
14155
- (_chatRenderState_focusInput = chatRenderState.focusInput) === null || _chatRenderState_focusInput === void 0 ? void 0 : _chatRenderState_focusInput.call(chatRenderState);
14166
+ if (chatRenderState.focusInput) {
14167
+ chatRenderState.focusInput();
14168
+ } else {
14169
+ var _chatRenderState_setOpen1;
14170
+ (_chatRenderState_setOpen1 = chatRenderState.setOpen) === null || _chatRenderState_setOpen1 === void 0 ? void 0 : _chatRenderState_setOpen1.call(chatRenderState, true);
14171
+ }
14156
14172
  return false;
14157
14173
  }
14174
+ (_chatRenderState_setOpen = chatRenderState.setOpen) === null || _chatRenderState_setOpen === void 0 ? void 0 : _chatRenderState_setOpen.call(chatRenderState, true);
14158
14175
  if (isChatBusy(chatRenderState) || !chatRenderState.sendMessage) {
14159
14176
  return false;
14160
14177
  }
@@ -14382,6 +14399,58 @@
14382
14399
  name: 'chat',
14383
14400
  connector: true
14384
14401
  });
14402
+ var OPEN_STATE_CACHE_KEY = 'instantsearch-chat-open-state';
14403
+ function normalizePersistence(persistence, hasCustomChat) {
14404
+ if (hasCustomChat) {
14405
+ return {
14406
+ messages: false,
14407
+ open: persistence === undefined || (typeof persistence === "undefined" ? "undefined" : _type_of(persistence)) === 'object' && persistence.open === true
14408
+ };
14409
+ }
14410
+ if (persistence === undefined || persistence === true) {
14411
+ return {
14412
+ messages: true,
14413
+ open: true
14414
+ };
14415
+ }
14416
+ if (persistence === false) {
14417
+ return {
14418
+ messages: false,
14419
+ open: false
14420
+ };
14421
+ }
14422
+ return {
14423
+ messages: persistence.messages === true,
14424
+ open: persistence.open === true
14425
+ };
14426
+ }
14427
+ function getOpenStateCacheKey(type) {
14428
+ return "".concat(OPEN_STATE_CACHE_KEY, "-").concat(type);
14429
+ }
14430
+ function readPersistedOpen(type) {
14431
+ try {
14432
+ return safelyRunOnBrowser(function(param) {
14433
+ var browserWindow = param.window;
14434
+ return browserWindow.sessionStorage.getItem(getOpenStateCacheKey(type)) === 'true';
14435
+ }, {
14436
+ fallback: function fallback() {
14437
+ return false;
14438
+ }
14439
+ });
14440
+ } catch (unused) {
14441
+ return false;
14442
+ }
14443
+ }
14444
+ function writePersistedOpen(type, open) {
14445
+ try {
14446
+ safelyRunOnBrowser(function(param) {
14447
+ var browserWindow = param.window;
14448
+ browserWindow.sessionStorage.setItem(getOpenStateCacheKey(type), String(open));
14449
+ });
14450
+ } catch (unused) {
14451
+ // Storage availability must not block the visible state change.
14452
+ }
14453
+ }
14385
14454
  function getAttributesToClear$1(param) {
14386
14455
  var results = param.results, helper = param.helper;
14387
14456
  return uniq(getRefinements(results, helper.state, true).map(function(refinement) {
@@ -14441,10 +14510,11 @@
14441
14510
  var unmountFn = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : noop;
14442
14511
  checkRendering(renderFn, withUsage$q());
14443
14512
  return function(widgetParams) {
14444
- 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, [
14513
+ 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, [
14445
14514
  "resume",
14446
14515
  "tools",
14447
14516
  "type",
14517
+ "persistence",
14448
14518
  "context",
14449
14519
  "initialUserMessage",
14450
14520
  "initialMessages",
@@ -14452,6 +14522,7 @@
14452
14522
  "sendAutomaticallyWhen",
14453
14523
  "requiresSearch"
14454
14524
  ]);
14525
+ var normalizedPersistence = normalizePersistence(persistence, 'chat' in options);
14455
14526
  var _chatInstance;
14456
14527
  var input = '';
14457
14528
  var open = false;
@@ -14459,12 +14530,19 @@
14459
14530
  var setInput;
14460
14531
  var setOpen;
14461
14532
  var focusInput;
14533
+ var inputFocusRequested = false;
14462
14534
  var setFeedbackState;
14463
14535
  var hasValidatedEntryPoints = false;
14464
14536
  var agentId = 'agentId' in options ? options.agentId : undefined;
14465
14537
  var feedbackState = {};
14466
14538
  var _sendChatMessageFeedback;
14467
14539
  var feedbackAbortController;
14540
+ var chatSubscriptionUnsubscribers = [];
14541
+ var unsubscribeChatCallbacks = function unsubscribeChatCallbacks() {
14542
+ chatSubscriptionUnsubscribers.splice(0).forEach(function(unsubscribe) {
14543
+ return unsubscribe();
14544
+ });
14545
+ };
14468
14546
  // Extract suggestions from the last assistant message's data-suggestions part
14469
14547
  var getSuggestionsFromMessages = function getSuggestionsFromMessages(messages) {
14470
14548
  // Find the last assistant message (iterate from end)
@@ -14613,6 +14691,7 @@
14613
14691
  throw new Error(withUsage$q('You need to provide either an `agentId` or a `transport`.'));
14614
14692
  }
14615
14693
  return new Chat$1(_object_spread_props(_object_spread({}, options), {
14694
+ persistence: normalizedPersistence.messages,
14616
14695
  sendAutomaticallyWhen: sendAutomaticallyWhen,
14617
14696
  transport: transport,
14618
14697
  shouldRepairToolInput: function shouldRepairToolInput(toolName) {
@@ -14661,22 +14740,30 @@
14661
14740
  var _this = this;
14662
14741
  var instantSearchInstance = initOptions.instantSearchInstance;
14663
14742
  validateEntryPoints(instantSearchInstance);
14743
+ open = normalizedPersistence.open ? readPersistedOpen(type) : false;
14664
14744
  _chatInstance = makeChatInstance(instantSearchInstance);
14665
14745
  var render = function render() {
14666
14746
  renderFn(_object_spread_props(_object_spread({}, _this.getWidgetRenderState(initOptions)), {
14667
14747
  instantSearchInstance: initOptions.instantSearchInstance
14668
14748
  }), false);
14669
14749
  };
14670
- setOpen = function setOpen(o) {
14671
- open = o;
14750
+ var updateOpen = function updateOpen(nextOpen, requestFocus) {
14751
+ open = nextOpen;
14752
+ inputFocusRequested = nextOpen && (inputFocusRequested || requestFocus);
14753
+ if (normalizedPersistence.open) {
14754
+ writePersistedOpen(type, open);
14755
+ }
14672
14756
  render();
14673
14757
  // `open` is read by sibling widgets (e.g. `chatTrigger`) via the
14674
14758
  // shared `renderState`. Schedule a full re-render so they pick up
14675
14759
  // the new value instead of staying frozen on their initial state.
14676
14760
  initOptions.instantSearchInstance.scheduleRender();
14677
14761
  };
14762
+ setOpen = function setOpen(nextOpen) {
14763
+ updateOpen(nextOpen, nextOpen && !open);
14764
+ };
14678
14765
  focusInput = function focusInput() {
14679
- setOpen(true);
14766
+ updateOpen(true, true);
14680
14767
  };
14681
14768
  setInput = function setInput(i) {
14682
14769
  input = i;
@@ -14710,18 +14797,21 @@
14710
14797
  };
14711
14798
  }
14712
14799
  var hasExistingMessages = _chatInstance.messages.length > 0;
14713
- // Set initialMessages before registering callbacks to avoid
14714
- // triggering re-renders during init. A server render owns no
14715
- // conversation, so it leaves the instance empty.
14800
+ // Unsubscribe previous callbacks before setting initialMessages, then
14801
+ // register the current callbacks after to avoid re-renders during init.
14802
+ // A server render owns no conversation, so it leaves the instance empty.
14716
14803
  safelyRunOnBrowser(function() {
14804
+ unsubscribeChatCallbacks();
14717
14805
  if ((initialMessages === null || initialMessages === void 0 ? void 0 : initialMessages.length) && !resume && !hasExistingMessages) {
14718
14806
  _chatInstance.messages = initialMessages;
14719
14807
  }
14720
14808
  });
14721
14809
  safelyRunOnBrowser(function() {
14722
- _chatInstance['~registerErrorCallback'](render);
14723
- _chatInstance['~registerMessagesCallback'](render);
14724
- _chatInstance['~registerStatusCallback'](render);
14810
+ chatSubscriptionUnsubscribers = [
14811
+ _chatInstance['~registerErrorCallback'](render),
14812
+ _chatInstance['~registerMessagesCallback'](render),
14813
+ _chatInstance['~registerStatusCallback'](render)
14814
+ ];
14725
14815
  });
14726
14816
  // Resuming and sending reach the network, which a server render must
14727
14817
  // not: the HTML pass repeats what `getServerState` already rendered, so
@@ -14740,6 +14830,9 @@
14740
14830
  renderFn(_object_spread_props(_object_spread({}, this.getWidgetRenderState(initOptions)), {
14741
14831
  instantSearchInstance: instantSearchInstance
14742
14832
  }), true);
14833
+ if (open) {
14834
+ instantSearchInstance.scheduleRender();
14835
+ }
14743
14836
  },
14744
14837
  render: function render(renderOptions) {
14745
14838
  validateEntryPoints(renderOptions.instantSearchInstance);
@@ -14806,7 +14899,7 @@
14806
14899
  })
14807
14900
  ].concat(_to_consumable_array(rest)));
14808
14901
  };
14809
- return {
14902
+ var renderState = {
14810
14903
  indexUiState: instantSearchInstance.getUiState()[parent.getIndexId()],
14811
14904
  input: input,
14812
14905
  open: open,
@@ -14815,6 +14908,12 @@
14815
14908
  setInput: setInput,
14816
14909
  setOpen: setOpen,
14817
14910
  focusInput: focusInput,
14911
+ '~consumeInputFocus': function() {
14912
+ var shouldFocus = inputFocusRequested;
14913
+ inputFocusRequested = false;
14914
+ return shouldFocus;
14915
+ },
14916
+ '~isOpenStatePersistenceEnabled': normalizedPersistence.open,
14818
14917
  setMessages: setMessages,
14819
14918
  suggestions: getSuggestionsFromMessages(_chatInstance.messages),
14820
14919
  clearMessages: clearMessages,
@@ -14834,9 +14933,11 @@
14834
14933
  status: _chatInstance.status,
14835
14934
  stop: _chatInstance.stop
14836
14935
  };
14936
+ return renderState;
14837
14937
  },
14838
14938
  dispose: function dispose() {
14839
14939
  feedbackAbortController === null || feedbackAbortController === void 0 ? void 0 : feedbackAbortController.abort();
14940
+ unsubscribeChatCallbacks();
14840
14941
  unmountFn();
14841
14942
  },
14842
14943
  shouldRender: function shouldRender() {
@@ -14867,17 +14968,15 @@
14867
14968
  // `InstantSearchSSRProvider` flow: the server context covers state collection,
14868
14969
  // and the SSR context covers HTML rendering and hydration.
14869
14970
  //
14870
- // This can cost an extra render: a mount inside a provider that carries server
14871
- // state is withheld once even when there is no server markup to reproduce. A
14872
- // mount outside both contexts is never withheld.
14873
- //
14874
14971
  // The shim's React 16 and 17 fallback ignores the server snapshot, so using it
14875
- // here would not change this limitation.
14972
+ // here would not distinguish initial hydration from later provider children.
14876
14973
  function useLegacyIsHydrated() {
14974
+ var _ssrContext_hydrationCompleteRef;
14877
14975
  var serverContext = useInstantSearchServerContext();
14878
14976
  var ssrContext = useInstantSearchSSRContext();
14879
14977
  var isServerRendered = serverContext !== null || ssrContext !== null;
14880
- var _React_useState = _sliced_to_array(React__namespace.useState(!isServerRendered), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
14978
+ var isProviderHydrated = (ssrContext === null || ssrContext === void 0 ? void 0 : (_ssrContext_hydrationCompleteRef = ssrContext.hydrationCompleteRef) === null || _ssrContext_hydrationCompleteRef === void 0 ? void 0 : _ssrContext_hydrationCompleteRef.current) === true;
14979
+ var _React_useState = _sliced_to_array(React__namespace.useState(!isServerRendered || isProviderHydrated), 2), isHydrated = _React_useState[0], setIsHydrated = _React_useState[1];
14881
14980
  React__namespace.useEffect(function() {
14882
14981
  setIsHydrated(true);
14883
14982
  }, []);
@@ -14912,6 +15011,7 @@
14912
15011
  error: undefined,
14913
15012
  id: 'id' in props && props.id || '',
14914
15013
  messages: [],
15014
+ open: false,
14915
15015
  status: 'ready',
14916
15016
  suggestions: undefined
14917
15017
  });
@@ -25244,6 +25344,7 @@
25244
25344
  "disableTriggerValidation",
25245
25345
  "showReasoning"
25246
25346
  ]), _rest1 = _sliced_to_array(_rest, 1), ref = _rest1[0];
25347
+ var _ref3;
25247
25348
  var promptTranslations = translations.prompt, headerTranslations = translations.header, messageTranslations = translations.message, messagesTranslations = translations.messages;
25248
25349
  var _useInstantSearch = useInstantSearch(), indexUiState = _useInstantSearch.indexUiState, setIndexUiState = _useInstantSearch.setIndexUiState;
25249
25350
  var _useState = _sliced_to_array(React.useState(false), 2), maximized = _useState[0], setMaximized = _useState[1];
@@ -25269,7 +25370,7 @@
25269
25370
  tools: tools,
25270
25371
  disableTriggerValidation: effectiveDisableTriggerValidation
25271
25372
  }));
25272
- var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState;
25373
+ var messages = chatState.messages, sendMessage = chatState.sendMessage, status = chatState.status, regenerate = chatState.regenerate, stop = chatState.stop, error = chatState.error, input = chatState.input, setInput = chatState.setInput, open = chatState.open, setOpen = chatState.setOpen, clearMessages = chatState.clearMessages, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState, consumeInputFocus = chatState['~consumeInputFocus'], isOpenStatePersistenceEnabled = chatState['~isOpenStatePersistenceEnabled'];
25273
25374
  React.useImperativeHandle(ref, function() {
25274
25375
  return {
25275
25376
  setOpen: setOpen,
@@ -25279,19 +25380,14 @@
25279
25380
  setInput: setInput
25280
25381
  };
25281
25382
  });
25282
- var wasOpenRef = React.useRef(false);
25283
25383
  React.useEffect(function() {
25284
- var shouldFocusPrompt = !wasOpenRef.current && open;
25285
- if (shouldFocusPrompt) {
25384
+ if (consumeInputFocus === null || consumeInputFocus === void 0 ? void 0 : consumeInputFocus()) {
25286
25385
  window.requestAnimationFrame(function() {
25287
25386
  var _promptRef_current;
25288
25387
  (_promptRef_current = promptRef.current) === null || _promptRef_current === void 0 ? void 0 : _promptRef_current.focus();
25289
25388
  });
25290
25389
  }
25291
- wasOpenRef.current = open;
25292
- }, [
25293
- open
25294
- ]);
25390
+ });
25295
25391
  // Keep the conversation pinned to the bottom while streaming. The stick-to-
25296
25392
  // bottom ResizeObserver only reacts to content *height* changes, but tool
25297
25393
  // results such as a horizontally-growing carousel stream in without changing
@@ -25312,7 +25408,7 @@
25312
25408
  if (error) {
25313
25409
  throw error;
25314
25410
  }
25315
- var _ref3 = messagesProps !== null && messagesProps !== void 0 ? messagesProps : {}, callerAssistantMessageProps = _ref3.assistantMessageProps, callerUserMessageProps = _ref3.userMessageProps, restMessagesProps = _object_without_properties(_ref3, [
25411
+ var _ref4 = messagesProps !== null && messagesProps !== void 0 ? messagesProps : {}, callerAssistantMessageProps = _ref4.assistantMessageProps, callerUserMessageProps = _ref4.userMessageProps, restMessagesProps = _object_without_properties(_ref4, [
25316
25412
  "assistantMessageProps",
25317
25413
  "userMessageProps"
25318
25414
  ]);
@@ -25385,7 +25481,7 @@
25385
25481
  }, callerUserMessageProps),
25386
25482
  error: error
25387
25483
  }),
25388
- promptProps: _object_spread({
25484
+ promptProps: _object_spread_props(_object_spread({
25389
25485
  promptRef: promptRef,
25390
25486
  status: status,
25391
25487
  value: input,
@@ -25404,7 +25500,9 @@
25404
25500
  },
25405
25501
  headerComponent: promptHeaderComponent,
25406
25502
  footerComponent: promptFooterComponent
25407
- }, promptProps),
25503
+ }, promptProps), {
25504
+ autoFocus: (_ref3 = promptProps === null || promptProps === void 0 ? void 0 : promptProps.autoFocus) !== null && _ref3 !== void 0 ? _ref3 : !isOpenStatePersistenceEnabled || isInlineLayoutComponent
25505
+ }),
25408
25506
  suggestionsProps: {
25409
25507
  suggestions: suggestions,
25410
25508
  onSuggestionClick: function onSuggestionClick(suggestion) {