diff --git a/apps/builder/app/canvas/features/text-editor/text-editor.tsx b/apps/builder/app/canvas/features/text-editor/text-editor.tsx index c05c319680f3..95f5b9482360 100644 --- a/apps/builder/app/canvas/features/text-editor/text-editor.tsx +++ b/apps/builder/app/canvas/features/text-editor/text-editor.tsx @@ -8,6 +8,7 @@ import { $createLineBreakNode, $getSelection, $isRangeSelection, + type EditorState, } from "lexical"; import { LinkNode } from "@lexical/link"; import { LexicalComposer } from "@lexical/react/LexicalComposer"; @@ -15,7 +16,6 @@ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin"; import LexicalErrorBoundary from "@lexical/react/LexicalErrorBoundary"; import { HistoryPlugin } from "@lexical/react/LexicalHistoryPlugin"; -import { OnChangePlugin } from "@lexical/react/LexicalOnChangePlugin"; import { LinkPlugin } from "@lexical/react/LexicalLinkPlugin"; import { nanoid } from "nanoid"; import { createRegularStyleSheet } from "@webstudio-is/css-engine"; @@ -30,6 +30,7 @@ import { $convertTextToLexical, } from "./interop"; import { colord } from "colord"; +import { useEffectEvent } from "~/shared/hook-utils/effect-event"; const BindInstanceToNodePlugin = ({ refs }: { refs: Refs }) => { const [editor] = useLexicalComposerContext(); @@ -113,6 +114,29 @@ const CaretColorPlugin = () => { return null; }; +const OnChangeOnBlurPlugin = ({ + onChange, +}: { + onChange: (editorState: EditorState) => void; +}) => { + const [editor] = useLexicalComposerContext(); + const handleChange = useEffectEvent(onChange); + + useEffect(() => { + const handleBlur = () => { + handleChange(editor.getEditorState()); + }; + + // https://github.com/facebook/lexical/blob/867d449b2a6497ff9b1fbdbd70724c74a1044d8b/packages/lexical-react/src/LexicalNodeEventPlugin.ts#L59C12-L67C8 + return editor.registerRootListener((rootElement, prevRootElement) => { + rootElement?.addEventListener("blur", handleBlur); + prevRootElement?.removeEventListener("blur", handleBlur); + }); + }, [editor, handleChange]); + + return null; +}; + const RemoveParagaphsPlugin = () => { const [editor] = useLexicalComposerContext(); @@ -266,8 +290,8 @@ export const TextEditor = ({ /> - { editorState.read(() => { const treeRootInstance = instances.get(rootInstanceSelector[0]);