UNPKG

instantsearch-ui-components

Version:

Common UI components for InstantSearch.

191 lines (189 loc) 6.98 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: Object.getOwnPropertyDescriptor(all, name).get }); } _export(exports, { get createAutocompleteStorage () { return createAutocompleteStorage; }, get createStorage () { return createStorage; } }); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _to_consumable_array = require("@swc/helpers/_/_to_consumable_array"); var _type_of = require("@swc/helpers/_/_type_of"); var _lib = require("../../lib"); function createAutocompleteStorage(param) { var useEffect = param.useEffect, useMemo = param.useMemo, useState = param.useState; return function useStorage(param) { var showRecent = param.showRecent, query = param.query, indices = param.indices, indicesConfig = param.indicesConfig, suggestionsIndexName = param.suggestionsIndexName; var storageKey = showRecent && (typeof showRecent === "undefined" ? "undefined" : _type_of._(showRecent)) === 'object' ? showRecent.storageKey : undefined; var storage = useMemo(function() { return createStorage({ limit: 5, storageKey: storageKey }); }, [ storageKey ]); var _useState = _sliced_to_array._(useState(storage.getSnapshot()), 2), snapshot = _useState[0], setSnapshot = _useState[1]; useEffect(function() { storage.registerUpdateListener(function() { setSnapshot(storage.getSnapshot()); }); return function() { storage.unregisterUpdateListener(); }; }, [ storage ]); if (!showRecent) { return { storage: { onAdd: function onAdd() {}, onRemove: function onRemove() {} }, storageHits: [], indicesForPropGetters: indices, indicesConfigForPropGetters: indicesConfig }; } var storageHits = snapshot.getAll(query).map(function(value) { return { objectID: value, query: value, __indexName: 'recent-searches', _highlightResult: getHighlightedAttribute({ item: { query: value }, query: query || '' }) }; }); var indicesForPropGetters = _to_consumable_array._(indices.map(function(index) { return index.indexName === suggestionsIndexName ? _object_spread_props._(_object_spread._({}, index), { hits: index.hits.filter(function(hit) { return !(0, _lib.find)(storageHits, function(storageHit) { return storageHit.query === hit.query; }); }) }) : index; })); var indicesConfigForPropGetters = _to_consumable_array._(indicesConfig); indicesForPropGetters.unshift({ indexName: 'recent-searches', indexId: 'recent-searches', hits: storageHits }); indicesConfigForPropGetters.unshift({ indexName: 'recent-searches', // @ts-expect-error - we know it has query as it's generated from storageHits getQuery: function getQuery(item) { return item.query; } }); return { storage: storage, storageHits: storageHits, indicesForPropGetters: indicesForPropGetters, indicesConfigForPropGetters: indicesConfigForPropGetters }; }; } var LOCAL_STORAGE_KEY_TEST = 'test-localstorage-support'; var LOCAL_STORAGE_KEY = 'autocomplete-recent-searches'; function isLocalStorageSupported() { try { localStorage.setItem(LOCAL_STORAGE_KEY_TEST, ''); localStorage.removeItem(LOCAL_STORAGE_KEY_TEST); return true; } catch (error) { return false; } } function getHighlightedAttribute(param) { var item = param.item, query = param.query; if (!query.trim().length) { return { query: { matchLevel: 'none' } }; } return { query: { value: item.query.replace(new RegExp(query.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'gi'), function(match) { return "<mark>".concat(match, "</mark>"); }) } }; } function getLocalStorage() { var key = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : LOCAL_STORAGE_KEY; if (!isLocalStorageSupported()) { return { setItems: function setItems() {}, getItems: function getItems() { return []; } }; } return { setItems: function setItems(items) { try { window.localStorage.setItem(key, JSON.stringify(items)); } catch (unused) { // do nothing, this likely means the storage is full } }, getItems: function getItems() { var items = window.localStorage.getItem(key); return items ? JSON.parse(items) : []; } }; } function createStorage(param) { var _param_limit = param.limit, limit = _param_limit === void 0 ? 5 : _param_limit, storageKey = param.storageKey; var storage = getLocalStorage(storageKey); var updateListener = null; return { onAdd: function onAdd(query) { this.onRemove(query); storage.setItems([ query ].concat(_to_consumable_array._(storage.getItems()))); }, onRemove: function onRemove(query) { storage.setItems(storage.getItems().filter(function(q) { return q !== query; })); updateListener === null || updateListener === void 0 ? void 0 : updateListener(); }, registerUpdateListener: function registerUpdateListener(callback) { updateListener = callback; }, unregisterUpdateListener: function unregisterUpdateListener() { updateListener = null; }, getSnapshot: function getSnapshot() { return { getAll: function getAll() { var query = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ''; return storage.getItems().filter(function(q) { return q.includes(query); }).slice(0, limit); } }; } }; }