UNPKG

react-instantsearch

Version:
257 lines 14.5 kB
var _excluded = ["indices", "showSuggestions", "showRecent", "searchParameters"], _excluded2 = ["indicesConfig", "refineSearchBox", "getSearchPageURL", "onSelect", "indexUiState", "isSearchPage", "panelComponent", "showRecent", "showSuggestions", "placeholder"]; 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); } 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); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 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."); } 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; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } 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; } 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; } 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; } 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; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } 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); } 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; } 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; } import { createAutocompleteComponent, createAutocompleteIndexComponent, createAutocompletePanelComponent, createAutocompletePropGetters, createAutocompleteSuggestionComponent, createAutocompleteRecentSearchComponent, createAutocompleteStorage, cx } from 'instantsearch-ui-components'; import React, { createElement, Fragment, useEffect, useId, useMemo, useRef, useState } from 'react'; import { Configure, Index, useAutocomplete, useInstantSearch, useSearchBox } from 'react-instantsearch-core'; import { AutocompleteSearch } from "../components/AutocompleteSearch.js"; import { ReverseHighlight } from "./ReverseHighlight.js"; var Autocomplete = createAutocompleteComponent({ createElement: createElement, Fragment: Fragment }); var AutocompletePanel = createAutocompletePanelComponent({ createElement: createElement, Fragment: Fragment }); var AutocompleteIndex = createAutocompleteIndexComponent({ createElement: createElement, Fragment: Fragment }); var AutocompleteSuggestion = createAutocompleteSuggestionComponent({ createElement: createElement, Fragment: Fragment }); var AutocompleteRecentSearch = createAutocompleteRecentSearchComponent({ createElement: createElement, Fragment: Fragment }); var usePropGetters = createAutocompletePropGetters({ useEffect: useEffect, useId: useId, useMemo: useMemo, useRef: useRef, useState: useState }); var useStorage = createAutocompleteStorage({ useEffect: useEffect, useMemo: useMemo, useState: useState }); export function EXPERIMENTAL_Autocomplete(_ref) { var _ref$indices = _ref.indices, indices = _ref$indices === void 0 ? [] : _ref$indices, showSuggestions = _ref.showSuggestions, showRecent = _ref.showRecent, userSearchParameters = _ref.searchParameters, props = _objectWithoutProperties(_ref, _excluded); var _useInstantSearch = useInstantSearch(), indexUiState = _useInstantSearch.indexUiState, indexRenderState = _useInstantSearch.indexRenderState; var _useSearchBox = useSearchBox({}, { $$type: 'ais.autocomplete', $$widgetType: 'ais.autocomplete' }), refine = _useSearchBox.refine; var searchParameters = _objectSpread({ hitsPerPage: 5 }, userSearchParameters); var indicesConfig = _toConsumableArray(indices); if (showSuggestions !== null && showSuggestions !== void 0 && showSuggestions.indexName) { var _showSuggestions$clas, _showSuggestions$clas2, _showSuggestions$clas3, _showSuggestions$clas4; indicesConfig.unshift({ indexName: showSuggestions.indexName, headerComponent: showSuggestions.headerComponent, itemComponent: showSuggestions.itemComponent || function (_ref2) { var item = _ref2.item, onSelect = _ref2.onSelect; return /*#__PURE__*/React.createElement(AutocompleteSuggestion, { item: item, onSelect: onSelect }, /*#__PURE__*/React.createElement(ConditionalReverseHighlight, { item: item })); }, classNames: { root: cx('ais-AutocompleteSuggestions', showSuggestions === null || showSuggestions === void 0 ? void 0 : (_showSuggestions$clas = showSuggestions.classNames) === null || _showSuggestions$clas === void 0 ? void 0 : _showSuggestions$clas.root), list: cx('ais-AutocompleteSuggestionsList', showSuggestions === null || showSuggestions === void 0 ? void 0 : (_showSuggestions$clas2 = showSuggestions.classNames) === null || _showSuggestions$clas2 === void 0 ? void 0 : _showSuggestions$clas2.list), header: cx('ais-AutocompleteSuggestionsHeader', showSuggestions === null || showSuggestions === void 0 ? void 0 : (_showSuggestions$clas3 = showSuggestions.classNames) === null || _showSuggestions$clas3 === void 0 ? void 0 : _showSuggestions$clas3.header), item: cx('ais-AutocompleteSuggestionsItem', showSuggestions === null || showSuggestions === void 0 ? void 0 : (_showSuggestions$clas4 = showSuggestions.classNames) === null || _showSuggestions$clas4 === void 0 ? void 0 : _showSuggestions$clas4.item) }, getQuery: function getQuery(item) { return item.query; }, getURL: showSuggestions.getURL }); } var isSearchPage = useMemo(function () { return typeof indexRenderState.hits !== 'undefined' || typeof indexRenderState.infiniteHits !== 'undefined'; }, [indexRenderState]); return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(Index, { EXPERIMENTAL_isolated: true }, /*#__PURE__*/React.createElement(Configure, searchParameters), indicesConfig.map(function (index) { return /*#__PURE__*/React.createElement(Index, { key: index.indexName, indexName: index.indexName }, /*#__PURE__*/React.createElement(Configure, index.searchParameters)); }), /*#__PURE__*/React.createElement(InnerAutocomplete, _extends({}, props, { indicesConfig: indicesConfig, refineSearchBox: refine, indexUiState: indexUiState, isSearchPage: isSearchPage, showRecent: showRecent, showSuggestions: showSuggestions })))); } function InnerAutocomplete(_ref3) { var indicesConfig = _ref3.indicesConfig, refineSearchBox = _ref3.refineSearchBox, getSearchPageURL = _ref3.getSearchPageURL, userOnSelect = _ref3.onSelect, indexUiState = _ref3.indexUiState, isSearchPage = _ref3.isSearchPage, PanelComponent = _ref3.panelComponent, showRecent = _ref3.showRecent, showSuggestions = _ref3.showSuggestions, placeholder = _ref3.placeholder, props = _objectWithoutProperties(_ref3, _excluded2); var _useAutocomplete = useAutocomplete(), indices = _useAutocomplete.indices, refineAutocomplete = _useAutocomplete.refine, currentRefinement = _useAutocomplete.currentRefinement; var _useStorage = useStorage({ showRecent: showRecent, query: currentRefinement, indices: indices, indicesConfig: indicesConfig }), storage = _useStorage.storage, storageHits = _useStorage.storageHits, indicesForPropGetters = _useStorage.indicesForPropGetters, indicesConfigForPropGetters = _useStorage.indicesConfigForPropGetters; var _usePropGetters = usePropGetters({ indices: indicesForPropGetters, indicesConfig: indicesConfigForPropGetters, onRefine: function onRefine(query) { refineAutocomplete(query); refineSearchBox(query); storage.onAdd(query); }, onSelect: userOnSelect !== null && userOnSelect !== void 0 ? userOnSelect : function (_ref4) { var query = _ref4.query, setQuery = _ref4.setQuery, url = _ref4.url; if (url) { window.location.href = url; return; } if (!isSearchPage && typeof getSearchPageURL !== 'undefined') { window.location.href = getSearchPageURL(_objectSpread(_objectSpread({}, indexUiState), {}, { query: query })); return; } setQuery(query); }, placeholder: placeholder }), getInputProps = _usePropGetters.getInputProps, getItemProps = _usePropGetters.getItemProps, getPanelProps = _usePropGetters.getPanelProps, getRootProps = _usePropGetters.getRootProps; var AutocompleteRecentSearchComponent = _typeof(showRecent) === 'object' && showRecent.itemComponent || AutocompleteRecentSearch; var elements = {}; if (showRecent) { elements.recent = /*#__PURE__*/React.createElement(AutocompleteIndex // @ts-ignore - there seems to be problems with React.ComponentType and this, but it's actually correct , { ItemComponent: function ItemComponent(_ref5) { var item = _ref5.item, onSelect = _ref5.onSelect; return /*#__PURE__*/React.createElement(AutocompleteRecentSearchComponent, { item: item, onSelect: onSelect, onRemoveRecentSearch: function onRemoveRecentSearch() { return storage.onRemove(item.query); } }, /*#__PURE__*/React.createElement(ConditionalReverseHighlight, { item: item })); }, classNames: { root: 'ais-AutocompleteRecentSearches', list: 'ais-AutocompleteRecentSearchesList', item: 'ais-AutocompleteRecentSearchesItem' }, items: storageHits, getItemProps: getItemProps, key: "recentSearches" }); } indices.forEach(function (_ref6, i) { var indexId = _ref6.indexId, indexName = _ref6.indexName, hits = _ref6.hits; var elementId = indexName === (showSuggestions === null || showSuggestions === void 0 ? void 0 : showSuggestions.indexName) ? 'suggestions' : indexName; var filteredHits = elementId === 'suggestions' && showRecent ? hits.filter(function (suggestionHit) { return !storageHits.find(function (storageHit) { return storageHit.query === suggestionHit.query; }); }) : hits; elements[elementId] = /*#__PURE__*/React.createElement(AutocompleteIndex, { key: indexId // @ts-expect-error - there seems to be problems with React.ComponentType and this, but it's actually correct , HeaderComponent: indicesConfig[i].headerComponent // @ts-expect-error - there seems to be problems with React.ComponentType and this, but it's actually correct , ItemComponent: indicesConfig[i].itemComponent, items: filteredHits.map(function (item) { return _objectSpread(_objectSpread({}, item), {}, { __indexName: indexId }); }), getItemProps: getItemProps, classNames: indicesConfig[i].classNames }); }); return /*#__PURE__*/React.createElement(Autocomplete, _extends({}, props, getRootProps()), /*#__PURE__*/React.createElement(AutocompleteSearch, { inputProps: getInputProps(), clearQuery: function clearQuery() { refineSearchBox(''); refineAutocomplete(''); } }), /*#__PURE__*/React.createElement(AutocompletePanel, getPanelProps(), PanelComponent ? /*#__PURE__*/React.createElement(PanelComponent, { elements: elements, indices: indices }) : Object.keys(elements).map(function (elementId) { return elements[elementId]; }))); } function ConditionalReverseHighlight(_ref7) { var _item$_highlightResul; var item = _ref7.item; if (!((_item$_highlightResul = item._highlightResult) !== null && _item$_highlightResul !== void 0 && _item$_highlightResul.query) || // @ts-expect-error - we should not have matchLevel as arrays here item._highlightResult.query.matchLevel === 'none') { return item.query; } return /*#__PURE__*/React.createElement(ReverseHighlight, { attribute: "query", hit: item }); }