@redocly/theme
Version:
Shared UI components lib
64 lines • 2.03 kB
JavaScript
;
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