react-instantsearch 7.18.0 → 7.19.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.
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
@@ -9,9 +8,10 @@ var _instantsearchUiComponents = require("instantsearch-ui-components");
9
8
  var _react = _interopRequireWildcard(require("react"));
10
9
  var _reactInstantsearchCore = require("react-instantsearch-core");
11
10
  var _AutocompleteSearch = require("../components/AutocompleteSearch");
12
- var _excluded = ["indices", "showSuggestions"],
13
- _excluded2 = ["indicesConfig", "refineSearchBox", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage"];
11
+ var _excluded = ["indices", "showSuggestions", "showRecent"],
12
+ _excluded2 = ["indicesConfig", "refineSearchBox", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage", "showRecent"];
14
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
15
15
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
16
16
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
17
17
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
@@ -42,6 +42,10 @@ var AutocompleteSuggestion = (0, _instantsearchUiComponents.createAutocompleteSu
42
42
  createElement: _react.createElement,
43
43
  Fragment: _react.Fragment
44
44
  });
45
+ var AutocompleteRecentSearch = (0, _instantsearchUiComponents.createAutocompleteRecentSearchComponent)({
46
+ createElement: _react.createElement,
47
+ Fragment: _react.Fragment
48
+ });
45
49
  var usePropGetters = (0, _instantsearchUiComponents.createAutocompletePropGetters)({
46
50
  useEffect: _react.useEffect,
47
51
  useId: _react.useId,
@@ -49,6 +53,11 @@ var usePropGetters = (0, _instantsearchUiComponents.createAutocompletePropGetter
49
53
  useRef: _react.useRef,
50
54
  useState: _react.useState
51
55
  });
56
+ var useStorage = (0, _instantsearchUiComponents.createAutocompleteStorage)({
57
+ useEffect: _react.useEffect,
58
+ useMemo: _react.useMemo,
59
+ useState: _react.useState
60
+ });
52
61
  var _ref2 = /*#__PURE__*/_react.default.createElement(_reactInstantsearchCore.Configure, {
53
62
  hitsPerPage: 5
54
63
  });
@@ -56,6 +65,7 @@ function EXPERIMENTAL_Autocomplete(_ref) {
56
65
  var _ref$indices = _ref.indices,
57
66
  indices = _ref$indices === void 0 ? [] : _ref$indices,
58
67
  showSuggestions = _ref.showSuggestions,
68
+ showRecent = _ref.showRecent,
59
69
  props = _objectWithoutProperties(_ref, _excluded);
60
70
  var _useInstantSearch = (0, _reactInstantsearchCore.useInstantSearch)(),
61
71
  indexUiState = _useInstantSearch.indexUiState,
@@ -98,7 +108,8 @@ function EXPERIMENTAL_Autocomplete(_ref) {
98
108
  indicesConfig: indicesConfig,
99
109
  refineSearchBox: refine,
100
110
  indexUiState: indexUiState,
101
- isSearchPage: isSearchPage
111
+ isSearchPage: isSearchPage,
112
+ showRecent: showRecent
102
113
  }))));
103
114
  }
