@redocly/theme
Version:
Shared UI components lib
64 lines • 2.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useRecentSearches = void 0;
const react_1 = require("react");
const utils_1 = require("../../../core/utils");
const RECENT_SEARCHES_KEY = 'recentSearches';
const RECENT_SEARCHES_LIMIT = 5;
const createRecentSearchesStore = () => {
const subscribers = new Set();
let cachedSnapshot;
const getSnapshot = () => {
if (!(0, utils_1.isBrowser)())
return [];
if (cachedSnapshot)
return cachedSnapshot;
try {
const stored = localStorage.getItem(RECENT_SEARCHES_KEY);
cachedSnapshot = stored ? JSON.parse(stored) : [];
return cachedSnapshot;
}
catch (e) {
cachedSnapshot = [];
return cachedSnapshot;
}
};
const updateItems = (value, isAdd) => {
if (!(0, utils_1.isBrowser)())
return;
const currentItems = getSnapshot();
const valueIndex = currentItems.indexOf(value);
if (valueIndex !== -1) {
currentItems.splice(valueIndex, 1);
}
if (isAdd) {
currentItems.unshift(value);
}
const limitedItems = currentItems.slice(0, RECENT_SEARCHES_LIMIT);
localStorage.setItem(RECENT_SEARCHES_KEY, JSON.stringify(limitedItems));
cachedSnapshot = limitedItems;
subscribers.forEach((callback) => callback());
};
const subscribe = (callback) => {
subscribers.add(callback);
return () => subscribers.delete(callback);
};
return {
getSnapshot,
subscribe,
updateItems,
};
};
const recentSearchesStore = createRecentSearchesStore();
const useRecentSearches = () => {
const items = (0, react_1.useSyncExternalStore)(recentSearchesStore.subscribe, recentSearchesStore.getSnapshot, () => []);
const addSearchHistoryItem = (0, react_1.useCallback)((value) => {
recentSearchesStore.updateItems(value, true);
}, []);
const removeSearchHistoryItem = (0, react_1.useCallback)((value) => {
recentSearchesStore.updateItems(value, false);
}, []);
return { items, addSearchHistoryItem, removeSearchHistoryItem };
};
exports.useRecentSearches = useRecentSearches;
//# sourceMappingURL=use-recent-searches.js.map