react-instantsearch 7.23.1 → 7.24.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.
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.AutocompleteSearch = AutocompleteSearch;
7
7
  var _instantsearchUiComponents = require("instantsearch-ui-components");
8
8
  var _react = _interopRequireWildcard(require("react"));
9
- var _reactInstantsearchCore = require("react-instantsearch-core");
10
9
  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); }
11
10
  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); }
12
11
  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,15 +19,17 @@ var AutocompleteSearchComponent = (0, _instantsearchUiComponents.createAutocompl
20
19
  });
21
20
  function AutocompleteSearch(_ref) {
22
21
  var inputProps = _ref.inputProps,
23
- clearQuery = _ref.clearQuery;
24
- var _useSearchBox = (0, _reactInstantsearchCore.useSearchBox)(),
25
- query = _useSearchBox.query,
26
- refine = _useSearchBox.refine,
27
- isSearchStalled = _useSearchBox.isSearchStalled;
22
+ clearQuery = _ref.clearQuery,
23
+ onQueryChange = _ref.onQueryChange,
24
+ query = _ref.query,
25
+ refine = _ref.refine,
26
+ isSearchStalled = _ref.isSearchStalled;
28
27
  return /*#__PURE__*/_react.default.createElement(AutocompleteSearchComponent, {
29
28
  inputProps: _objectSpread(_objectSpread({}, inputProps), {}, {
30
29
  onChange: function onChange(event) {
31
- return refine(event.currentTarget.value);
30
+ var value = event.currentTarget.value;
31
+ refine(value);
32
+ onQueryChange === null || onQueryChange === void 0 ? void 0 : onQueryChange(value);
32
33
  }
33
34
  }),
34
35
  onClear: clearQuery,
@@ -9,17 +9,15 @@ var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactInstantsearchCore = require("react-instantsearch-core");
10
10
  var _AutocompleteSearch = require("../components/AutocompleteSearch");
11
11
  var _ReverseHighlight = require("./ReverseHighlight");
12
- var _excluded = ["indices", "showSuggestions", "showRecent", "searchParameters"],
13
- _excluded2 = ["indicesConfig", "refineSearchBox", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage", "panelComponent", "showRecent", "recentSearchConfig", "showSuggestions", "transformItems", "placeholder"];
12
+ var _excluded = ["indices", "showSuggestions", "showRecent", "searchParameters", "detachedMediaQuery", "translations"],
13
+ _excluded2 = ["indicesConfig", "refineSearchBox", "isSearchStalled", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage", "panelComponent", "showRecent", "recentSearchConfig", "showSuggestions", "transformItems", "placeholder", "detachedMediaQuery", "translations", "classNames"];
14
14
  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); }
15
15
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
16
16
  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); }
17
17
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
18
18
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
19
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
20
19
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
21
20
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
22
- 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; }
23
21
  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; }
24
22
  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; }
25
23
  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; }
@@ -27,6 +25,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
27
25
  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); }
28
26
  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; }
29
27
  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; }
