@atlaskit/editor-plugin-synced-block
Version:
SyncedBlock plugin for @atlaskit/editor-core
50 lines (49 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createReferenceSelectionView = void 0;
var _bindEventListener = require("bind-event-listener");
var _syncBlock = require("@atlaskit/editor-common/sync-block");
var _state = require("@atlaskit/editor-prosemirror/state");
var getSelectedReference = function getSelectedReference(view) {
var selection = view.dom.ownerDocument.getSelection();
var anchor = selection === null || selection === void 0 ? void 0 : selection.anchorNode;
var anchorElement = anchor instanceof Element ? anchor : anchor === null || anchor === void 0 ? void 0 : anchor.parentElement;
var renderer = anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.closest(".".concat(_syncBlock.SyncBlockSharedCssClassName.renderer));
if (!renderer || !(selection !== null && selection !== void 0 && selection.focusNode) || !renderer.contains(selection.focusNode)) {
return null;
}
var reference = renderer.closest(".".concat(_syncBlock.SyncBlockSharedCssClassName.prefix));
return reference && view.dom.contains(reference) ? reference : null;
};
var createReferenceSelectionView = exports.createReferenceSelectionView = function createReferenceSelectionView(view) {
var syncReferenceSelection = function syncReferenceSelection() {
var _doc$nodeAt;
if (!view.editable) {
return;
}
var reference = getSelectedReference(view);
if (!reference) {
return;
}
var pos = view.posAtDOM(reference, 0);
var _view$state = view.state,
doc = _view$state.doc,
schema = _view$state.schema,
selection = _view$state.selection;
if (((_doc$nodeAt = doc.nodeAt(pos)) === null || _doc$nodeAt === void 0 ? void 0 : _doc$nodeAt.type) !== schema.nodes.syncBlock || selection instanceof _state.NodeSelection && selection.from === pos) {
return;
}
// The selectable renderer owns native focus, so PM's observer ignores its selection.
// Track the containing atom without focusing the editor or clearing highlighted text.
view.dispatch(view.state.tr.setSelection(_state.NodeSelection.create(doc, pos)));
};
var unbind = (0, _bindEventListener.bind)(view.dom.ownerDocument, {
type: 'selectionchange',
listener: syncReferenceSelection
});
return {
destroy: unbind
};
};