@lexical/react
Version:
This package provides Lexical components and hooks for React applications.
99 lines (92 loc) • 3.07 kB
JavaScript
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
import { HorizontalRuleNode as HorizontalRuleNode$1 } from '@lexical/extension';
export { $isHorizontalRuleNode, INSERT_HORIZONTAL_RULE_COMMAND } from '@lexical/extension';
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
import { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection';
import { mergeRegister, addClassNamesToElement, removeClassNamesFromElement } from '@lexical/utils';
import { $applyNodeReplacement, CLICK_COMMAND, COMMAND_PRIORITY_LOW } from 'lexical';
import { useEffect } from 'react';
import { jsx } from 'react/jsx-runtime';
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
function HorizontalRuleComponent({
nodeKey
}) {
const [editor] = useLexicalComposerContext();
const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
useEffect(() => {
return mergeRegister(editor.registerCommand(CLICK_COMMAND, event => {
const hrElem = editor.getElementByKey(nodeKey);
if (event.target === hrElem) {
if (!event.shiftKey) {
clearSelection();
}
setSelected(!isSelected);
return true;
}
return false;
}, COMMAND_PRIORITY_LOW));
}, [clearSelection, editor, isSelected, nodeKey, setSelected]);
useEffect(() => {
const hrElem = editor.getElementByKey(nodeKey);
const isSelectedClassName = editor._config.theme.hrSelected ?? 'selected';
if (hrElem !== null) {
if (isSelected) {
addClassNamesToElement(hrElem, isSelectedClassName);
} else {
removeClassNamesFromElement(hrElem, isSelectedClassName);
}
}
}, [editor, isSelected, nodeKey]);
return null;
}
/**
* @deprecated A pure Lexical implementation is available in `@lexical/extension` as HorizontalRuleExtension
*/
class HorizontalRuleNode extends HorizontalRuleNode$1 {
static getType() {
return 'horizontalrule';
}
static clone(node) {
return new HorizontalRuleNode(node.__key);
}
static importJSON(serializedNode) {
return $createHorizontalRuleNode().updateFromJSON(serializedNode);
}
static importDOM() {
return {
hr: () => ({
conversion: $convertHorizontalRuleElement,
priority: 0
})
};
}
decorate() {
return /*#__PURE__*/jsx(HorizontalRuleComponent, {
nodeKey: this.__key
});
}
}
function $convertHorizontalRuleElement() {
return {
node: $createHorizontalRuleNode()
};
}
/**
* @deprecated A pure Lexical implementation is available in `@lexical/extension` as HorizontalRuleExtension
*/
function $createHorizontalRuleNode() {
return $applyNodeReplacement(new HorizontalRuleNode());
}
export { $createHorizontalRuleNode, HorizontalRuleNode };