28
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
29
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
30
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
31
+ 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; }
32
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
33
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
30
34
  var Autocomplete = (0, _instantsearchUiComponents.createAutocompleteComponent)({
31
35
  createElement: _react.createElement,
32
36
  Fragment: _react.Fragment
@@ -47,6 +51,22 @@ var AutocompleteRecentSearch = (0, _instantsearchUiComponents.createAutocomplete
47
51
  createElement: _react.createElement,
48
52
  Fragment: _react.Fragment
49
53
  });
54
+ var AutocompleteDetachedContainer = (0, _instantsearchUiComponents.createAutocompleteDetachedContainerComponent)({
55
+ createElement: _react.createElement,
56
+ Fragment: _react.Fragment
57
+ });
58
+ var AutocompleteDetachedOverlay = (0, _instantsearchUiComponents.createAutocompleteDetachedOverlayComponent)({
59
+ createElement: _react.createElement,
60
+ Fragment: _react.Fragment
61
+ });
62
+ var AutocompleteDetachedFormContainer = (0, _instantsearchUiComponents.createAutocompleteDetachedFormContainerComponent)({
63
+ createElement: _react.createElement,
64
+ Fragment: _react.Fragment
65
+ });
66
+ var AutocompleteDetachedSearchButton = (0, _instantsearchUiComponents.createAutocompleteDetachedSearchButtonComponent)({
67
+ createElement: _react.createElement,
68
+ Fragment: _react.Fragment
69
+ });
50
70
  var usePropGetters = (0, _instantsearchUiComponents.createAutocompletePropGetters)({
51
71
  useEffect: _react.useEffect,
52
72
  useId: _react.useId,
@@ -59,6 +79,127 @@ var useStorage = (0, _instantsearchUiComponents.createAutocompleteStorage)({
59
79
  useMemo: _react.useMemo,
60
80
  useState: _react.useState
61
81
  });
82
+ var DEFAULT_DETACHED_MEDIA_QUERY = '(max-width: 680px)';
83
+ var DEFAULT_DETACHED_MODAL_MEDIA_QUERY = '(min-width: 680px)';
84
+ var DETACHED_MEDIA_QUERY_CSS_VAR = '--ais-autocomplete-detached-media-query';
85
+ var DETACHED_MODAL_MEDIA_QUERY_CSS_VAR = '--ais-autocomplete-detached-modal-media-query';
86
+ var DEFAULT_TRANSLATIONS = {
87
+ detachedCancelButtonText: 'Cancel',
88
+ detachedSearchButtonTitle: 'Search',
89
+ detachedClearButtonTitle: 'Clear'
90
+ };
91
+ function getCssMediaQueryValue(name) {
92
+ if (typeof window === 'undefined' || typeof document === 'undefined') {
93
+ return '';
94
+ }
95
+ return getComputedStyle(document.documentElement).getPropertyValue(name).trim();
96
+ }
97
+ function resolveMediaQuery(value, cssVarName, fallback) {
98
+ if (value === '') {
99
+ return '';
100
+ }
101
+ if (value) {
102
+ return value;
103
+ }
104
+ return getCssMediaQueryValue(cssVarName) || fallback;
105
+ }
106
+ function getMediaQueryList(mediaQuery) {
107
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
108
+ return null;
109
+ }
110
+ return window.matchMedia(mediaQuery);
111
+ }
112
+
113
+ /**
114
+ * Hook to manage detached (mobile) mode state
115
+ */
116
+ function useDetachedMode(mediaQuery) {
117
+ var resolvedMediaQuery = (0, _react.useMemo)(function () {
118
+ return resolveMediaQuery(mediaQuery, DETACHED_MEDIA_QUERY_CSS_VAR, DEFAULT_DETACHED_MEDIA_QUERY);
119
+ }, [mediaQuery]);
120
+ var _useState = (0, _react.useState)(function () {
121
+ var _getMediaQueryList;
122
+ return resolvedMediaQuery ? Boolean((_getMediaQueryList = getMediaQueryList(resolvedMediaQuery)) === null || _getMediaQueryList === void 0 ? void 0 : _getMediaQueryList.matches) : false;
123
+ }),
124
+ _useState2 = _slicedToArray(_useState, 2),
125
+ isDetached = _useState2[0],
126
+ setIsDetached = _useState2[1];
127
+ var _useState3 = (0, _react.useState)(false),
128
+ _useState4 = _slicedToArray(_useState3, 2),
129
+ isModalOpen = _useState4[0],
130
+ setIsModalOpen = _useState4[1];
131
+ var _useState5 = (0, _react.useState)(false),
132
+ _useState6 = _slicedToArray(_useState5, 2),
133
+ isModalDetached = _useState6[0],
134
+ setIsModalDetached = _useState6[1];
135
+ (0, _react.useEffect)(function () {
136
+ if (!resolvedMediaQuery) {
137
+ setIsDetached(false);
138
+ return function () {};
139
+ }
140
+ var mql = getMediaQueryList(resolvedMediaQuery);
141
+ if (!mql) {
142
+ setIsDetached(false);
143
+ return function () {};
144
+ }
145
+ var handler = function handler(event) {
146
+ var wasDetached = isDetached;
147
+ setIsDetached(event.matches);
148
+ // Close modal if switching from detached to non-detached
149
+ if (wasDetached && !event.matches) {
150
+ setIsModalOpen(false);
151
+ }
152
+ };
153
+ mql.addEventListener('change', handler);
154
+ return function () {
155
+ return mql.removeEventListener('change', handler);
156
+ };
157
+ }, [resolvedMediaQuery, isDetached]);
158
+ (0, _react.useEffect)(function () {
159
+ if (!isDetached) {
160
+ setIsModalDetached(false);
161
+ return function () {};
162
+ }
163
+ var modalMediaQuery = resolveMediaQuery(undefined, DETACHED_MODAL_MEDIA_QUERY_CSS_VAR, DEFAULT_DETACHED_MODAL_MEDIA_QUERY);
164
+ if (!modalMediaQuery) {
165
+ setIsModalDetached(false);
166
+ return function () {};
167
+ }
168
+ var mql = getMediaQueryList(modalMediaQuery);
169
+ if (!mql) {
170
+ setIsModalDetached(false);
171
+ return function () {};
172
+ }
173
+ var handler = function handler(event) {
174
+ setIsModalDetached(event.matches);
175
+ };
176
+ setIsModalDetached(mql.matches);
177
+ mql.addEventListener('change', handler);
178
+ return function () {
179
+ return mql.removeEventListener('change', handler);
180
+ };
181
+ }, [isDetached]);
182
+ (0, _react.useEffect)(function () {
183
+ if (typeof document === 'undefined') return function () {};
184
+ if (isModalOpen) {
185
+ var scrollY = window.scrollY;
186
+ document.body.style.top = "-".concat(scrollY, "px");
187
+ document.body.classList.add('ais-Autocomplete--detached');
188
+ return function () {
189
+ document.body.classList.remove('ais-Autocomplete--detached');
190
+ document.body.style.top = '';
191
+ window.scrollTo(0, scrollY);
192
+ };
193
+ }
194
+ return function () {};
195
+ }, [isModalOpen]);
196
+ return {
197
+ isDetached: isDetached,
198
+ isModalDetached: isModalDetached,
199
+ isModalOpen: isModalOpen,
200
+ setIsModalOpen: setIsModalOpen
201
+ };
202
+ }
62
203
  function EXPERIMENTAL_Autocomplete(_ref) {
63
204
  var _showRecent$className, _showRecent$className2, _showRecent$className3, _showRecent$className4;
64
205
  var _ref$indices = _ref.indices,
@@ -66,15 +207,21 @@ function EXPERIMENTAL_Autocomplete(_ref) {
66
207
  showSuggestions = _ref.showSuggestions,
67
208
  showRecent = _ref.showRecent,
68
209
  userSearchParameters = _ref.searchParameters,
210
+ detachedMediaQuery = _ref.detachedMediaQuery,
211
+ _ref$translations = _ref.translations,
212
+ userTranslations = _ref$translations === void 0 ? {} : _ref$translations,
69
213
  props = _objectWithoutProperties(_ref, _excluded);
214
+ var translations = _objectSpread(_objectSpread({}, DEFAULT_TRANSLATIONS), userTranslations);
70
215
  var _useInstantSearch = (0, _reactInstantsearchCore.useInstantSearch)(),
71
216
  indexUiState = _useInstantSearch.indexUiState,
72
- indexRenderState = _useInstantSearch.indexRenderState;
217
+ indexRenderState = _useInstantSearch.indexRenderState,
218
+ status = _useInstantSearch.status;
73
219
  var _useSearchBox = (0, _reactInstantsearchCore.useSearchBox)({}, {
74
220
  $$type: 'ais.autocomplete',
75
221
  $$widgetType: 'ais.autocomplete'
76
222
  }),
77
223
  refine = _useSearchBox.refine;
224
+ var isSearchStalled = status === 'stalled';
78
225
  var searchParameters = _objectSpread({
79
226
  hitsPerPage: 5
80
227
  }, userSearchParameters);
@@ -131,16 +278,20 @@ function EXPERIMENTAL_Autocomplete(_ref) {
131
278
  }), /*#__PURE__*/_react.default.createElement(InnerAutocomplete, _extends({}, props, {
132
279
  indicesConfig: indicesConfig,
133
280
  refineSearchBox: refine,
281
+ isSearchStalled: isSearchStalled,
134
282
  indexUiState: indexUiState,
135
283
  isSearchPage: isSearchPage,
136
284
  showRecent: showRecent,
137
285
  recentSearchConfig: recentSearchConfig,
138
- showSuggestions: showSuggestions
286
+ showSuggestions: showSuggestions,
287
+ detachedMediaQuery: detachedMediaQuery,
288
+ translations: translations
139
289
  }))));
140
290
  }