104
115
  function InnerAutocomplete(_ref3) {
@@ -108,16 +119,29 @@ function InnerAutocomplete(_ref3) {
108
119
  userOnSelect = _ref3.onSelect,
109
120
  indexUiState = _ref3.indexUiState,
110
121
  isSearchPage = _ref3.isSearchPage,
122
+ showRecent = _ref3.showRecent,
111
123
  props = _objectWithoutProperties(_ref3, _excluded2);
112
124
  var _useAutocomplete = (0, _reactInstantsearchCore.useAutocomplete)(),
113
125
  indices = _useAutocomplete.indices,
114
- refineAutocomplete = _useAutocomplete.refine;
115
- var _usePropGetters = usePropGetters({
126
+ refineAutocomplete = _useAutocomplete.refine,
127
+ currentRefinement = _useAutocomplete.currentRefinement;
128
+ var _useStorage = useStorage({
129
+ showRecent: showRecent,
130
+ query: currentRefinement,
116
131
  indices: indices,
117
- indicesConfig: indicesConfig,
132
+ indicesConfig: indicesConfig
133
+ }),
134
+ storage = _useStorage.storage,
135
+ storageHits = _useStorage.storageHits,
136
+ indicesForPropGetters = _useStorage.indicesForPropGetters,
137
+ indicesConfigForPropGetters = _useStorage.indicesConfigForPropGetters;
138
+ var _usePropGetters = usePropGetters({
139
+ indices: indicesForPropGetters,
140
+ indicesConfig: indicesConfigForPropGetters,
118
141
  onRefine: function onRefine(query) {
119
142
  refineAutocomplete(query);
120
143
  refineSearchBox(query);
144
+ storage.onAdd(query);
121
145
  },
122
146
  onSelect: userOnSelect !== null && userOnSelect !== void 0 ? userOnSelect : function (_ref4) {
123
147
  var query = _ref4.query,
@@ -140,15 +164,37 @@ function InnerAutocomplete(_ref3) {
140
164
  getItemProps = _usePropGetters.getItemProps,
141
165
  getPanelProps = _usePropGetters.getPanelProps,
142
166
  getRootProps = _usePropGetters.getRootProps;
167
+ var AutocompleteRecentSearchComponent = _typeof(showRecent) === 'object' && showRecent.itemComponent || AutocompleteRecentSearch;
143
168
  return /*#__PURE__*/_react.default.createElement(Autocomplete, _extends({}, props, getRootProps()), /*#__PURE__*/_react.default.createElement(_AutocompleteSearch.AutocompleteSearch, {
144
169
  inputProps: getInputProps(),
145
170
  clearQuery: function clearQuery() {
146
171
  refineSearchBox('');
147
172
  refineAutocomplete('');
148
173
  }
149
- }), /*#__PURE__*/_react.default.createElement(AutocompletePanel, getPanelProps(), indices.map(function (_ref5, index) {
150
- var indexId = _ref5.indexId,
151
- hits = _ref5.hits;
174
+ }), /*#__PURE__*/_react.default.createElement(AutocompletePanel, getPanelProps(), showRecent && /*#__PURE__*/_react.default.createElement(AutocompleteIndex
175
+ // @ts-ignore - there seems to be problems with React.ComponentType and this, but it's actually correct
176
+ , {
177
+ ItemComponent: function ItemComponent(_ref5) {
178
+ var item = _ref5.item,
179
+ onSelect = _ref5.onSelect;
180
+ return /*#__PURE__*/_react.default.createElement(AutocompleteRecentSearchComponent, {
181
+ item: item,
182
+ onSelect: onSelect,
183
+ onRemoveRecentSearch: function onRemoveRecentSearch() {
184
+ return storage.onRemove(item.query);
185
+ }
186
+ });
187
+ },
188
+ classNames: {
189
+ root: 'ais-AutocompleteRecentSearches',
190
+ list: 'ais-AutocompleteRecentSearchesList',
191
+ item: 'ais-AutocompleteRecentSearchesItem'
192
+ },
193
+ items: storageHits,
194
+ getItemProps: getItemProps
195
+ }), indices.map(function (_ref6, index) {
196
+ var indexId = _ref6.indexId,
197
+ hits = _ref6.hits;
152
198
  return /*#__PURE__*/_react.default.createElement(AutocompleteIndex, {
153
199
  key: indexId
154
200
  // @ts-expect-error - there seems to be problems with React.ComponentType and this, but it's actually correct
@@ -17,14 +17,13 @@ Object.defineProperty(exports, "SearchIndexToolType", {
17
17
  }
18
18
  });
19
19
  exports.createDefaultTools = createDefaultTools;
20
- var _ai = require("ai");
21
20
  var _instantsearchUiComponents = require("instantsearch-ui-components");
22
21
  var _chat = require("instantsearch.js/cjs/lib/chat");
23
22
  var _react = _interopRequireWildcard(require("react"));
24
23
  var _reactInstantsearchCore = require("react-instantsearch-core");
25
24
  var _useStickToBottom2 = require("../lib/useStickToBottom");
26
25
  var _SearchIndexTool = require("./chat/tools/SearchIndexTool");
27
- var _excluded = ["tools", "defaultOpen", "toggleButtonProps", "headerProps", "messagesProps", "promptProps", "itemComponent", "toggleButtonComponent", "toggleButtonIconComponent", "headerComponent", "headerTitleIconComponent", "headerCloseIconComponent", "headerMinimizeIconComponent", "headerMaximizeIconComponent", "messagesLoaderComponent", "messagesErrorComponent", "promptComponent", "promptHeaderComponent", "promptFooterComponent", "actionsComponent", "classNames", "translations", "title", "getSearchPageURL"];
26
+ var _excluded = ["tools", "toggleButtonProps", "headerProps", "messagesProps", "promptProps", "itemComponent", "toggleButtonComponent", "toggleButtonIconComponent", "headerComponent", "headerTitleIconComponent", "headerCloseIconComponent", "headerMinimizeIconComponent", "headerMaximizeIconComponent", "messagesLoaderComponent", "messagesErrorComponent", "promptComponent", "promptHeaderComponent", "promptFooterComponent", "assistantMessageLeadingComponent", "assistantMessageFooterComponent", "userMessageLeadingComponent", "userMessageFooterComponent", "actionsComponent", "classNames", "translations", "title", "getSearchPageURL"];
28
27
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
29
28
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
30
29
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -50,8 +49,6 @@ function createDefaultTools(itemComponent, getSearchPageURL) {
50
49
  }
51
50
  function Chat(_ref2) {
52
51
  var userTools = _ref2.tools,
53
- _ref2$defaultOpen = _ref2.defaultOpen,
54
- defaultOpen = _ref2$defaultOpen === void 0 ? false : _ref2$defaultOpen,
55
52
  toggleButtonProps = _ref2.toggleButtonProps,
56
53
  headerProps = _ref2.headerProps,
57
54
  messagesProps = _ref2.messagesProps,
@@ -69,6 +66,10 @@ function Chat(_ref2) {
69
66
  promptComponent = _ref2.promptComponent,
70
67
  promptHeaderComponent = _ref2.promptHeaderComponent,
71
68
  promptFooterComponent = _ref2.promptFooterComponent,
69
+ assistantMessageLeadingComponent = _ref2.assistantMessageLeadingComponent,
70
+ assistantMessageFooterComponent = _ref2.assistantMessageFooterComponent,
71
+ userMessageLeadingComponent = _ref2.userMessageLeadingComponent,
72
+ userMessageFooterComponent = _ref2.userMessageFooterComponent,
72
73
  actionsComponent = _ref2.actionsComponent,
73
74
  classNames = _ref2.classNames,
74
75
  _ref2$translations = _ref2.translations,
@@ -78,6 +79,7 @@ function Chat(_ref2) {
78
79
  props = _objectWithoutProperties(_ref2, _excluded);
79
80
  var promptTranslations = translations.prompt,
80
81
  headerTranslations = translations.header,
82
+ messageTranslations = translations.message,
81
83
  messagesTranslations = translations.messages;
82
84
  var _useInstantSearch = (0, _reactInstantsearchCore.useInstantSearch)(),
83
85
  indexUiState = _useInstantSearch.indexUiState,
@@ -99,25 +101,23 @@ function Chat(_ref2) {
99
101
  var defaults = createDefaultTools(itemComponent, getSearchPageURL);
100
102
  return _objectSpread(_objectSpread({}, defaults), userTools);
101
103
  }, [getSearchPageURL, itemComponent, userTools]);
102
- var _useChat = (0, _reactInstantsearchCore.useChat)(_objectSpread(_objectSpread({}, props), {}, {
103
- defaultOpen: defaultOpen,
104
- tools: tools,
105
- sendAutomaticallyWhen: _ai.lastAssistantMessageIsCompleteWithToolCalls
106
- })),
107
- messages = _useChat.messages,
108
- sendMessage = _useChat.sendMessage,
109
- status = _useChat.status,
110
- regenerate = _useChat.regenerate,
111
- stop = _useChat.stop,
112
- error = _useChat.error,
113
- input = _useChat.input,
114
- setInput = _useChat.setInput,
115
- open = _useChat.open,
116
- setOpen = _useChat.setOpen,
117
- isClearing = _useChat.isClearing,
118
- clearMessages = _useChat.clearMessages,
119
- onClearTransitionEnd = _useChat.onClearTransitionEnd,
120
- hookTools = _useChat.tools;
104
+ var chatState = (0, _reactInstantsearchCore.useChat)(_objectSpread(_objectSpread({}, props), {}, {
105
+ tools: tools
106
+ }));
107
+ var messages = chatState.messages,
108
+ sendMessage = chatState.sendMessage,
109
+ status = chatState.status,
110
+ regenerate = chatState.regenerate,
111
+ stop = chatState.stop,
112
+ error = chatState.error,
113
+ input = chatState.input,
114
+ setInput = chatState.setInput,
115
+ open = chatState.open,
116
+ setOpen = chatState.setOpen,
117
+ isClearing = chatState.isClearing,
118
+ clearMessages = chatState.clearMessages,
119
+ onClearTransitionEnd = chatState.onClearTransitionEnd,
120
+ toolsFromConnector = chatState.tools;
121
121
  if (process.env.NODE_ENV === 'development' && error) {
122
122
  throw error;
123
123
  }
@@ -162,7 +162,7 @@ function Chat(_ref2) {
162
162
  return setOpen(false);
163
163
  },
164
164
  messages: messages,
165
- tools: hookTools,
165
+ tools: toolsFromConnector,
166
166
  indexUiState: indexUiState,
167
167
  setIndexUiState: setIndexUiState,
168
168
  isClearing: isClearing,
@@ -174,7 +174,16 @@ function Chat(_ref2) {
174
174
  loaderComponent: messagesLoaderComponent,
175
175
  errorComponent: messagesErrorComponent,
176
176
  actionsComponent: actionsComponent,
177
- translations: messagesTranslations
177
+ assistantMessageProps: _objectSpread({
178
+ leadingComponent: assistantMessageLeadingComponent,
179
+ footerComponent: assistantMessageFooterComponent
180
+ }, messagesProps === null || messagesProps === void 0 ? void 0 : messagesProps.assistantMessageProps),
181
+ userMessageProps: _objectSpread({
182
+ leadingComponent: userMessageLeadingComponent,
183
+ footerComponent: userMessageFooterComponent
184
+ }, messagesProps === null || messagesProps === void 0 ? void 0 : messagesProps.userMessageProps),
185
+ translations: messagesTranslations,
186
+ messageTranslations: messageTranslations
178
187
  }, messagesProps),
179
188
  promptProps: _objectSpread({
180
189
  promptRef: promptRef,
@@ -12,9 +12,23 @@ export type AutocompleteProps<TItem extends BaseHit> = ComponentProps<'div'> & {
12
12
  showSuggestions?: Partial<Pick<IndexConfig<{
13
13
  query: string;
14
14
  }>, 'indexName' | 'getURL' | 'headerComponent' | 'itemComponent' | 'classNames'>>;
15
+ showRecent?: boolean | {
16
+ /**
17
+ * Storage key to use in the local storage.
18
+ */
19
+ storageKey?: string;
20
+ /**
21
+ * Component to use for each recent search item.
22
+ */
23
+ itemComponent: AutocompleteIndexProps<{
24
+ query: string;
25
+ }>['ItemComponent'] & {
26
+ onRemoveRecentSearch: () => void;
27
+ };
28
+ };
15
29
  getSearchPageURL?: (nextUiState: IndexUiState) => string;
16
30
  onSelect?: AutocompleteIndexConfig<TItem>['onSelect'];
17
31
  classNames?: Partial<AutocompleteClassNames>;
18
32
  };
19
- export declare function EXPERIMENTAL_Autocomplete<TItem extends BaseHit = BaseHit>({ indices, showSuggestions, ...props }: AutocompleteProps<TItem>): React.JSX.Element;
33
+ export declare function EXPERIMENTAL_Autocomplete<TItem extends BaseHit = BaseHit>({ indices, showSuggestions, showRecent, ...props }: AutocompleteProps<TItem>): React.JSX.Element;
20
34
  export {};
@@ -1,6 +1,6 @@
1
+ var _excluded = ["indices", "showSuggestions", "showRecent"],
2
+ _excluded2 = ["indicesConfig", "refineSearchBox", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage", "showRecent"];
1
3
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
- var _excluded = ["indices", "showSuggestions"],
3
- _excluded2 = ["indicesConfig", "refineSearchBox", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage"];
4
4
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
5
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
6
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
@@ -15,7 +15,7 @@ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(
15
15
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
16
16
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
17
17
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
18
- import { createAutocompleteComponent, createAutocompleteIndexComponent, createAutocompletePanelComponent, createAutocompletePropGetters, createAutocompleteSuggestionComponent, cx } from 'instantsearch-ui-components';
18
+ import { createAutocompleteComponent, createAutocompleteIndexComponent, createAutocompletePanelComponent, createAutocompletePropGetters, createAutocompleteSuggestionComponent, createAutocompleteRecentSearchComponent, createAutocompleteStorage, cx } from 'instantsearch-ui-components';
19
19
  import React, { createElement, Fragment, useEffect, useId, useMemo, useRef, useState } from 'react';
20
20
  import { Configure, Index, useAutocomplete, useInstantSearch, useSearchBox } from 'react-instantsearch-core';
21
21
  import { AutocompleteSearch } from "../components/AutocompleteSearch.js";
@@ -35,6 +35,10 @@ var AutocompleteSuggestion = createAutocompleteSuggestionComponent({
35
35
  createElement: createElement,
36
36
  Fragment: Fragment
37
37
  });
38
+ var AutocompleteRecentSearch = createAutocompleteRecentSearchComponent({
39
+ createElement: createElement,
40
+ Fragment: Fragment
41
+ });
38
42
  var usePropGetters = createAutocompletePropGetters({
39
43
  useEffect: useEffect,
40
44
  useId: useId,
@@ -42,6 +46,11 @@ var usePropGetters = createAutocompletePropGetters({
42
46
  useRef: useRef,
43
47
  useState: useState
44
48
  });
49
+ var useStorage = createAutocompleteStorage({
50
+ useEffect: useEffect,
51
+ useMemo: useMemo,
52
+ useState: useState
53
+ });
45
54
  var _ref2 = /*#__PURE__*/React.createElement(Configure, {
46
55
  hitsPerPage: 5
47
56
  });
@@ -49,6 +58,7 @@ export function EXPERIMENTAL_Autocomplete(_ref) {
49
58
  var _ref$indices = _ref.indices,
50
59
  indices = _ref$indices === void 0 ? [] : _ref$indices,
51
60
  showSuggestions = _ref.showSuggestions,
61
+ showRecent = _ref.showRecent,
52
62
  props = _objectWithoutProperties(_ref, _excluded);
53
63
  var _useInstantSearch = useInstantSearch(),
54
64
  indexUiState = _useInstantSearch.indexUiState,
@@ -91,7 +101,8 @@ export function EXPERIMENTAL_Autocomplete(_ref) {
91
101
  indicesConfig: indicesConfig,
92
102
  refineSearchBox: refine,
93
103
  indexUiState: indexUiState,
94
- isSearchPage: isSearchPage
104
+ isSearchPage: isSearchPage,
105
+ showRecent: showRecent
95
106
  }))));
96
107
  }
97
108
  function InnerAutocomplete(_ref3) {
@@ -101,16 +112,29 @@ function InnerAutocomplete(_ref3) {
101
112
  userOnSelect = _ref3.onSelect,
102
113
  indexUiState = _ref3.indexUiState,
103
114
  isSearchPage = _ref3.isSearchPage,
115
+ showRecent = _ref3.showRecent,
104
116
  props = _objectWithoutProperties(_ref3, _excluded2);
105
117
  var _useAutocomplete = useAutocomplete(),
106
118
  indices = _useAutocomplete.indices,
107
- refineAutocomplete = _useAutocomplete.refine;
108
- var _usePropGetters = usePropGetters({
119
+ refineAutocomplete = _useAutocomplete.refine,
120
+ currentRefinement = _useAutocomplete.currentRefinement;
121
+ var _useStorage = useStorage({
122
+ showRecent: showRecent,
123
+ query: currentRefinement,
109
124
  indices: indices,
110
- indicesConfig: indicesConfig,
125
+ indicesConfig: indicesConfig
126
+ }),
127
+ storage = _useStorage.storage,
128
+ storageHits = _useStorage.storageHits,
129
+ indicesForPropGetters = _useStorage.indicesForPropGetters,
130
+ indicesConfigForPropGetters = _useStorage.indicesConfigForPropGetters;
131
+ var _usePropGetters = usePropGetters({
132
+ indices: indicesForPropGetters,
133
+ indicesConfig: indicesConfigForPropGetters,
111
134
  onRefine: function onRefine(query) {
112
135
  refineAutocomplete(query);
113
136
  refineSearchBox(query);
137
+ storage.onAdd(query);
114
138
  },
115
139
  onSelect: userOnSelect !== null && userOnSelect !== void 0 ? userOnSelect : function (_ref4) {
116
140
  var query = _ref4.query,
@@ -133,15 +157,37 @@ function InnerAutocomplete(_ref3) {
133
157
  getItemProps = _usePropGetters.getItemProps,
134
158
  getPanelProps = _usePropGetters.getPanelProps,
135
159
  getRootProps = _usePropGetters.getRootProps;
160
+ var AutocompleteRecentSearchComponent = _typeof(showRecent) === 'object' && showRecent.itemComponent || AutocompleteRecentSearch;
136
161
  return /*#__PURE__*/React.createElement(Autocomplete, _extends({}, props, getRootProps()), /*#__PURE__*/React.createElement(AutocompleteSearch, {
137
162
  inputProps: getInputProps(),
138
163
  clearQuery: function clearQuery() {
139
164
  refineSearchBox('');
140
165
  refineAutocomplete('');
141
166
  }
142
- }), /*#__PURE__*/React.createElement(AutocompletePanel, getPanelProps(), indices.map(function (_ref5, index) {
143
- var indexId = _ref5.indexId,
144
- hits = _ref5.hits;
167
+ }), /*#__PURE__*/React.createElement(AutocompletePanel, getPanelProps(), showRecent && /*#__PURE__*/React.createElement(AutocompleteIndex
168
+ // @ts-ignore - there seems to be problems with React.ComponentType and this, but it's actually correct
169
+ , {
170
+ ItemComponent: function ItemComponent(_ref5) {
171
+ var item = _ref5.item,
172
+ onSelect = _ref5.onSelect;
173
+ return /*#__PURE__*/React.createElement(AutocompleteRecentSearchComponent, {
174
+ item: item,
175
+ onSelect: onSelect,
176
+ onRemoveRecentSearch: function onRemoveRecentSearch() {
177
+ return storage.onRemove(item.query);
178
+ }
179
+ });
180
+ },
181
+ classNames: {
182
+ root: 'ais-AutocompleteRecentSearches',
183
+ list: 'ais-AutocompleteRecentSearchesList',
184
+ item: 'ais-AutocompleteRecentSearchesItem'
185
+ },
186
+ items: storageHits,
187
+ getItemProps: getItemProps
188
+ }), indices.map(function (_ref6, index) {
189
+ var indexId = _ref6.indexId,
190
+ hits = _ref6.hits;
145
191
  return /*#__PURE__*/React.createElement(AutocompleteIndex, {
146
192
  key: indexId
147
193
  // @ts-expect-error - there seems to be problems with React.ComponentType and this, but it's actually correct
@@ -1,23 +1,22 @@
1
1
  import { SearchIndexToolType, RecommendToolType } from 'instantsearch.js/es/lib/chat';
2
2
  import React from 'react';
3
3
  export { SearchIndexToolType, RecommendToolType };
4
- import type { ChatProps as ChatUiProps, RecommendComponentProps, RecordWithObjectID, UserClientSideTool, UserClientSideTools } from 'instantsearch-ui-components';
4
+ import type { ChatProps as ChatUiProps, RecommendComponentProps, RecordWithObjectID, UserClientSideTool, UserClientSideTools, ChatMessageProps } from 'instantsearch-ui-components';
5
5
  import type { IndexUiState } from 'instantsearch.js';
6
6
  import type { UIMessage } from 'instantsearch.js/es/lib/chat';
7
- import type { UseChatOptions } from 'react-instantsearch-core';
7
+ import type { UseChatProps } from 'react-instantsearch-core';
8
8
  export declare function createDefaultTools<TObject extends RecordWithObjectID>(itemComponent?: ItemComponent<TObject>, getSearchPageURL?: (nextUiState: IndexUiState) => string): UserClientSideTools;
9
9
  type ItemComponent<TObject> = RecommendComponentProps<TObject>['itemComponent'];
10
10
  type UiProps = Pick<ChatUiProps, 'open' | 'headerProps' | 'toggleButtonProps' | 'messagesProps' | 'promptProps' | 'headerComponent' | 'promptComponent'>;
11
11
  type UserToggleButtonProps = Omit<ChatUiProps['toggleButtonProps'], 'open' | 'onClick'>;
12
12
  type UserHeaderProps = Omit<ChatUiProps['headerProps'], 'onClose'>;
13
- type UserMessagesProps = Omit<ChatUiProps['messagesProps'], 'messages' | 'tools' | 'indexUiState' | 'setIndexUiState' | 'scrollRef' | 'contentRef'>;
13
+ type UserMessagesProps = Omit<ChatUiProps['messagesProps'], 'messages' | 'tools' | 'indexUiState' | 'setIndexUiState' | 'scrollRef' | 'contentRef' | 'messageComponent' | 'leadingComponent' | 'footerComponent' | 'translations' | 'classNames'>;
14
14
  type UserPromptProps = Omit<ChatUiProps['promptProps'], 'value' | 'onInput' | 'onSubmit' | 'headerComponent' | 'footerComponent'>;
15
15
  export type Tool = UserClientSideTool;
16
16
  export type Tools = UserClientSideTools;
17
- export type ChatProps<TObject, TUiMessage extends UIMessage = UIMessage> = Omit<ChatUiProps, keyof UiProps> & UseChatOptions<TUiMessage> & {
17
+ export type ChatProps<TObject, TUiMessage extends UIMessage = UIMessage> = Omit<ChatUiProps, keyof UiProps> & UseChatProps<TUiMessage> & {
18
18
  itemComponent?: ItemComponent<TObject>;
19
19
  tools?: UserClientSideTools;
20
- defaultOpen?: boolean;
21
20
  getSearchPageURL?: (nextUiState: IndexUiState) => string;
22
21
  toggleButtonProps?: UserToggleButtonProps;
23
22
  headerProps?: UserHeaderProps;
@@ -36,10 +35,15 @@ export type ChatProps<TObject, TUiMessage extends UIMessage = UIMessage> = Omit<
36
35
  promptHeaderComponent?: ChatUiProps['promptProps']['headerComponent'];
37
36
  promptFooterComponent?: ChatUiProps['promptProps']['footerComponent'];
38
37
  actionsComponent?: ChatUiProps['messagesProps']['actionsComponent'];
38
+ assistantMessageLeadingComponent?: ChatMessageProps['leadingComponent'];
39
+ assistantMessageFooterComponent?: ChatMessageProps['footerComponent'];
40
+ userMessageLeadingComponent?: ChatMessageProps['leadingComponent'];
41
+ userMessageFooterComponent?: ChatMessageProps['footerComponent'];
39
42
  translations?: Partial<{
40
43
  prompt: ChatUiProps['promptProps']['translations'];
41
44
  header: ChatUiProps['headerProps']['translations'];
45
+ message: ChatUiProps['messagesProps']['messageTranslations'];
42
46
  messages: ChatUiProps['messagesProps']['translations'];
43
47
  }>;
44
48
  };
45
- export declare function Chat<TObject extends RecordWithObjectID, TUiMessage extends UIMessage>({ tools: userTools, defaultOpen, toggleButtonProps, headerProps, messagesProps, promptProps, itemComponent, toggleButtonComponent, toggleButtonIconComponent, headerComponent, headerTitleIconComponent, headerCloseIconComponent, headerMinimizeIconComponent, headerMaximizeIconComponent, messagesLoaderComponent, messagesErrorComponent, promptComponent, promptHeaderComponent, promptFooterComponent, actionsComponent, classNames, translations, title, getSearchPageURL, ...props }: ChatProps<TObject, TUiMessage>): React.JSX.Element;
49
+ export declare function Chat<TObject extends RecordWithObjectID, TUiMessage extends UIMessage>({ tools: userTools, toggleButtonProps, headerProps, messagesProps, promptProps, itemComponent, toggleButtonComponent, toggleButtonIconComponent, headerComponent, headerTitleIconComponent, headerCloseIconComponent, headerMinimizeIconComponent, headerMaximizeIconComponent, messagesLoaderComponent, messagesErrorComponent, promptComponent, promptHeaderComponent, promptFooterComponent, assistantMessageLeadingComponent, assistantMessageFooterComponent, userMessageLeadingComponent, userMessageFooterComponent, actionsComponent, classNames, translations, title, getSearchPageURL, ...props }: ChatProps<TObject, TUiMessage>): React.JSX.Element;
@@ -1,4 +1,4 @@
1
- var _excluded = ["tools", "defaultOpen", "toggleButtonProps", "headerProps", "messagesProps", "promptProps", "itemComponent", "toggleButtonComponent", "toggleButtonIconComponent", "headerComponent", "headerTitleIconComponent", "headerCloseIconComponent", "headerMinimizeIconComponent", "headerMaximizeIconComponent", "messagesLoaderComponent", "messagesErrorComponent", "promptComponent", "promptHeaderComponent", "promptFooterComponent", "actionsComponent", "classNames", "translations", "title", "getSearchPageURL"];
1
+ var _excluded = ["tools", "toggleButtonProps", "headerProps", "messagesProps", "promptProps", "itemComponent", "toggleButtonComponent", "toggleButtonIconComponent", "headerComponent", "headerTitleIconComponent", "headerCloseIconComponent", "headerMinimizeIconComponent", "headerMaximizeIconComponent", "messagesLoaderComponent", "messagesErrorComponent", "promptComponent", "promptHeaderComponent", "promptFooterComponent", "assistantMessageLeadingComponent", "assistantMessageFooterComponent", "userMessageLeadingComponent", "userMessageFooterComponent", "actionsComponent", "classNames", "translations", "title", "getSearchPageURL"];
2
2
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
3
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
4
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -13,7 +13,6 @@ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t =
13
13
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
14
14
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
15
15
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
- import { lastAssistantMessageIsCompleteWithToolCalls } from 'ai';
17
16
  import { createChatComponent } from 'instantsearch-ui-components';
18
17
  import { SearchIndexToolType, RecommendToolType } from "instantsearch.js/es/lib/chat/index.js";
19
18
  import React, { createElement, Fragment } from 'react';
@@ -31,8 +30,6 @@ export function createDefaultTools(itemComponent, getSearchPageURL) {
31
30
  }
32
31
  export function Chat(_ref2) {
33
32
  var userTools = _ref2.tools,
34
- _ref2$defaultOpen = _ref2.defaultOpen,
35
- defaultOpen = _ref2$defaultOpen === void 0 ? false : _ref2$defaultOpen,
36
33
  toggleButtonProps = _ref2.toggleButtonProps,
37
34
  headerProps = _ref2.headerProps,
38
35
  messagesProps = _ref2.messagesProps,
@@ -50,6 +47,10 @@ export function Chat(_ref2) {
50
47
  promptComponent = _ref2.promptComponent,
51
48
  promptHeaderComponent = _ref2.promptHeaderComponent,
52
49
  promptFooterComponent = _ref2.promptFooterComponent,
50
+ assistantMessageLeadingComponent = _ref2.assistantMessageLeadingComponent,
51
+ assistantMessageFooterComponent = _ref2.assistantMessageFooterComponent,
52
+ userMessageLeadingComponent = _ref2.userMessageLeadingComponent,
53
+ userMessageFooterComponent = _ref2.userMessageFooterComponent,
53
54
  actionsComponent = _ref2.actionsComponent,
54
55
  classNames = _ref2.classNames,
55
56
  _ref2$translations = _ref2.translations,
@@ -59,6 +60,7 @@ export function Chat(_ref2) {
59
60
  props = _objectWithoutProperties(_ref2, _excluded);
60
61
  var promptTranslations = translations.prompt,
61
62
  headerTranslations = translations.header,
63
+ messageTranslations = translations.message,
62
64
  messagesTranslations = translations.messages;
63
65
  var _useInstantSearch = useInstantSearch(),
64
66
  indexUiState = _useInstantSearch.indexUiState,
@@ -80,25 +82,23 @@ export function Chat(_ref2) {
80
82
  var defaults = createDefaultTools(itemComponent, getSearchPageURL);
81
83
  return _objectSpread(_objectSpread({}, defaults), userTools);
82
84
  }, [getSearchPageURL, itemComponent, userTools]);
83
- var _useChat = useChat(_objectSpread(_objectSpread({}, props), {}, {
84
- defaultOpen: defaultOpen,
85
- tools: tools,
86
- sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls
87
- })),
88
- messages = _useChat.messages,
89
- sendMessage = _useChat.sendMessage,
90
- status = _useChat.status,
91
- regenerate = _useChat.regenerate,
92
- stop = _useChat.stop,
93
- error = _useChat.error,
94
- input = _useChat.input,
95
- setInput = _useChat.setInput,
96
- open = _useChat.open,
97
- setOpen = _useChat.setOpen,
98
- isClearing = _useChat.isClearing,
99
- clearMessages = _useChat.clearMessages,
100
- onClearTransitionEnd = _useChat.onClearTransitionEnd,
101
- hookTools = _useChat.tools;
85
+ var chatState = useChat(_objectSpread(_objectSpread({}, props), {}, {
86
+ tools: tools
87
+ }));
88
+ var messages = chatState.messages,
89
+ sendMessage = chatState.sendMessage,
90
+ status = chatState.status,
91
+ regenerate = chatState.regenerate,
92
+ stop = chatState.stop,
93
+ error = chatState.error,
94
+ input = chatState.input,
95
+ setInput = chatState.setInput,
96
+ open = chatState.open,
97
+ setOpen = chatState.setOpen,
98
+ isClearing = chatState.isClearing,
99
+ clearMessages = chatState.clearMessages,
100
+ onClearTransitionEnd = chatState.onClearTransitionEnd,
101
+ toolsFromConnector = chatState.tools;
102
102
  if (process.env.NODE_ENV === 'development' && error) {
103
103
  throw error;
104
104
  }
@@ -143,7 +143,7 @@ export function Chat(_ref2) {
143
143
  return setOpen(false);
144
144
  },
145
145
  messages: messages,
146
- tools: hookTools,
146
+ tools: toolsFromConnector,
147
147
  indexUiState: indexUiState,
148
148
  setIndexUiState: setIndexUiState,
149
149
  isClearing: isClearing,
@@ -155,7 +155,16 @@ export function Chat(_ref2) {
155
155
  loaderComponent: messagesLoaderComponent,
156
156
  errorComponent: messagesErrorComponent,
157
157
  actionsComponent: actionsComponent,
158
- translations: messagesTranslations
158
+ assistantMessageProps: _objectSpread({
159
+ leadingComponent: assistantMessageLeadingComponent,
160
+ footerComponent: assistantMessageFooterComponent
161
+ }, messagesProps === null || messagesProps === void 0 ? void 0 : messagesProps.assistantMessageProps),
162
+ userMessageProps: _objectSpread({
163
+ leadingComponent: userMessageLeadingComponent,
164
+ footerComponent: userMessageFooterComponent
165
+ }, messagesProps === null || messagesProps === void 0 ? void 0 : messagesProps.userMessageProps),
166
+ translations: messagesTranslations,
167
+ messageTranslations: messageTranslations
159
168
  }, messagesProps),
160
169
  promptProps: _objectSpread({
161
170
  promptRef: promptRef,