import { createContext, useEffect, useState } from 'react'; import ExampleTheme from "./themes/ExampleTheme"; import { LexicalComposer } from "@lexical/react/LexicalComposer"; import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin"; import {PlainTextPlugin} from '@lexical/react/LexicalPlainTextPlugin'; import { ContentEditable } from "@lexical/react/LexicalContentEditable"; import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin"; import { AutoFocusPlugin } from "@lexical/react/LexicalAutoFocusPlugin"; import {LexicalErrorBoundary} from "@lexical/react/LexicalErrorBoundary"; import {TabIndentationPlugin} from '@lexical/react/LexicalTabIndentationPlugin'; import TreeViewPlugin from "./plugins/TreeViewPlugin"; import ToolbarPlugin from "./plugins/ToolbarPlugin"; import { HeadingNode, QuoteNode } from "@lexical/rich-text"; import { TableCellNode, TableNode, TableRowNode } from "@lexical/table"; import { ListItemNode, ListNode } from "@lexical/list"; import { CodeHighlightNode, CodeNode } from "@lexical/code"; import { AutoLinkNode, LinkNode } from "@lexical/link"; // import {ClickableLinkPlugin} from '@lexical/react/LexicalClickableLinkPlugin'; import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin"; import { ListPlugin } from "@lexical/react/LexicalListPlugin"; import { MarkdownShortcutPlugin } from "@lexical/react/LexicalMarkdownShortcutPlugin"; import {HorizontalRulePlugin} from '@lexical/react/LexicalHorizontalRulePlugin'; import {HorizontalRuleNode} from '@lexical/react/LexicalHorizontalRuleNode'; import { TRANSFORMERS } from "@lexical/markdown"; import ListMaxIndentLevelPlugin from "./plugins/ListMaxIndentLevelPlugin"; import CodeHighlightPlugin from "./plugins/CodeHighlightPlugin"; import AutoLinkPlugin from "./plugins/AutoLinkPlugin"; import TabFocusPlugin from './plugins/TabFocusPlugin'; import EditorRefPlugin from './plugins/EditorRefPlugin' import ImagesPlugin from './plugins/ImagesPlugin'; import InlineImagePlugin from './plugins/InlineImagePlugin'; import { ImageNode } from './nodes/ImageNode'; import {InlineImageNode} from './nodes/InlineImageNode/InlineImageNode'; import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'; // import { useLexicalEditable } from '@lexical/react/useLexicalEditable'; import {TablePlugin} from '@lexical/react/LexicalTablePlugin'; import {useLexicalEditable} from '@lexical/react/useLexicalEditable'; import { $getRoot, $getSelection, $createParagraphNode } from 'lexical'; import { $generateHtmlFromNodes, $generateNodesFromDOM, } from '@lexical/html'; // import { } from '@lexical/clipboard'; import { isEmpty } from '@/utils/commons'; import './styles.css'; function Placeholder() { return
Enter some rich text...
; } const editorConfig = { // The editor theme // theme: {}, theme: ExampleTheme, // Handling of errors during update onError(error) { throw error; }, // Any custom nodes go here nodes: [ HeadingNode, ListNode, ListItemNode, QuoteNode, CodeNode, CodeHighlightNode, TableNode, TableCellNode, TableRowNode, AutoLinkNode, LinkNode, HorizontalRuleNode, ImageNode,InlineImageNode, ] }; function LexicalDefaultValuePlugin({ value = '' }= {}) { const [editor] = useLexicalComposerContext(); const updateHTML = (editor, value, clear) => { const root = $getRoot(); if (clear) { root.clear(); } if (isEmpty(value)) { root.clear(); } else { const parser = new DOMParser(); const dom = parser.parseFromString(value, "text/html"); const nodes = $generateNodesFromDOM(editor, dom); nodes.filter(n => n.__size !== 0).forEach((n) => { const paragraphNode = $createParagraphNode(); paragraphNode.append(n); root.append(paragraphNode); }); } }; useEffect(() => { if (editor) { editor.update(() => { updateHTML(editor, value, true); }); } }, [editor, value]); return null; } function MyOnChangePlugin({ ignoreHistoryMergeTagChange = true, ignoreSelectionChange = true, onChange }) { const [editor] = useLexicalComposerContext(); useEffect(() => { if (typeof onChange === 'function') { return editor.registerUpdateListener(({editorState, dirtyElements, dirtyLeaves, prevEditorState, tags}) => { if ( (ignoreSelectionChange && dirtyElements.size === 0 && dirtyLeaves.size === 0) || (ignoreHistoryMergeTagChange && tags.has('history-merge')) || prevEditorState.isEmpty() ) { return; } editorState.read(() => { const root = $getRoot(); const textContent = root.getTextContent(); const html = $generateHtmlFromNodes(editor); onChange({ editorStateJSON: editorState.toJSON(), editor, tags, htmlContent: html, textContent }); }); }); } }, [editor, ignoreHistoryMergeTagChange, ignoreSelectionChange, onChange]); return null; } export default function Editor({ isRichText, isDebug, editorRef, onChange, defaultValue, stateJson, ...props }) { return (
{isRichText && }
{/* */} {isRichText ? ( } placeholder={} ErrorBoundary={LexicalErrorBoundary} /> ) : ( } ErrorBoundary={LexicalErrorBoundary} /> )} {(import.meta.env.DEV && isDebug) && }
); }