141
291
  function InnerAutocomplete(_ref3) {
142
292
  var indicesConfig = _ref3.indicesConfig,
143
293
  refineSearchBox = _ref3.refineSearchBox,
294
+ isSearchStalled = _ref3.isSearchStalled,
144
295
  getSearchPageURL = _ref3.getSearchPageURL,
145
296
  userOnSelect = _ref3.onSelect,
146
297
  indexUiState = _ref3.indexUiState,
@@ -151,6 +302,10 @@ function InnerAutocomplete(_ref3) {
151
302
  showSuggestions = _ref3.showSuggestions,
152
303
  transformItems = _ref3.transformItems,
153
304
  placeholder = _ref3.placeholder,
305
+ _ref3$detachedMediaQu = _ref3.detachedMediaQuery,
306
+ detachedMediaQuery = _ref3$detachedMediaQu === void 0 ? DEFAULT_DETACHED_MEDIA_QUERY : _ref3$detachedMediaQu,
307
+ translations = _ref3.translations,
308
+ classNames = _ref3.classNames,
154
309
  props = _objectWithoutProperties(_ref3, _excluded2);
155
310
  var _useAutocomplete = (0, _reactInstantsearchCore.useAutocomplete)({
156
311
  transformItems: transformItems
@@ -158,6 +313,12 @@ function InnerAutocomplete(_ref3) {
158
313
  indices = _useAutocomplete.indices,
159
314
  refineAutocomplete = _useAutocomplete.refine,
160
315
  currentRefinement = _useAutocomplete.currentRefinement;
316
+ var _useDetachedMode = useDetachedMode(detachedMediaQuery),
317
+ isDetached = _useDetachedMode.isDetached,
318
+ isModalDetached = _useDetachedMode.isModalDetached,
319
+ isModalOpen = _useDetachedMode.isModalOpen,
320
+ setIsModalOpen = _useDetachedMode.setIsModalOpen;
321
+ var previousIsDetachedRef = (0, _react.useRef)(isDetached);
161
322
  var _useStorage = useStorage({
162
323
  showRecent: showRecent,
163
324
  query: currentRefinement,
@@ -196,12 +357,41 @@ function InnerAutocomplete(_ref3) {
196
357
  }
197
358
  setQuery(query);
198
359
  },
199
- placeholder: placeholder
360
+ onSubmit: function onSubmit() {
361
+ // Close the detached modal when form is submitted
362
+ if (isDetached) {
363
+ setIsModalOpen(false);
364
+ }
365
+ },
366
+ placeholder: placeholder,
367
+ isDetached: isDetached
200
368
  }),
201
369
  getInputProps = _usePropGetters.getInputProps,
202
370
  getItemProps = _usePropGetters.getItemProps,
203
371
  getPanelProps = _usePropGetters.getPanelProps,
204
- getRootProps = _usePropGetters.getRootProps;
372
+ getRootProps = _usePropGetters.getRootProps,
373
+ isOpen = _usePropGetters.isOpen,
374
+ setIsOpen = _usePropGetters.setIsOpen,
375
+ focusInput = _usePropGetters.focusInput;
376
+
377
+ // Open panel and focus input when modal opens
378
+ (0, _react.useEffect)(function () {
379
+ if (isDetached && isModalOpen) {
380
+ setIsOpen(true);
381
+ // Focus input to show the keyboard on mobile
382
+ focusInput();
383
+ }
384
+ }, [isDetached, isModalOpen, setIsOpen, focusInput]);
385
+
386
+ // Keep the modal open if the panel was open before switching to detached
387
+ (0, _react.useEffect)(function () {
388
+ var wasDetached = previousIsDetachedRef.current;
389
+ var switchedToDetached = !wasDetached && isDetached;
390
+ if (switchedToDetached && isOpen) {
391
+ setIsModalOpen(true);
392
+ }
393
+ previousIsDetachedRef.current = isDetached;
394
+ }, [isDetached, isOpen, setIsModalOpen]);
205
395
  var elements = {};
206
396
  if (showRecent && recentSearchConfig) {
207
397
  var RecentSearchItemComponent = recentSearchConfig.itemComponent;
@@ -263,18 +453,66 @@ function InnerAutocomplete(_ref3) {
263
453
  classNames: currentIndexConfig.classNames
264
454
  });
265
455
  });
266
- return /*#__PURE__*/_react.default.createElement(Autocomplete, _extends({}, props, getRootProps()), /*#__PURE__*/_react.default.createElement(_AutocompleteSearch.AutocompleteSearch, {
456
+ var searchBoxContent = /*#__PURE__*/_react.default.createElement(_AutocompleteSearch.AutocompleteSearch, {
267
457
  inputProps: getInputProps(),
268
458
  clearQuery: function clearQuery() {
269
459
  refineSearchBox('');
270
460
  refineAutocomplete('');
271
- }
272
- }), /*#__PURE__*/_react.default.createElement(AutocompletePanel, getPanelProps(), PanelComponent ? /*#__PURE__*/_react.default.createElement(PanelComponent, {
461
+ },
462
+ onQueryChange: function onQueryChange(query) {
463
+ refineAutocomplete(query);
464
+ },
465
+ query: currentRefinement || indexUiState.query || '',
466
+ refine: refineSearchBox,
467
+ isSearchStalled: isSearchStalled
468
+ });
469
+ var panelContent = /*#__PURE__*/_react.default.createElement(AutocompletePanel, getPanelProps(), PanelComponent ? /*#__PURE__*/_react.default.createElement(PanelComponent, {
273
470
  elements: elements,
274
471
  indices: indices
275
472
  }) : Object.keys(elements).map(function (elementId) {
276
473
  return elements[elementId];
277
- })));
474
+ }));
475
+ var detachedContainerClassNames = isModalDetached ? _objectSpread(_objectSpread({}, classNames), {}, {
476
+ detachedContainer: (0, _instantsearchUiComponents.cx)('ais-AutocompleteDetachedContainer--modal', classNames === null || classNames === void 0 ? void 0 : classNames.detachedContainer)
477
+ }) : classNames;
478
+ if (isDetached) {
479
+ return /*#__PURE__*/_react.default.createElement(Autocomplete, _extends({}, props, getRootProps(), {
480
+ classNames: classNames
481
+ }), /*#__PURE__*/_react.default.createElement(AutocompleteDetachedSearchButton, {
482
+ query: currentRefinement || indexUiState.query || '',
483
+ placeholder: placeholder,
484
+ classNames: classNames,
485
+ onClick: function onClick() {
486
+ setIsModalOpen(true);
487
+ setIsOpen(true);
488
+ },
489
+ onClear: function onClear() {
490
+ refineSearchBox('');
491
+ refineAutocomplete('');
492
+ },
493
+ translations: translations
494
+ }), isModalOpen && /*#__PURE__*/_react.default.createElement(AutocompleteDetachedOverlay, {
495
+ classNames: classNames,
496
+ onClose: function onClose() {
497
+ setIsModalOpen(false);
498
+ setIsOpen(false);
499
+ }
500
+ }, /*#__PURE__*/_react.default.createElement(AutocompleteDetachedContainer, {
501
+ classNames: detachedContainerClassNames
502
+ }, /*#__PURE__*/_react.default.createElement(AutocompleteDetachedFormContainer, {
503
+ classNames: classNames,
504
+ onCancel: function onCancel() {
505
+ setIsModalOpen(false);
506
+ setIsOpen(false);
507
+ },
508
+ translations: translations
509
+ }, searchBoxContent), panelContent)));
510
+ }
511
+
512
+ // Normal (non-detached) rendering
513
+ return /*#__PURE__*/_react.default.createElement(Autocomplete, _extends({}, props, getRootProps(), {
514
+ classNames: classNames
515
+ }), searchBoxContent, panelContent);
278
516
  }
