react-instantsearch 7.37.0 → 7.38.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.
@@ -52,7 +52,8 @@ var _SearchIndexTool = require("./chat/tools/SearchIndexTool");
52
52
  var ChatUiComponent = (0, _instantsearchuicomponents.createChatComponent)({
53
53
  createElement: _react.createElement,
54
54
  Fragment: _react.Fragment,
55
- memo: _react.memo
55
+ memo: _react.memo,
56
+ useState: _react.useState
56
57
  });
57
58
  function createDefaultTools(itemComponent, getSearchPageURL) {
58
59
  var _obj;
@@ -117,7 +118,7 @@ function ChatInner(_0, _1) {
117
118
  tools: tools,
118
119
  disableTriggerValidation: effectiveDisableTriggerValidation
119
120
  }));
120
- 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, isClearing = chatState.isClearing, clearMessages = chatState.clearMessages, onClearTransitionEnd = chatState.onClearTransitionEnd, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState;
121
+ 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;
121
122
  (0, _react.useImperativeHandle)(ref, function() {
122
123
  return {
123
124
  setOpen: setOpen,
@@ -178,7 +179,7 @@ function ChatInner(_0, _1) {
178
179
  return setMaximized(!maximized);
179
180
  },
180
181
  onClear: clearMessages,
181
- canClear: Boolean(messages === null || messages === void 0 ? void 0 : messages.length) && !isClearing,
182
+ canClear: Boolean(messages === null || messages === void 0 ? void 0 : messages.length),
182
183
  titleIconComponent: headerTitleIconComponent,
183
184
  closeIconComponent: headerCloseIconComponent,
184
185
  minimizeIconComponent: headerMinimizeIconComponent,
@@ -204,8 +205,6 @@ function ChatInner(_0, _1) {
204
205
  tools: toolsFromConnector,
205
206
  indexUiState: indexUiState,
206
207
  setIndexUiState: setIndexUiState,
207
- isClearing: isClearing,
208
- onClearTransitionEnd: onClearTransitionEnd,
209
208
  isScrollAtBottom: isAtBottom,
210
209
  scrollRef: scrollRef,
211
210
  contentRef: contentRef,
@@ -16,7 +16,8 @@ import { createCarouselTool } from './chat/tools/SearchIndexTool.js';
16
16
  var ChatUiComponent = createChatComponent({
17
17
  createElement: createElement,
18
18
  Fragment: Fragment,
19
- memo: memo
19
+ memo: memo,
20
+ useState: useState
20
21
  });
21
22
  function createDefaultTools(itemComponent, getSearchPageURL) {
22
23
  var _obj;
@@ -81,7 +82,7 @@ function ChatInner(_0, _1) {
81
82
  tools: tools,
82
83
  disableTriggerValidation: effectiveDisableTriggerValidation
83
84
  }));
84
- 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, isClearing = chatState.isClearing, clearMessages = chatState.clearMessages, onClearTransitionEnd = chatState.onClearTransitionEnd, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState;
85
+ 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;
85
86
  useImperativeHandle(ref, function() {
86
87
  return {
87
88
  setOpen: setOpen,
@@ -142,7 +143,7 @@ function ChatInner(_0, _1) {
142
143
  return setMaximized(!maximized);
143
144
  },
144
145
  onClear: clearMessages,
145
- canClear: Boolean(messages === null || messages === void 0 ? void 0 : messages.length) && !isClearing,
146
+ canClear: Boolean(messages === null || messages === void 0 ? void 0 : messages.length),
146
147
  titleIconComponent: headerTitleIconComponent,
147
148
  closeIconComponent: headerCloseIconComponent,
148
149
  minimizeIconComponent: headerMinimizeIconComponent,
@@ -168,8 +169,6 @@ function ChatInner(_0, _1) {
168
169
  tools: toolsFromConnector,
169
170
  indexUiState: indexUiState,
170
171
  setIndexUiState: setIndexUiState,
171
- isClearing: isClearing,
172
- onClearTransitionEnd: onClearTransitionEnd,
173
172
  isScrollAtBottom: isAtBottom,
174
173
  scrollRef: scrollRef,
175
174
  contentRef: contentRef,
@@ -1,4 +1,4 @@
1
- /*! React InstantSearch 7.37.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch */
1
+ /*! React InstantSearch 7.38.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.37.0';
27
+ var version$2 = '7.38.0';
28
28
 
29
29
  function _define_property(obj, key, value) {
30
30
  if (key in obj) {
@@ -6890,10 +6890,11 @@
6890
6890
 
6891
6891
  var hasAlphanumeric = new RegExp(/\w/i);
6892
6892
  function getHighlightFromSiblings(parts, i) {
6893
+ var _ref, _ref1;
6893
6894
  var _parts_, _parts_1;
6894
6895
  var current = parts[i];
6895
- var isNextHighlighted = ((_parts_ = parts[i + 1]) === null || _parts_ === void 0 ? void 0 : _parts_.isHighlighted) || true;
6896
- var isPreviousHighlighted = ((_parts_1 = parts[i - 1]) === null || _parts_1 === void 0 ? void 0 : _parts_1.isHighlighted) || true;
6896
+ var isNextHighlighted = (_ref = (_parts_ = parts[i + 1]) === null || _parts_ === void 0 ? void 0 : _parts_.isHighlighted) !== null && _ref !== void 0 ? _ref : true;
6897
+ var isPreviousHighlighted = (_ref1 = (_parts_1 = parts[i - 1]) === null || _parts_1 === void 0 ? void 0 : _parts_1.isHighlighted) !== null && _ref1 !== void 0 ? _ref1 : true;
6897
6898
  if (!hasAlphanumeric.test(unescape$1(current.value)) && isPreviousHighlighted === isNextHighlighted) {
6898
6899
  return isPreviousHighlighted;
6899
6900
  }
@@ -10821,7 +10822,7 @@
10821
10822
  };
10822
10823
  }
10823
10824
 
10824
- var version = '4.103.0';
10825
+ var version = '4.104.0';
10825
10826
 
10826
10827
  var withUsage$r = createDocumentationMessageGenerator({
10827
10828
  name: 'instantsearch'
@@ -13884,12 +13885,10 @@
13884
13885
  var _chatInstance;
13885
13886
  var input = '';
13886
13887
  var open = false;
13887
- var isClearing = false;
13888
13888
  var sendEvent;
13889
13889
  var setInput;
13890
13890
  var setOpen;
13891
13891
  var focusInput;
13892
- var setIsClearing;
13893
13892
  var setFeedbackState;
13894
13893
  var hasValidatedEntryPoints = false;
13895
13894
  var agentId = 'agentId' in options ? options.agentId : undefined;
@@ -13919,21 +13918,17 @@
13919
13918
  _chatInstance.messages = messagesParam;
13920
13919
  };
13921
13920
  var clearMessages = function clearMessages() {
13922
- if (!_chatInstance.messages || _chatInstance.messages.length === 0) {
13923
- return;
13924
- }
13925
13921
  var status = _chatInstance.status;
13926
13922
  if (status === 'submitted' || status === 'streaming') {
13927
13923
  _chatInstance.stop();
13928
13924
  }
13929
- setIsClearing(true);
13930
- };
13931
- var onClearTransitionEnd = function onClearTransitionEnd() {
13925
+ // Reset the non-reactive state first: `setMessages` and `clearError` emit
13926
+ // ChatState callbacks that synchronously re-render, so they must run last
13927
+ // for that render to see the cleared feedback and rotated conversation id.
13928
+ feedbackState = {};
13929
+ _chatInstance.resetConversationId();
13932
13930
  setMessages([]);
13933
13931
  _chatInstance.clearError();
13934
- _chatInstance.resetConversationId();
13935
- feedbackState = {};
13936
- setIsClearing(false);
13937
13932
  };
13938
13933
  var validateEntryPoints = function validateEntryPoints(instantSearchInstance) {
13939
13934
  if (disableTriggerValidation || hasValidatedEntryPoints) {
@@ -13999,22 +13994,37 @@
13999
13994
  }));
14000
13995
  }
14001
13996
  if ('agentId' in options && options.agentId) {
13997
+ var _options_requestOptions, _options_requestOptions1;
14002
13998
  if (!appId || !apiKey) {
14003
13999
  throw new Error(withUsage$o('Could not extract Algolia credentials from the search client.'));
14004
14000
  }
14005
- var baseApi = "https://".concat(appId, ".algolia.net/agent-studio/1/agents/").concat(agentId, "/completions?compatibilityMode=ai-sdk-5");
14001
+ var createApi = function createApi() {
14002
+ var bypassCache = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
14003
+ var _options_requestOptions;
14004
+ var api = new URL("https://".concat(appId, ".algolia.net/agent-studio/1/agents/").concat(agentId, "/completions"));
14005
+ var queryParameters = _object_spread(_object_spread_props(_object_spread({}, (_options_requestOptions = options.requestOptions) === null || _options_requestOptions === void 0 ? void 0 : _options_requestOptions.queryParameters), {
14006
+ compatibilityMode: 'ai-sdk-5'
14007
+ }), bypassCache ? {
14008
+ cache: false
14009
+ } : {});
14010
+ api.search = new URLSearchParams(queryParameters).toString();
14011
+ return api.toString();
14012
+ };
14013
+ var baseApi = createApi();
14006
14014
  transport = new DefaultChatTransport({
14007
14015
  api: baseApi,
14008
- headers: {
14016
+ headers: _object_spread_props(_object_spread({}, _instanceof((_options_requestOptions = options.requestOptions) === null || _options_requestOptions === void 0 ? void 0 : _options_requestOptions.headers, Headers) ? Object.fromEntries(options.requestOptions.headers.entries()) : (_options_requestOptions1 = options.requestOptions) === null || _options_requestOptions1 === void 0 ? void 0 : _options_requestOptions1.headers), {
14017
+ // Preserve the required Algolia identity headers and chat agent
14018
+ // marker, even when requestOptions.headers contains the same keys.
14009
14019
  'x-algolia-application-id': appId,
14010
14020
  'x-algolia-api-key': apiKey,
14011
14021
  'x-algolia-agent': "".concat(getAlgoliaAgent(client), "; chat")
14012
- },
14022
+ }),
14013
14023
  prepareSendMessagesRequest: function prepareSendMessagesRequest(param) {
14014
14024
  var id = param.id, messages = param.messages, trigger = param.trigger, messageId = param.messageId;
14015
14025
  return {
14016
14026
  // Bypass cache when regenerating to ensure fresh responses
14017
- api: trigger === 'regenerate-message' ? "".concat(baseApi, "&cache=false") : baseApi,
14027
+ api: trigger === 'regenerate-message' ? createApi(true) : baseApi,
14018
14028
  body: {
14019
14029
  id: id,
14020
14030
  messageId: messageId,
@@ -14099,10 +14109,6 @@
14099
14109
  input = i;
14100
14110
  render();
14101
14111
  };
14102
- setIsClearing = function setIsClearing(value) {
14103
- isClearing = value;
14104
- render();
14105
- };
14106
14112
  setFeedbackState = function setFeedbackState(messageId, state) {
14107
14113
  feedbackState = _object_spread_props(_object_spread({}, feedbackState), _define_property({}, messageId, state));
14108
14114
  render();
@@ -14221,9 +14227,7 @@
14221
14227
  focusInput: focusInput,
14222
14228
  setMessages: setMessages,
14223
14229
  suggestions: getSuggestionsFromMessages(_chatInstance.messages),
14224
- isClearing: isClearing,
14225
14230
  clearMessages: clearMessages,
14226
- onClearTransitionEnd: onClearTransitionEnd,
14227
14231
  tools: toolsWithAddToolResult,
14228
14232
  sendChatMessageFeedback: _sendChatMessageFeedback,
14229
14233
  feedbackState: feedbackState,
@@ -20448,9 +20452,8 @@
20448
20452
  Fragment: Fragment
20449
20453
  });
20450
20454
  // Skip re-rendering (and re-compiling the markdown of) completed messages on
20451
- // every streaming delta. Falls back to the plain component when the host
20452
- // renderer doesn't provide a `memo` HOC.
20453
- var MemoizedDefaultMessage = memo ? memo(DefaultMessageComponent, areMessagePropsEqual) : DefaultMessageComponent;
20455
+ // every streaming delta.
20456
+ var MemoizedDefaultMessage = memo(DefaultMessageComponent, areMessagePropsEqual);
20454
20457
  var DefaultLoaderComponent = createChatMessageLoaderComponent({
20455
20458
  createElement: createElement
20456
20459
  });
@@ -20827,8 +20830,11 @@
20827
20830
  };
20828
20831
  }
20829
20832
 
20833
+ function prefersReducedMotion() {
20834
+ return typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
20835
+ }
20830
20836
  function createChatComponent(param) {
20831
- var createElement = param.createElement, Fragment = param.Fragment, memo = param.memo;
20837
+ var createElement = param.createElement, Fragment = param.Fragment, memo = param.memo, useState = param.useState;
20832
20838
  var ChatHeader = createChatHeaderComponent({
20833
20839
  createElement: createElement,
20834
20840
  Fragment: Fragment
@@ -20869,11 +20875,38 @@
20869
20875
  "stop",
20870
20876
  "error"
20871
20877
  ]);
20878
+ var _useState = _sliced_to_array(useState(false), 2), isClearing = _useState[0], setIsClearing = _useState[1];
20879
+ var commitClear = headerProps.onClear || messagesProps.onNewConversation;
20880
+ var startClear = function startClear() {
20881
+ if (!commitClear) {
20882
+ return;
20883
+ }
20884
+ // Reduced motion disables the transition, so `transitionend` never fires;
20885
+ // commit immediately instead of waiting for it.
20886
+ if (prefersReducedMotion()) {
20887
+ commitClear();
20888
+ return;
20889
+ }
20890
+ // Stop streaming now so the assistant stops immediately, not after the fade.
20891
+ if (messagesProps.status === 'submitted' || messagesProps.status === 'streaming') {
20892
+ stop();
20893
+ }
20894
+ setIsClearing(true);
20895
+ };
20896
+ var finishClear = function finishClear() {
20897
+ commitClear === null || commitClear === void 0 ? void 0 : commitClear();
20898
+ setIsClearing(false);
20899
+ };
20872
20900
  var headerComponent = createElement(HeaderComponent || ChatHeader, _object_spread_props(_object_spread({}, headerProps), {
20901
+ onClear: commitClear ? startClear : headerProps.onClear,
20902
+ canClear: headerProps.canClear && !isClearing,
20873
20903
  classNames: classNames.header,
20874
20904
  maximized: maximized
20875
20905
  }));
20876
20906
  var messagesComponent = /*#__PURE__*/ createElement(ChatMessages, _object_spread_props(_object_spread({}, messagesProps), {
20907
+ isClearing: isClearing,
20908
+ onClearTransitionEnd: finishClear,
20909
+ onNewConversation: commitClear ? startClear : messagesProps.onNewConversation,
20877
20910
  error: error,
20878
20911
  classNames: classNames.messages,
20879
20912
  messageClassNames: classNames.message,
@@ -20898,9 +20931,9 @@
20898
20931
  messages: messagesProps.messages,
20899
20932
  status: messagesProps.status,
20900
20933
  tools: messagesProps.tools,
20901
- isClearing: messagesProps.isClearing,
20902
- clearMessages: headerProps.onClear,
20903
- onClearTransitionEnd: messagesProps.onClearTransitionEnd,
20934
+ isClearing: isClearing,
20935
+ clearMessages: commitClear ? startClear : headerProps.onClear,
20936
+ onClearTransitionEnd: finishClear,
20904
20937
  suggestions: suggestionsProps.suggestions,
20905
20938
  sendMessage: sendMessage,
20906
20939
  regenerate: regenerate,
@@ -23395,7 +23428,8 @@
23395
23428
  var ChatUiComponent = createChatComponent({
23396
23429
  createElement: React.createElement,
23397
23430
  Fragment: React.Fragment,
23398
- memo: React.memo
23431
+ memo: React.memo,
23432
+ useState: React.useState
23399
23433
  });
23400
23434
  function createDefaultTools(itemComponent, getSearchPageURL) {
23401
23435
  var _obj;
@@ -23460,7 +23494,7 @@
23460
23494
  tools: tools,
23461
23495
  disableTriggerValidation: effectiveDisableTriggerValidation
23462
23496
  }));
23463
- 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, isClearing = chatState.isClearing, clearMessages = chatState.clearMessages, onClearTransitionEnd = chatState.onClearTransitionEnd, toolsFromConnector = chatState.tools, suggestions = chatState.suggestions, onFeedback = chatState.sendChatMessageFeedback, feedbackState = chatState.feedbackState;
23497
+ 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;
23464
23498
  React.useImperativeHandle(ref, function() {
23465
23499
  return {
23466
23500
  setOpen: setOpen,
@@ -23524,7 +23558,7 @@
23524
23558
  return setMaximized(!maximized);
23525
23559
  },
23526
23560
  onClear: clearMessages,
23527
- canClear: Boolean(messages === null || messages === void 0 ? void 0 : messages.length) && !isClearing,
23561
+ canClear: Boolean(messages === null || messages === void 0 ? void 0 : messages.length),
23528
23562
  titleIconComponent: headerTitleIconComponent,
23529
23563
  closeIconComponent: headerCloseIconComponent,
23530
23564
  minimizeIconComponent: headerMinimizeIconComponent,
@@ -23550,8 +23584,6 @@
23550
23584
  tools: toolsFromConnector,
23551
23585
  indexUiState: indexUiState,
23552
23586
  setIndexUiState: setIndexUiState,
23553
- isClearing: isClearing,
23554
- onClearTransitionEnd: onClearTransitionEnd,
23555
23587
  isScrollAtBottom: isAtBottom,
23556
23588
  scrollRef: scrollRef,
23557
23589
  contentRef: contentRef,