UNPKG

@shopware-ag/meteor-admin-sdk

Version:

The Meteor SDK for the Shopware Administration.

181 lines 7.02 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "./../../_internals/serializer", "localforage", "vue", "../../channel"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSharedState = exports._useSharedState = void 0; const serializer_1 = __importDefault(require("./../../_internals/serializer")); const localforage_1 = __importDefault(require("localforage")); const vue_1 = require("vue"); const channel_1 = require("../../channel"); const { serialize, deserialize } = (0, serializer_1.default)({ handle: channel_1.handle, send: channel_1.send, }); function setItem({ key, newValue, persistentSharedValueStore, persistentSharedValueStoreBroadcast, }) { return __awaiter(this, void 0, void 0, function* () { const serializedValue = serialize(newValue); yield persistentSharedValueStore.setItem(key, serializedValue); persistentSharedValueStoreBroadcast.postMessage({ type: 'store-change', key: key, }); }); } function createValueWatcher({ key, sharedValue, persistentSharedValueStore, persistentSharedValueStoreBroadcast, getPendingValue, }) { return (0, vue_1.watch)(() => sharedValue.value, (newValue) => __awaiter(this, void 0, void 0, function* () { if (getPendingValue()) { return; } yield setItem({ key, newValue, persistentSharedValueStore, persistentSharedValueStoreBroadcast, }); }), { deep: true }); } function setRemoteValue({ setPendingValue, removeWatcher, setWatcher, store, key, sharedValue, }) { setPendingValue(true); removeWatcher(); return store.getItem(key) .then((value) => { if (value === null) { return; } const deserializedValue = deserialize(value, new MessageEvent('message')); sharedValue.value = deserializedValue; }) .finally(() => { setPendingValue(false); setWatcher(); }); } /** * @internal * @private */ function _useSharedState(key, initalValue) { const isReady = (0, vue_1.ref)(false); let isPending = false; const getPendingValue = () => isPending; const setPendingValue = (newValue) => { isPending = newValue; }; const removeWatcher = () => { unwatchValue(); }; const setWatcher = () => { unwatchValue(); unwatchValue = createValueWatcher({ key, sharedValue, persistentSharedValueStore, persistentSharedValueStoreBroadcast, getPendingValue, }); }; const persistentSharedValueStore = localforage_1.default.createInstance({ name: 'adminExtensionSDK', storeName: 'persistentSharedValueStore', }); const persistentSharedValueStoreBroadcast = new BroadcastChannel('persistentSharedValueStore'); const sharedValue = (0, vue_1.reactive)({ value: initalValue, }); let unwatchValue = createValueWatcher({ key, sharedValue, persistentSharedValueStore, persistentSharedValueStoreBroadcast, getPendingValue, }); const eventListener = (event) => { if (event.data.type !== 'store-change') { return; } if (event.data.key !== key) { return; } void setRemoteValue({ setPendingValue, removeWatcher, setWatcher, store: persistentSharedValueStore, key, sharedValue, }); }; persistentSharedValueStoreBroadcast.addEventListener('message', eventListener); (0, vue_1.onBeforeUnmount)(() => { persistentSharedValueStoreBroadcast.close(); persistentSharedValueStoreBroadcast.removeEventListener('message', eventListener); }); // Get initial value from remote const remoteValuePromise = setRemoteValue({ setPendingValue, removeWatcher, setWatcher, store: persistentSharedValueStore, key, sharedValue, }); // Set inital value when remote value is not available const initialValuePromise = persistentSharedValueStore.getItem(key) .then((value) => __awaiter(this, void 0, void 0, function* () { if (value !== null) { return; } yield setItem({ key, newValue: initalValue, persistentSharedValueStore, persistentSharedValueStoreBroadcast, }); })) // Handle error silently because the broadcast channel could be closed // eslint-disable-next-line @typescript-eslint/no-empty-function .catch(() => { }); const ready = Promise.all([ remoteValuePromise, initialValuePromise, ]).then(() => { isReady.value = true; }); return { state: sharedValue, isReady, ready, }; } exports._useSharedState = _useSharedState; /** * * @param key - Shared state key * @param initalValue - Initial value * @returns */ function useSharedState(key, initalValue) { return _useSharedState(key, initalValue).state; } exports.useSharedState = useSharedState; }); //# sourceMappingURL=useSharedState.js.map