279
517
  function ConditionalReverseHighlight(_ref7) {
280
518
  var _item$_highlightResul;
@@ -9,11 +9,6 @@ var _instantsearchUiComponents = require("instantsearch-ui-components");
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _components = require("../../../components");
11
11
  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); }
12
- 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; }
13
- 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; }
14
- 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
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
16
- 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); }
17
12
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
18
13
  function createCarouselTool(showViewAll, itemComponent, getSearchPageURL) {
19
14
  var Button = (0, _instantsearchUiComponents.createButtonComponent)({
@@ -21,8 +16,7 @@ function createCarouselTool(showViewAll, itemComponent, getSearchPageURL) {
21
16
  });
22
17
  function SearchLayoutComponent(_ref) {
23
18
  var message = _ref.message,
24
- indexUiState = _ref.indexUiState,
25
- setIndexUiState = _ref.setIndexUiState,
19
+ applyFilters = _ref.applyFilters,
26
20
  onClose = _ref.onClose;
27
21
  var input = message === null || message === void 0 ? void 0 : message.input;
28
22
  var output = message === null || message === void 0 ? void 0 : message.output;
@@ -31,15 +25,13 @@ function createCarouselTool(showViewAll, itemComponent, getSearchPageURL) {
31
25
  return function (props) {
32
26
  return /*#__PURE__*/_react.default.createElement(HeaderComponent, _extends({
33
27
  nbHits: output === null || output === void 0 ? void 0 : output.nbHits,
34
- query: input === null || input === void 0 ? void 0 : input.query,
28
+ input: input,
35
29
  hitsPerPage: items.length,
36
- setIndexUiState: setIndexUiState,
37
- indexUiState: indexUiState,
38
- getSearchPageURL: getSearchPageURL,
39
- onClose: onClose
30
+ onClose: onClose,
31
+ applyFilters: applyFilters
40
32
  }, props));
41
33
  };
42
- }, [items.length, input === null || input === void 0 ? void 0 : input.query, output === null || output === void 0 ? void 0 : output.nbHits, setIndexUiState, onClose, indexUiState]);
34
+ }, [items.length, input, output === null || output === void 0 ? void 0 : output.nbHits, applyFilters, onClose]);
43
35
  return /*#__PURE__*/_react.default.createElement(_components.Carousel, {
44
36
  items: items,
45
37
  itemComponent: itemComponent,
@@ -54,11 +46,9 @@ function createCarouselTool(showViewAll, itemComponent, getSearchPageURL) {
54
46
  scrollLeft = _ref2.scrollLeft,
55
47
  scrollRight = _ref2.scrollRight,
56
48
  nbHits = _ref2.nbHits,
57
- query = _ref2.query,
49
+ input = _ref2.input,
58
50
  hitsPerPage = _ref2.hitsPerPage,
59
- setIndexUiState = _ref2.setIndexUiState,
60
- indexUiState = _ref2.indexUiState,
61
- getSearchPageURL = _ref2.getSearchPageURL,
51
+ applyFilters = _ref2.applyFilters,
62
52
  onClose = _ref2.onClose;
63
53
  if ((hitsPerPage !== null && hitsPerPage !== void 0 ? hitsPerPage : 0) < 1) {
64
54
  return null;
@@ -73,20 +63,15 @@ function createCarouselTool(showViewAll, itemComponent, getSearchPageURL) {
73
63
  variant: "ghost",
74
64
  size: "sm",
75
65
  onClick: function onClick() {
76
- if (!query) return;
77
- var nextUiState = _objectSpread(_objectSpread({}, indexUiState), {}, {
78
- query: query
66
+ if (!input || !applyFilters) return;
67
+ var params = applyFilters({
68
+ query: input.query,
69
+ facetFilters: input.facet_filters
79
70
  });
80
-
81
- // If no main search page URL or we are on the search page, just update the state
82
- if (!getSearchPageURL || getSearchPageURL && new URL(getSearchPageURL(nextUiState)).pathname === window.location.pathname) {
83
- setIndexUiState(nextUiState);
84
- onClose();
85
- return;
71
+ if (getSearchPageURL && new URL(getSearchPageURL(params)).pathname !== window.location.pathname) {
72
+ window.location.href = getSearchPageURL(params);
86
73
  }
87
-
88
- // Navigate to different page
89
- window.location.href = getSearchPageURL(nextUiState);
74
+ onClose();
90
75
  },
91
76
  className: "ais-ChatToolSearchIndexCarouselHeaderViewAll"
92
77
  }, "View all", /*#__PURE__*/_react.default.createElement(_instantsearchUiComponents.ArrowRightIcon, {
@@ -3,5 +3,9 @@ import type { ComponentProps } from 'instantsearch-ui-components';
3
3
  export type AutocompleteSearchProps = {
4
4
  inputProps: ComponentProps<'input'>;
5
5
  clearQuery: () => void;
6
+ onQueryChange?: (query: string) => void;
7
+ query: string;
8
+ refine: (query: string) => void;
9
+ isSearchStalled: boolean;
6
10
  };
7
- export declare function AutocompleteSearch({ inputProps, clearQuery, }: AutocompleteSearchProps): React.JSX.Element;
11
+ export declare function AutocompleteSearch({ inputProps, clearQuery, onQueryChange, query, refine, isSearchStalled, }: AutocompleteSearchProps): React.JSX.Element;
@@ -6,22 +6,23 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
6
6
  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); }
7
7
  import { createAutocompleteSearchComponent } from 'instantsearch-ui-components';
8
8
  import React, { createElement, Fragment } from 'react';
9
- import { useSearchBox } from 'react-instantsearch-core';
10
9
  var AutocompleteSearchComponent = createAutocompleteSearchComponent({
11
10
  createElement: createElement,
12
11
  Fragment: Fragment
13
12
  });
14
13
  export function AutocompleteSearch(_ref) {
15
14
  var inputProps = _ref.inputProps,
16
- clearQuery = _ref.clearQuery;
17
- var _useSearchBox = useSearchBox(),
18
- query = _useSearchBox.query,
19
- refine = _useSearchBox.refine,
20
- isSearchStalled = _useSearchBox.isSearchStalled;
15
+ clearQuery = _ref.clearQuery,
16
+ onQueryChange = _ref.onQueryChange,
17
+ query = _ref.query,
18
+ refine = _ref.refine,
19
+ isSearchStalled = _ref.isSearchStalled;
21
20
  return /*#__PURE__*/React.createElement(AutocompleteSearchComponent, {
22
21
  inputProps: _objectSpread(_objectSpread({}, inputProps), {}, {
23
22
  onChange: function onChange(event) {
24
- return refine(event.currentTarget.value);
23
+ var value = event.currentTarget.value;
24
+ refine(value);
25
+ onQueryChange === null || onQueryChange === void 0 ? void 0 : onQueryChange(value);
25
26
  }
26
27
  }),
27
28
  onClear: clearQuery,
@@ -13,6 +13,11 @@ type IndexConfig<TItem extends BaseHit> = AutocompleteIndexConfig<TItem> & {
13
13
  classNames?: Partial<AutocompleteIndexClassNames>;
14
14
  };
15
15
  type PanelElements = Partial<Record<'recent' | 'suggestions' | (string & {}), React.JSX.Element>>;
16
+ type AutocompleteTranslations = {
17
+ detachedCancelButtonText: string;
18
+ detachedSearchButtonTitle: string;
19
+ detachedClearButtonTitle: string;
20
+ };
16
21
  export type AutocompleteProps<TItem extends BaseHit> = ComponentProps<'div'> & {
17
22
  indices?: Array<IndexConfig<TItem>>;
18
23
  showSuggestions?: Partial<Pick<IndexConfig<{
@@ -49,6 +54,18 @@ export type AutocompleteProps<TItem extends BaseHit> = ComponentProps<'div'> & {
49
54
  searchParameters?: AutocompleteSearchParameters;
50
55
  classNames?: Partial<AutocompleteClassNames>;
51
56
  placeholder?: string;
57
+ /**
58
+ * Media query to enable detached (mobile) mode.
59
+ * When the media query matches, the autocomplete switches to a full-screen overlay.
60
+ * Set to empty string to disable detached mode.
61
+ * When omitted, defaults to `--ais-autocomplete-detached-media-query`.
62
+ * @default "(max-width: 680px)"
63
+ */
64
+ detachedMediaQuery?: string;
65
+ /**
66
+ * Translations for the Autocomplete widget.
67
+ */
68
+ translations?: Partial<AutocompleteTranslations>;
52
69
  };
53
- export declare function EXPERIMENTAL_Autocomplete<TItem extends BaseHit = BaseHit>({ indices, showSuggestions, showRecent, searchParameters: userSearchParameters, ...props }: AutocompleteProps<TItem>): React.JSX.Element;
70
+ export declare function EXPERIMENTAL_Autocomplete<TItem extends BaseHit = BaseHit>({ indices, showSuggestions, showRecent, searchParameters: userSearchParameters, detachedMediaQuery, translations: userTranslations, ...props }: AutocompleteProps<TItem>): React.JSX.Element;
54
71
  export {};