instantsearch-ui-components
Version:
Common UI components for InstantSearch.
174 lines (173 loc) • 5.56 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createAutocompleteStorage = createAutocompleteStorage;
exports.createStorage = createStorage;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
function createAutocompleteStorage(_ref) {
var useEffect = _ref.useEffect,
useMemo = _ref.useMemo,
useState = _ref.useState;
return function useStorage(_ref2) {
var showRecent = _ref2.showRecent,
query = _ref2.query,
indices = _ref2.indices,
indicesConfig = _ref2.indicesConfig;
var storageKey = showRecent && (0, _typeof2.default)(showRecent) === 'object' ? showRecent.storageKey : undefined;
var storage = useMemo(function () {
return createStorage({
limit: 5,
storageKey: storageKey
});
}, [storageKey]);
var _useState = useState(storage.getSnapshot()),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
snapshot = _useState2[0],
setSnapshot = _useState2[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 = (0, _toConsumableArray2.default)(indices);
var indicesConfigForPropGetters = (0, _toConsumableArray2.default)(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(_ref3) {
var item = _ref3.item,
query = _ref3.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] !== undefined ? 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(_ref4) {
var _ref4$limit = _ref4.limit,
limit = _ref4$limit === void 0 ? 5 : _ref4$limit,
storageKey = _ref4.storageKey;
var storage = getLocalStorage(storageKey);
var updateListener = null;
return {
onAdd: function onAdd(query) {
this.onRemove(query);
storage.setItems([query].concat((0, _toConsumableArray2.default)(storage.getItems())));
},
onRemove: function onRemove(query) {
var _updateListener;
storage.setItems(storage.getItems().filter(function (q) {
return q !== query;
}));
(_updateListener = 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] !== undefined ? arguments[0] : '';
return storage.getItems().filter(function (q) {
return q.includes(query);
}).slice(0, limit);
}
};
}
};
}