UNPKG

@redocly/theme

Version:

Shared UI components lib

64 lines 2.33 kB
"use strict"; 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