@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
43 lines (42 loc) • 1.88 kB
JavaScript
import { getLocalStorageItem, removeLocalStorageItem, resolveLocalStorage, setLocalStorageItem } from "./local-storage.js";
function createLocalStorageValueStore({ key, storage, serverSnapshot = null }) {
const listeners = new Set();
const readValue = ()=>getLocalStorageItem(key, storage);
const notifyListeners = ()=>{
for (const listener of listeners)listener();
};
return {
get: readValue,
set (value) {
const resolvedStorage = resolveLocalStorage(storage);
if (!resolvedStorage) return;
if (getLocalStorageItem(key, resolvedStorage) === value) return;
if (setLocalStorageItem(key, value, resolvedStorage)) notifyListeners();
},
clear () {
const resolvedStorage = resolveLocalStorage(storage);
if (!resolvedStorage) return;
if (null === getLocalStorageItem(key, resolvedStorage)) return;
if (removeLocalStorageItem(key, resolvedStorage)) notifyListeners();
},
subscribe (listener) {
listeners.add(listener);
if ("undefined" == typeof window) return ()=>{
listeners.delete(listener);
};
const resolvedStorage = resolveLocalStorage(storage);
const handleStorage = (event)=>{
if (resolvedStorage && event.storageArea && event.storageArea !== resolvedStorage) return;
if (event.key === key || null === event.key) listener();
};
window.addEventListener("storage", handleStorage);
return ()=>{
listeners.delete(listener);
window.removeEventListener("storage", handleStorage);
};
},
getSnapshot: readValue,
getServerSnapshot: ()=>serverSnapshot
};
}
export { createLocalStorageValueStore };