UNPKG

@redocly/theme

Version:

Shared UI components lib

64 lines 2.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createStore = createStore; exports.useStore = useStore; const react_1 = require("react"); const js_utils_1 = require("../utils/js-utils"); function createStore({ storageKey, storageType = 'localStorage', serializer = { parse: (value) => JSON.parse(value), serialize: (value) => JSON.stringify(value), }, }) { const subscribers = new Set(); let cachedValue; const shouldSerialize = (value) => typeof value !== 'string'; const getValue = (defaultValue) => { if (!(0, js_utils_1.isBrowser)()) return defaultValue; if (cachedValue !== undefined) return cachedValue; const value = window[storageType].getItem(storageKey); if (!value) { cachedValue = defaultValue; return cachedValue; } if (!shouldSerialize(defaultValue)) { cachedValue = value; return cachedValue; } try { cachedValue = JSON.parse(value); } catch (_a) { cachedValue = defaultValue; } return cachedValue; }; const setValue = (next) => { if (!(0, js_utils_1.isBrowser)()) return; try { window[storageType].setItem(storageKey, shouldSerialize(next) ? serializer.serialize(next) : next); cachedValue = next; subscribers.forEach((callback) => callback()); } catch (_a) { return; } }; const subscribe = (callback) => { subscribers.add(callback); return () => { subscribers.delete(callback); }; }; return { getValue, setValue, subscribe, }; } function useStore(store, defaultValue) { const value = (0, react_1.useSyncExternalStore)(store.subscribe, () => store.getValue(defaultValue), () => defaultValue); return [value, store.setValue]; } //# sourceMappingURL=use-store.js.map