@lobehub/editor
Version:
A powerful and extensible rich text editor built on Meta's Lexical framework, providing a modern editing experience with React integration.
46 lines • 1.87 kB
JavaScript
import { $getSelection, $isNodeSelection, $isRangeSelection } from 'lexical';
import { $isMentionNode } from "../node/MentionNode";
export function registerMentionNodeSelectionObserver(editor) {
var selectMentionKeys = [];
return editor.registerUpdateListener(function (_ref) {
var editorState = _ref.editorState;
var selection = editorState.read(function () {
return $getSelection();
});
var newSelectMentionKeys = [];
if ($isNodeSelection(selection)) {
var nodes = editorState.read(function () {
return selection.getNodes();
});
nodes.forEach(function (node) {
if (node.getType() === 'mention') {
newSelectMentionKeys.push(node.getKey());
}
});
} else if ($isRangeSelection(selection) && !selection.isCollapsed()) {
editorState.read(function () {
selection.getNodes().forEach(function (node) {
if ($isMentionNode(node)) {
newSelectMentionKeys.push(node.getKey());
}
});
});
}
var removeKeys = selectMentionKeys.filter(function (key) {
return !newSelectMentionKeys.includes(key);
});
var addKeys = newSelectMentionKeys.filter(function (key) {
return !selectMentionKeys.includes(key);
});
selectMentionKeys.length = 0;
selectMentionKeys.push.apply(selectMentionKeys, newSelectMentionKeys);
removeKeys.forEach(function (key) {
var _editor$getElementByK;
(_editor$getElementByK = editor.getElementByKey(key)) === null || _editor$getElementByK === void 0 || _editor$getElementByK.classList.remove('selected');
});
addKeys.forEach(function (key) {
var _editor$getElementByK2;
(_editor$getElementByK2 = editor.getElementByKey(key)) === null || _editor$getElementByK2 === void 0 || _editor$getElementByK2.classList.add('selected');
});
});
}