@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
116 lines (115 loc) • 3.38 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
function isUndefined(x) {
return x === undefined;
}
var ProviderFactory = exports.default = /*#__PURE__*/function () {
function ProviderFactory() {
(0, _classCallCheck2.default)(this, ProviderFactory);
(0, _defineProperty2.default)(this, "providers", new Map());
(0, _defineProperty2.default)(this, "subscribers", new Map());
}
(0, _createClass2.default)(ProviderFactory, [{
key: "destroy",
value: function destroy() {
this.providers.clear();
this.subscribers.clear();
}
}, {
key: "isEmpty",
value: function isEmpty() {
return !this.providers.size && !this.subscribers.size;
}
}, {
key: "setProvider",
value: function setProvider(name, provider) {
// Do not trigger notifyUpdate if provider is the same.
if (this.providers.get(name) === provider) {
return;
}
if (!isUndefined(provider)) {
this.providers.set(name, provider);
} else {
this.providers.delete(name);
}
this.notifyUpdated(name, provider);
}
}, {
key: "removeProvider",
value: function removeProvider(name) {
this.providers.delete(name);
this.notifyUpdated(name);
}
}, {
key: "subscribe",
value: function subscribe(name, handler) {
var handlers = this.subscribers.get(name) || [];
handlers.push(handler);
this.subscribers.set(name, handlers);
var provider = this.providers.get(name);
if (provider) {
handler(name, provider);
}
}
}, {
key: "unsubscribe",
value: function unsubscribe(name, handler) {
var handlers = this.subscribers.get(name);
if (!handlers) {
return;
}
var index = handlers.indexOf(handler);
if (index !== -1) {
handlers.splice(index, 1);
}
if (handlers.length === 0) {
this.subscribers.delete(name);
} else {
this.subscribers.set(name, handlers);
}
}
}, {
key: "unsubscribeAll",
value: function unsubscribeAll(name) {
var handlers = this.subscribers.get(name);
if (!handlers) {
return;
}
this.subscribers.delete(name);
}
}, {
key: "hasProvider",
value: function hasProvider(name) {
return this.providers.has(name);
}
}, {
key: "notifyUpdated",
value: function notifyUpdated(name, provider) {
var handlers = this.subscribers.get(name);
if (!handlers) {
return;
}
handlers.forEach(function (handler) {
handler(name, provider);
});
}
}], [{
key: "create",
value: function create(providers) {
var providerFactory = new ProviderFactory();
var keys = Object.keys(providers);
keys.forEach(function (name) {
providerFactory.setProvider(name, providers[name]);
});
return providerFactory;
}
}]);
return ProviderFactory;
}();