@atlaskit/editor-plugin-block-controls
Version:
Block controls plugin for @atlaskit/editor-core
89 lines (88 loc) • 3.71 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useActiveAnchorTracker = exports.defaultActiveAnchorTracker = exports.ActiveAnchorTracker = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _events = require("events");
var _react = require("react");
var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
var ActiveAnchorTracker = exports.ActiveAnchorTracker = /*#__PURE__*/function () {
function ActiveAnchorTracker() {
(0, _classCallCheck2.default)(this, ActiveAnchorTracker);
(0, _defineProperty2.default)(this, "lastActiveAnchor", '');
this.emitter = new _events.EventEmitter();
}
return (0, _createClass2.default)(ActiveAnchorTracker, [{
key: "getActiveAnchor",
value: function getActiveAnchor() {
return this.lastActiveAnchor;
}
}, {
key: "subscribe",
value: function subscribe(anchorName, callback) {
if (this.emitter) {
this.emitter.on(anchorName, callback);
}
}
}, {
key: "unsubscribe",
value: function unsubscribe(anchorName, callback) {
if (this.emitter) {
this.emitter.removeListener(anchorName, callback);
}
}
}, {
key: "emit",
value: function emit(anchorName) {
if (this.lastActiveAnchor !== anchorName && this.emitter) {
this.emitter.emit(this.lastActiveAnchor, false);
this.emitter.emit(anchorName, true);
this.lastActiveAnchor = anchorName;
}
}
}, {
key: "reset",
value: function reset() {
if (this.emitter) {
// To prevent any potential memory leaks,
// we set the event emitter to null and then create a new event emitter.
this.emitter.removeAllListeners();
this.emitter = null;
this.emitter = new _events.EventEmitter();
}
}
}]);
}(); // TODO: ED-26959 - We should use a scoped ActiveAnchorTracker rather than the global static object.
// Move this into the plugin scope once the newApply functions becomes default apply.
var defaultActiveAnchorTracker = exports.defaultActiveAnchorTracker = new ActiveAnchorTracker();
var useActiveAnchorTracker = exports.useActiveAnchorTracker = function useActiveAnchorTracker(anchorName) {
var activeAnchorTracker = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultActiveAnchorTracker;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isActive = _useState2[0],
setIsActive = _useState2[1];
var onActive = function onActive(eventIsActive) {
setIsActive(eventIsActive);
};
(0, _react.useEffect)(function () {
if (activeAnchorTracker && anchorName && (0, _experiments.editorExperiment)('advanced_layouts', true)) {
activeAnchorTracker.subscribe(anchorName, onActive);
if (activeAnchorTracker.getActiveAnchor() === anchorName) {
setIsActive(true);
}
var unsubscribe = function unsubscribe() {
activeAnchorTracker.unsubscribe(anchorName, onActive);
};
return unsubscribe;
}
}, [activeAnchorTracker, anchorName]);
var setActive = (0, _react.useCallback)(function () {
activeAnchorTracker.emit(anchorName);
}, [activeAnchorTracker, anchorName]);
return [isActive, setActive];
};