instantsearch-ui-components 0.16.0 → 0.17.1

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.
Files changed (31) hide show
  1. package/dist/cjs/components/FilterSuggestions.js +108 -0
  2. package/dist/cjs/components/autocomplete/AutocompleteIndex.js +3 -0
  3. package/dist/cjs/components/autocomplete/createAutocompletePropGetters.js +10 -4
  4. package/dist/cjs/components/autocomplete/createAutocompleteStorage.js +15 -2
  5. package/dist/cjs/components/chat/Chat.js +12 -2
  6. package/dist/cjs/components/chat/ChatMessage.js +3 -2
  7. package/dist/cjs/components/chat/ChatMessages.js +9 -5
  8. package/dist/cjs/components/chat/ChatPromptSuggestions.js +37 -0
  9. package/dist/cjs/components/index.js +22 -0
  10. package/dist/cjs/version.js +1 -1
  11. package/dist/es/components/FilterSuggestions.d.ts +108 -0
  12. package/dist/es/components/FilterSuggestions.js +101 -0
  13. package/dist/es/components/autocomplete/AutocompleteIndex.d.ts +1 -1
  14. package/dist/es/components/autocomplete/AutocompleteIndex.js +3 -0
  15. package/dist/es/components/autocomplete/createAutocompletePropGetters.js +10 -4
  16. package/dist/es/components/autocomplete/createAutocompleteStorage.d.ts +2 -1
  17. package/dist/es/components/autocomplete/createAutocompleteStorage.js +15 -2
  18. package/dist/es/components/chat/Chat.d.ts +7 -0
  19. package/dist/es/components/chat/Chat.js +12 -2
  20. package/dist/es/components/chat/ChatMessage.d.ts +5 -1
  21. package/dist/es/components/chat/ChatMessage.js +3 -2
  22. package/dist/es/components/chat/ChatMessages.d.ts +5 -1
  23. package/dist/es/components/chat/ChatMessages.js +9 -5
  24. package/dist/es/components/chat/ChatPromptSuggestions.d.ts +14 -0
  25. package/dist/es/components/chat/ChatPromptSuggestions.js +31 -0
  26. package/dist/es/components/chat/types.d.ts +343 -2
  27. package/dist/es/components/index.d.ts +2 -0
  28. package/dist/es/components/index.js +3 -1
  29. package/dist/es/version.d.ts +1 -1
  30. package/dist/es/version.js +1 -1
  31. package/package.json +2 -3
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createFilterSuggestionsComponent = createFilterSuggestionsComponent;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
+ var _lib = require("../lib");
12
+ var _Button = require("./Button");
13
+ var _icons = require("./chat/icons");
14
+ var _excluded = ["classNames", "suggestions", "isLoading", "refine", "skeletonCount", "itemComponent", "headerComponent", "emptyComponent"];
15
+ function createFilterSuggestionsComponent(_ref) {
16
+ var createElement = _ref.createElement;
17
+ var Button = (0, _Button.createButtonComponent)({
18
+ createElement: createElement
19
+ });
20
+ function DefaultHeader(_ref2) {
21
+ var classNames = _ref2.classNames;
22
+ return createElement("div", {
23
+ className: (0, _lib.cx)('ais-FilterSuggestions-header', classNames.header)
24
+ }, createElement("span", {
25
+ className: (0, _lib.cx)('ais-FilterSuggestions-headerIcon', classNames.headerIcon)
26
+ }, createElement(_icons.SparklesIcon, {
27
+ createElement: createElement
28
+ })), createElement("span", {
29
+ className: (0, _lib.cx)('ais-FilterSuggestions-headerTitle', classNames.headerTitle)
30
+ }, "Filter suggestions"));
31
+ }
32
+ function DefaultItem(_ref3) {
33
+ var suggestion = _ref3.suggestion,
34
+ classNames = _ref3.classNames,
35
+ refine = _ref3.refine;
36
+ return createElement(Button, {
37
+ variant: "outline",
38
+ size: "sm",
39
+ className: (0, _lib.cx)(classNames.button),
40
+ onClick: refine
41
+ }, createElement("span", {
42
+ className: (0, _lib.cx)('ais-FilterSuggestions-label', classNames.label)
43
+ }, suggestion.label, ": ", suggestion.value), createElement("span", {
44
+ className: (0, _lib.cx)('ais-FilterSuggestions-count', classNames.count)
45
+ }, suggestion.count));
46
+ }
47
+ return function FilterSuggestions(userProps) {
48
+ var _userProps$classNames = userProps.classNames,
49
+ classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames,
50
+ suggestions = userProps.suggestions,
51
+ isLoading = userProps.isLoading,
52
+ _refine = userProps.refine,
53
+ _userProps$skeletonCo = userProps.skeletonCount,
54
+ skeletonCount = _userProps$skeletonCo === void 0 ? 3 : _userProps$skeletonCo,
55
+ _userProps$itemCompon = userProps.itemComponent,
56
+ ItemComponent = _userProps$itemCompon === void 0 ? DefaultItem : _userProps$itemCompon,
57
+ headerComponent = userProps.headerComponent,
58
+ EmptyComponent = userProps.emptyComponent,
59
+ props = (0, _objectWithoutProperties2.default)(userProps, _excluded);
60
+ var HeaderComponent = headerComponent === false ? null : headerComponent !== null && headerComponent !== void 0 ? headerComponent : DefaultHeader;
61
+ var isEmpty = suggestions.length === 0;
62
+ if (isEmpty && !isLoading) {
63
+ return createElement("div", (0, _extends2.default)({}, props, {
64
+ className: (0, _lib.cx)('ais-FilterSuggestions', classNames.root, 'ais-FilterSuggestions--empty', classNames.emptyRoot, props.className)
65
+ }), EmptyComponent && createElement(EmptyComponent, {
66
+ classNames: {
67
+ emptyRoot: classNames.emptyRoot
68
+ }
69
+ }));
70
+ }
71
+ var headerClassNames = {
72
+ header: classNames.header,
73
+ headerIcon: classNames.headerIcon,
74
+ headerTitle: classNames.headerTitle
75
+ };
76
+ var itemClassNames = {
77
+ item: classNames.item,
78
+ button: classNames.button,
79
+ label: classNames.label,
80
+ count: classNames.count
81
+ };
82
+ return createElement("div", (0, _extends2.default)({}, props, {
83
+ className: (0, _lib.cx)('ais-FilterSuggestions', classNames.root, isLoading && (0, _lib.cx)('ais-FilterSuggestions--loading', classNames.loadingRoot), props.className)
84
+ }), HeaderComponent && createElement(HeaderComponent, {
85
+ classNames: headerClassNames
86
+ }), isLoading ? createElement("div", {
87
+ className: (0, _lib.cx)('ais-FilterSuggestions-skeleton', classNames.skeleton)
88
+ }, (0, _toConsumableArray2.default)(new Array(skeletonCount)).map(function (_, i) {
89
+ return createElement("div", {
90
+ key: i,
91
+ className: (0, _lib.cx)('ais-FilterSuggestions-skeletonItem', classNames.skeletonItem)
92
+ });
93
+ })) : createElement("ul", {
94
+ className: (0, _lib.cx)('ais-FilterSuggestions-list', classNames.list)
95
+ }, suggestions.map(function (suggestion) {
96
+ return createElement("li", {
97
+ key: "".concat(suggestion.attribute, "-").concat(suggestion.value),
98
+ className: (0, _lib.cx)('ais-FilterSuggestions-item', classNames.item)
99
+ }, createElement(ItemComponent, {
100
+ suggestion: suggestion,
101
+ classNames: itemClassNames,
102
+ refine: function refine() {
103
+ return _refine(suggestion.attribute, suggestion.value);
104
+ }
105
+ }));
106
+ })));
107
+ };
108
+ }
@@ -18,6 +18,9 @@ function createAutocompleteIndexComponent(_ref) {
18
18
  getItemProps = userProps.getItemProps,
19
19
  _userProps$classNames = userProps.classNames,
20
20
  classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames;
21
+ if (items.length === 0) {
22
+ return null;
23
+ }
21
24
  return createElement("div", {
22
25
  className: (0, _cx.cx)('ais-AutocompleteIndex', classNames.root)
23
26
  }, HeaderComponent && createElement("div", {
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.createAutocompletePropGetters = createAutocompletePropGetters;
8
8
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _lib = require("../../lib");
10
11
  function createAutocompletePropGetters(_ref) {
11
12
  var useEffect = _ref.useEffect,
12
13
  useId = _ref.useId,
@@ -218,18 +219,23 @@ function buildItems(_ref5) {
218
219
  getElementId = _ref5.getElementId;
219
220
  var itemsIds = [];
220
221
  var items = new Map();
221
- for (var i = 0; i < indicesConfig.length; i++) {
222
+ var _loop = function _loop(i) {
222
223
  var _indices$i;
223
- var config = indicesConfig[i];
224
+ var currentIndexConfig = (0, _lib.find)(indicesConfig, function (config) {
225
+ return config.indexName === indices[i].indexName;
226
+ });
224
227
  var hits = ((_indices$i = indices[i]) === null || _indices$i === void 0 ? void 0 : _indices$i.hits) || [];
225
228
  for (var position = 0; position < hits.length; position++) {
226
- var itemId = getElementId('item', config.indexName, position);
229
+ var itemId = getElementId('item', (currentIndexConfig === null || currentIndexConfig === void 0 ? void 0 : currentIndexConfig.indexName) || indices[i].indexName, position);
227
230
  items.set(itemId, {
228
231
  item: hits[position],
229
- config: config
232
+ config: currentIndexConfig
230
233
  });
231
234
  itemsIds.push(itemId);
232
235
  }
236
+ };
237
+ for (var i = 0; i < indices.length; i++) {
238
+ _loop(i);
233
239
  }
234
240
  return {
235
241
  items: items,
@@ -6,9 +6,13 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.createAutocompleteStorage = createAutocompleteStorage;
8
8
  exports.createStorage = createStorage;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
12
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13
+ var _lib = require("../../lib");
14
+ 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; }
15
+ 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) { (0, _defineProperty2.default)(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; }
12
16
  function createAutocompleteStorage(_ref) {
13
17
  var useEffect = _ref.useEffect,
14
18
  useMemo = _ref.useMemo,
@@ -17,7 +21,8 @@ function createAutocompleteStorage(_ref) {
17
21
  var showRecent = _ref2.showRecent,
18
22
  query = _ref2.query,
19
23
  indices = _ref2.indices,
20
- indicesConfig = _ref2.indicesConfig;
24
+ indicesConfig = _ref2.indicesConfig,
25
+ suggestionsIndexName = _ref2.suggestionsIndexName;
21
26
  var storageKey = showRecent && (0, _typeof2.default)(showRecent) === 'object' ? showRecent.storageKey : undefined;
22
27
  var storage = useMemo(function () {
23
28
  return createStorage({
@@ -61,7 +66,15 @@ function createAutocompleteStorage(_ref) {
61
66
  })
62
67
  };
63
68
  });
64
- var indicesForPropGetters = (0, _toConsumableArray2.default)(indices);
69
+ var indicesForPropGetters = (0, _toConsumableArray2.default)(indices.map(function (index) {
70
+ return index.indexName === suggestionsIndexName ? _objectSpread(_objectSpread({}, index), {}, {
71
+ hits: index.hits.filter(function (hit) {
72
+ return !(0, _lib.find)(storageHits, function (storageHit) {
73
+ return storageHit.query === hit.query;
74
+ });
75
+ })
76
+ }) : index;
77
+ }));
65
78
  var indicesConfigForPropGetters = (0, _toConsumableArray2.default)(indicesConfig);
66
79
  indicesForPropGetters.unshift({
67
80
  indexName: 'recent-searches',
@@ -12,8 +12,9 @@ var _lib = require("../../lib");
12
12
  var _ChatHeader = require("./ChatHeader");
13
13
  var _ChatMessages = require("./ChatMessages");
14
14
  var _ChatPrompt = require("./ChatPrompt");
15
+ var _ChatPromptSuggestions = require("./ChatPromptSuggestions");
15
16
  var _ChatToggleButton = require("./ChatToggleButton");
16
- var _excluded = ["open", "maximized", "headerProps", "toggleButtonProps", "messagesProps", "promptProps", "headerComponent", "promptComponent", "toggleButtonComponent", "classNames", "className"];
17
+ var _excluded = ["open", "maximized", "headerProps", "toggleButtonProps", "messagesProps", "suggestionsProps", "promptProps", "headerComponent", "promptComponent", "toggleButtonComponent", "suggestionsComponent", "classNames", "className"];
17
18
  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; }
18
19
  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) { (0, _defineProperty2.default)(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; }
19
20
  function createChatComponent(_ref) {
@@ -35,6 +36,10 @@ function createChatComponent(_ref) {
35
36
  createElement: createElement,
36
37
  Fragment: Fragment
37
38
  });
39
+ var ChatPromptSuggestions = (0, _ChatPromptSuggestions.createChatPromptSuggestionsComponent)({
40
+ createElement: createElement,
41
+ Fragment: Fragment
42
+ });
38
43
  return function Chat(userProps) {
39
44
  var open = userProps.open,
40
45
  _userProps$maximized = userProps.maximized,
@@ -42,11 +47,13 @@ function createChatComponent(_ref) {
42
47
  headerProps = userProps.headerProps,
43
48
  toggleButtonProps = userProps.toggleButtonProps,
44
49
  messagesProps = userProps.messagesProps,
50
+ suggestionsProps = userProps.suggestionsProps,
45
51
  _userProps$promptProp = userProps.promptProps,
46
52
  promptProps = _userProps$promptProp === void 0 ? {} : _userProps$promptProp,
47
53
  HeaderComponent = userProps.headerComponent,
48
54
  PromptComponent = userProps.promptComponent,
49
55
  ToggleButtonComponent = userProps.toggleButtonComponent,
56
+ SuggestionsComponent = userProps.suggestionsComponent,
50
57
  _userProps$classNames = userProps.classNames,
51
58
  classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames,
52
59
  className = userProps.className,
@@ -60,7 +67,10 @@ function createChatComponent(_ref) {
60
67
  maximized: maximized
61
68
  })), createElement(ChatMessages, (0, _extends2.default)({}, messagesProps, {
62
69
  classNames: classNames.messages,
63
- messageClassNames: classNames.message
70
+ messageClassNames: classNames.message,
71
+ suggestionsElement: createElement(SuggestionsComponent || ChatPromptSuggestions, _objectSpread(_objectSpread({}, suggestionsProps), {}, {
72
+ classNames: classNames.suggestions
73
+ }))
64
74
  })), createElement(PromptComponent || ChatPrompt, _objectSpread(_objectSpread({}, promptProps), {}, {
65
75
  classNames: classNames.prompt
66
76
  }))), createElement("div", {
@@ -12,7 +12,7 @@ var _markdownToJsx = require("markdown-to-jsx");
12
12
  var _lib = require("../../lib");
13
13
  var _Button = require("../Button");
14
14
  var _icons = require("./icons");
15
- var _excluded = ["classNames", "message", "side", "variant", "actions", "autoHideActions", "leadingComponent", "actionsComponent", "footerComponent", "tools", "indexUiState", "setIndexUiState", "onClose", "translations"];
15
+ var _excluded = ["classNames", "message", "side", "variant", "actions", "autoHideActions", "leadingComponent", "actionsComponent", "footerComponent", "tools", "indexUiState", "setIndexUiState", "onClose", "translations", "suggestionsElement"];
16
16
  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; }
17
17
  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) { (0, _defineProperty2.default)(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; }
18
18
  function createChatMessageComponent(_ref) {
@@ -41,6 +41,7 @@ function createChatMessageComponent(_ref) {
41
41
  setIndexUiState = userProps.setIndexUiState,
42
42
  onClose = userProps.onClose,
43
43
  userTranslations = userProps.translations,
44
+ suggestionsElement = userProps.suggestionsElement,
44
45
  props = (0, _objectWithoutProperties2.default)(userProps, _excluded);
45
46
  var translations = _objectSpread({
46
47
  messageLabel: 'Message',
@@ -112,7 +113,7 @@ function createChatMessageComponent(_ref) {
112
113
  className: (0, _lib.cx)(cssClasses.content)
113
114
  }, createElement("div", {
114
115
  className: (0, _lib.cx)(cssClasses.message)
115
- }, message.parts.map(renderMessagePart)), hasActions && createElement("div", {
116
+ }, message.parts.map(renderMessagePart)), suggestionsElement, hasActions && createElement("div", {
116
117
  className: (0, _lib.cx)(cssClasses.actions),
117
118
  "aria-label": translations.actionsLabel
118
119
  }, ActionsComponent ? createElement(ActionsComponent, {
@@ -15,7 +15,7 @@ var _ChatMessage = require("./ChatMessage");
15
15
  var _ChatMessageError = require("./ChatMessageError");
16
16
  var _ChatMessageLoader = require("./ChatMessageLoader");
17
17
  var _icons = require("./icons");
18
- var _excluded = ["classNames", "messageClassNames", "messageTranslations", "messages", "messageComponent", "loaderComponent", "errorComponent", "actionsComponent", "tools", "indexUiState", "setIndexUiState", "status", "hideScrollToBottom", "onReload", "onClose", "translations", "userMessageProps", "assistantMessageProps", "isClearing", "onClearTransitionEnd", "isScrollAtBottom", "scrollRef", "contentRef", "onScrollToBottom"];
18
+ var _excluded = ["classNames", "messageClassNames", "messageTranslations", "messages", "messageComponent", "loaderComponent", "errorComponent", "actionsComponent", "tools", "indexUiState", "setIndexUiState", "status", "hideScrollToBottom", "onReload", "onClose", "translations", "userMessageProps", "assistantMessageProps", "isClearing", "onClearTransitionEnd", "isScrollAtBottom", "scrollRef", "contentRef", "onScrollToBottom", "suggestionsElement"];
19
19
  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; }
20
20
  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) { (0, _defineProperty2.default)(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; }
21
21
  var getTextContent = function getTextContent(message) {
@@ -48,7 +48,8 @@ function createDefaultMessageComponent(_ref) {
48
48
  actionsComponent = _ref2.actionsComponent,
49
49
  classNames = _ref2.classNames,
50
50
  messageTranslations = _ref2.messageTranslations,
51
- translations = _ref2.translations;
51
+ translations = _ref2.translations,
52
+ suggestionsElement = _ref2.suggestionsElement;
52
53
  var defaultAssistantActions = [].concat((0, _toConsumableArray2.default)(hasTextContent(message) ? [{
53
54
  title: translations.copyToClipboardLabel,
54
55
  icon: function icon() {
@@ -82,7 +83,8 @@ function createDefaultMessageComponent(_ref) {
82
83
  actionsComponent: actionsComponent,
83
84
  "data-role": message.role,
84
85
  classNames: classNames,
85
- translations: messageTranslations
86
+ translations: messageTranslations,
87
+ suggestionsElement: suggestionsElement
86
88
  }, messageProps));
87
89
  };
88
90
  }
@@ -133,6 +135,7 @@ function createChatMessagesComponent(_ref3) {
133
135
  scrollRef = userProps.scrollRef,
134
136
  contentRef = userProps.contentRef,
135
137
  onScrollToBottom = userProps.onScrollToBottom,
138
+ suggestionsElement = userProps.suggestionsElement,
136
139
  props = (0, _objectWithoutProperties2.default)(userProps, _excluded);
137
140
  var translations = _objectSpread({
138
141
  scrollToBottomLabel: 'Scroll to bottom',
@@ -164,7 +167,7 @@ function createChatMessagesComponent(_ref3) {
164
167
  onClearTransitionEnd === null || onClearTransitionEnd === void 0 ? void 0 : onClearTransitionEnd();
165
168
  }
166
169
  }
167
- }, messages.map(function (message) {
170
+ }, messages.map(function (message, index) {
168
171
  return createElement(DefaultMessage, {
169
172
  key: message.id,
170
173
  message: message,
@@ -178,7 +181,8 @@ function createChatMessagesComponent(_ref3) {
178
181
  onClose: onClose,
179
182
  translations: translations,
180
183
  classNames: messageClassNames,
181
- messageTranslations: messageTranslations
184
+ messageTranslations: messageTranslations,
185
+ suggestionsElement: status === 'ready' && message.role === 'assistant' && index === messages.length - 1 ? suggestionsElement : undefined
182
186
  });
183
187
  }), status === 'submitted' && createElement(DefaultLoader, {
184
188
  translations: {
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createChatPromptSuggestionsComponent = createChatPromptSuggestionsComponent;
7
+ var _lib = require("../../lib");
8
+ var _Button = require("../Button");
9
+ function createChatPromptSuggestionsComponent(_ref) {
10
+ var createElement = _ref.createElement;
11
+ var Button = (0, _Button.createButtonComponent)({
12
+ createElement: createElement
13
+ });
14
+ return function ChatPromptSuggestions(userProps) {
15
+ var _userProps$suggestion = userProps.suggestions,
16
+ suggestions = _userProps$suggestion === void 0 ? [] : _userProps$suggestion,
17
+ onSuggestionClick = userProps.onSuggestionClick,
18
+ _userProps$classNames = userProps.classNames,
19
+ classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames;
20
+ if (suggestions.length === 0) {
21
+ return null;
22
+ }
23
+ return createElement("div", {
24
+ className: (0, _lib.cx)('ais-ChatPromptSuggestions', classNames.root)
25
+ }, suggestions.map(function (suggestion, index) {
26
+ return createElement(Button, {
27
+ key: index,
28
+ size: "sm",
29
+ variant: "primary",
30
+ className: (0, _lib.cx)('ais-ChatPromptSuggestions-suggestion', classNames.suggestion),
31
+ onClick: function onClick() {
32
+ return onSuggestionClick(suggestion);
33
+ }
34
+ }, suggestion);
35
+ }));
36
+ };
37
+ }
@@ -113,6 +113,17 @@ Object.keys(_ChatPrompt).forEach(function (key) {
113
113
  }
114
114
  });
115
115
  });
116
+ var _ChatPromptSuggestions = require("./chat/ChatPromptSuggestions");
117
+ Object.keys(_ChatPromptSuggestions).forEach(function (key) {
118
+ if (key === "default" || key === "__esModule") return;
119
+ if (key in exports && exports[key] === _ChatPromptSuggestions[key]) return;
120
+ Object.defineProperty(exports, key, {
121
+ enumerable: true,
122
+ get: function get() {
123
+ return _ChatPromptSuggestions[key];
124
+ }
125
+ });
126
+ });
116
127
  var _ChatToggleButton = require("./chat/ChatToggleButton");
117
128
  Object.keys(_ChatToggleButton).forEach(function (key) {
118
129
  if (key === "default" || key === "__esModule") return;
@@ -211,4 +222,15 @@ Object.keys(_TrendingItems).forEach(function (key) {
211
222
  return _TrendingItems[key];
212
223
  }
213
224
  });
225
+ });
226
+ var _FilterSuggestions = require("./FilterSuggestions");
227
+ Object.keys(_FilterSuggestions).forEach(function (key) {
228
+ if (key === "default" || key === "__esModule") return;
229
+ if (key in exports && exports[key] === _FilterSuggestions[key]) return;
230
+ Object.defineProperty(exports, key, {
231
+ enumerable: true,
232
+ get: function get() {
233
+ return _FilterSuggestions[key];
234
+ }
235
+ });
214
236
  });
@@ -4,4 +4,4 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = exports.default = '0.16.0';
7
+ var _default = exports.default = '0.17.1';
@@ -0,0 +1,108 @@
1
+ import type { ComponentProps, Renderer } from '../types';
2
+ export type Suggestion = {
3
+ /**
4
+ * The facet attribute name.
5
+ */
6
+ attribute: string;
7
+ /**
8
+ * The facet value to filter by.
9
+ */
10
+ value: string;
11
+ /**
12
+ * Human-readable display label.
13
+ */
14
+ label: string;
15
+ /**
16
+ * Number of records matching this filter.
17
+ */
18
+ count: number;
19
+ };
20
+ export type FilterSuggestionsItemComponentProps = {
21
+ suggestion: Suggestion;
22
+ classNames: Partial<Pick<FilterSuggestionsClassNames, 'item' | 'button' | 'label' | 'count'>>;
23
+ refine: () => void;
24
+ };
25
+ export type FilterSuggestionsHeaderComponentProps = {
26
+ classNames: Partial<Pick<FilterSuggestionsClassNames, 'header' | 'headerIcon' | 'headerTitle'>>;
27
+ };
28
+ export type FilterSuggestionsEmptyComponentProps = {
29
+ classNames: Partial<Pick<FilterSuggestionsClassNames, 'emptyRoot'>>;
30
+ };
31
+ export type FilterSuggestionsProps = ComponentProps<'div'> & {
32
+ suggestions: Suggestion[];
33
+ isLoading: boolean;
34
+ refine: (attribute: string, value: string) => void;
35
+ classNames?: Partial<FilterSuggestionsClassNames>;
36
+ /**
37
+ * Number of skeleton items to show when loading.
38
+ * @default 3
39
+ */
40
+ skeletonCount?: number;
41
+ /**
42
+ * Component to render each suggestion item.
43
+ */
44
+ itemComponent?: (props: FilterSuggestionsItemComponentProps) => JSX.Element;
45
+ /**
46
+ * Component to render the header. Set to `false` to disable the header.
47
+ */
48
+ headerComponent?: ((props: FilterSuggestionsHeaderComponentProps) => JSX.Element) | false;
49
+ /**
50
+ * Component to render when there are no suggestions.
51
+ */
52
+ emptyComponent?: (props: FilterSuggestionsEmptyComponentProps) => JSX.Element | null;
53
+ };
54
+ export type FilterSuggestionsClassNames = {
55
+ /**
56
+ * Class names to apply to the root element
57
+ */
58
+ root: string | string[];
59
+ /**
60
+ * Class names to apply to the root element when loading
61
+ */
62
+ loadingRoot: string | string[];
63
+ /**
64
+ * Class names to apply to the root element when empty
65
+ */
66
+ emptyRoot: string | string[];
67
+ /**
68
+ * Class names to apply to the header element
69
+ */
70
+ header: string | string[];
71
+ /**
72
+ * Class names to apply to the header icon element
73
+ */
74
+ headerIcon: string | string[];
75
+ /**
76
+ * Class names to apply to the header title element
77
+ */
78
+ headerTitle: string | string[];
79
+ /**
80
+ * Class names to apply to the skeleton container element
81
+ */
82
+ skeleton: string | string[];
83
+ /**
84
+ * Class names to apply to each skeleton item element
85
+ */
86
+ skeletonItem: string | string[];
87
+ /**
88
+ * Class names to apply to the list element
89
+ */
90
+ list: string | string[];
91
+ /**
92
+ * Class names to apply to each item element
93
+ */
94
+ item: string | string[];
95
+ /**
96
+ * Class names to apply to the button element
97
+ */
98
+ button: string | string[];
99
+ /**
100
+ * Class names to apply to the label element
101
+ */
102
+ label: string | string[];
103
+ /**
104
+ * Class names to apply to the count element
105
+ */
106
+ count: string | string[];
107
+ };
108
+ export declare function createFilterSuggestionsComponent({ createElement }: Renderer): (userProps: FilterSuggestionsProps) => JSX.Element | null;
@@ -0,0 +1,101 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
+ var _excluded = ["classNames", "suggestions", "isLoading", "refine", "skeletonCount", "itemComponent", "headerComponent", "emptyComponent"];
5
+ import { cx } from "../lib/index.js";
6
+ import { createButtonComponent } from "./Button.js";
7
+ import { SparklesIcon } from "./chat/icons.js";
8
+ export function createFilterSuggestionsComponent(_ref) {
9
+ var createElement = _ref.createElement;
10
+ var Button = createButtonComponent({
11
+ createElement: createElement
12
+ });
13
+ function DefaultHeader(_ref2) {
14
+ var classNames = _ref2.classNames;
15
+ return createElement("div", {
16
+ className: cx('ais-FilterSuggestions-header', classNames.header)
17
+ }, createElement("span", {
18
+ className: cx('ais-FilterSuggestions-headerIcon', classNames.headerIcon)
19
+ }, createElement(SparklesIcon, {
20
+ createElement: createElement
21
+ })), createElement("span", {
22
+ className: cx('ais-FilterSuggestions-headerTitle', classNames.headerTitle)
23
+ }, "Filter suggestions"));
24
+ }
25
+ function DefaultItem(_ref3) {
26
+ var suggestion = _ref3.suggestion,
27
+ classNames = _ref3.classNames,
28
+ refine = _ref3.refine;
29
+ return createElement(Button, {
30
+ variant: "outline",
31
+ size: "sm",
32
+ className: cx(classNames.button),
33
+ onClick: refine
34
+ }, createElement("span", {
35
+ className: cx('ais-FilterSuggestions-label', classNames.label)
36
+ }, suggestion.label, ": ", suggestion.value), createElement("span", {
37
+ className: cx('ais-FilterSuggestions-count', classNames.count)
38
+ }, suggestion.count));
39
+ }
40
+ return function FilterSuggestions(userProps) {
41
+ var _userProps$classNames = userProps.classNames,
42
+ classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames,
43
+ suggestions = userProps.suggestions,
44
+ isLoading = userProps.isLoading,
45
+ _refine = userProps.refine,
46
+ _userProps$skeletonCo = userProps.skeletonCount,
47
+ skeletonCount = _userProps$skeletonCo === void 0 ? 3 : _userProps$skeletonCo,
48
+ _userProps$itemCompon = userProps.itemComponent,
49
+ ItemComponent = _userProps$itemCompon === void 0 ? DefaultItem : _userProps$itemCompon,
50
+ headerComponent = userProps.headerComponent,
51
+ EmptyComponent = userProps.emptyComponent,
52
+ props = _objectWithoutProperties(userProps, _excluded);
53
+ var HeaderComponent = headerComponent === false ? null : headerComponent !== null && headerComponent !== void 0 ? headerComponent : DefaultHeader;
54
+ var isEmpty = suggestions.length === 0;
55
+ if (isEmpty && !isLoading) {
56
+ return createElement("div", _extends({}, props, {
57
+ className: cx('ais-FilterSuggestions', classNames.root, 'ais-FilterSuggestions--empty', classNames.emptyRoot, props.className)
58
+ }), EmptyComponent && createElement(EmptyComponent, {
59
+ classNames: {
60
+ emptyRoot: classNames.emptyRoot
61
+ }
62
+ }));
63
+ }
64
+ var headerClassNames = {
65
+ header: classNames.header,
66
+ headerIcon: classNames.headerIcon,
67
+ headerTitle: classNames.headerTitle
68
+ };
69
+ var itemClassNames = {
70
+ item: classNames.item,
71
+ button: classNames.button,
72
+ label: classNames.label,
73
+ count: classNames.count
74
+ };
75
+ return createElement("div", _extends({}, props, {
76
+ className: cx('ais-FilterSuggestions', classNames.root, isLoading && cx('ais-FilterSuggestions--loading', classNames.loadingRoot), props.className)
77
+ }), HeaderComponent && createElement(HeaderComponent, {
78
+ classNames: headerClassNames
79
+ }), isLoading ? createElement("div", {
80
+ className: cx('ais-FilterSuggestions-skeleton', classNames.skeleton)
81
+ }, _toConsumableArray(new Array(skeletonCount)).map(function (_, i) {
82
+ return createElement("div", {
83
+ key: i,
84
+ className: cx('ais-FilterSuggestions-skeletonItem', classNames.skeletonItem)
85
+ });
86
+ })) : createElement("ul", {
87
+ className: cx('ais-FilterSuggestions-list', classNames.list)
88
+ }, suggestions.map(function (suggestion) {
89
+ return createElement("li", {
90
+ key: "".concat(suggestion.attribute, "-").concat(suggestion.value),
91
+ className: cx('ais-FilterSuggestions-item', classNames.item)
92
+ }, createElement(ItemComponent, {
93
+ suggestion: suggestion,
94
+ classNames: itemClassNames,
95
+ refine: function refine() {
96
+ return _refine(suggestion.attribute, suggestion.value);
97
+ }
98
+ }));
99
+ })));
100
+ };
101
+ }
@@ -37,4 +37,4 @@ export type AutocompleteIndexClassNames = {
37
37
  */
38
38
  item: string | string[];
39
39
  };
40
- export declare function createAutocompleteIndexComponent({ createElement }: Renderer): (userProps: AutocompleteIndexProps) => JSX.Element;
40
+ export declare function createAutocompleteIndexComponent({ createElement }: Renderer): (userProps: AutocompleteIndexProps) => JSX.Element | null;
@@ -11,6 +11,9 @@ export function createAutocompleteIndexComponent(_ref) {
11
11
  getItemProps = userProps.getItemProps,
12
12
  _userProps$classNames = userProps.classNames,
13
13
  classNames = _userProps$classNames === void 0 ? {} : _userProps$classNames;
14
+ if (items.length === 0) {
15
+ return null;
16
+ }
14
17
  return createElement("div", {
15
18
  className: cx('ais-AutocompleteIndex', classNames.root)
16
19
  }, HeaderComponent && createElement("div", {