-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
LexicalOnChangePlugin.ts
50 lines (44 loc) · 1.35 KB
/
LexicalOnChangePlugin.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 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 type {EditorState, LexicalEditor} from 'lexical';
import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
import useLayoutEffect from 'shared/useLayoutEffect';
export function OnChangePlugin({
ignoreHistoryMergeTagChange = true,
ignoreSelectionChange = false,
onChange,
}: {
ignoreHistoryMergeTagChange?: boolean;
ignoreSelectionChange?: boolean;
onChange: (
editorState: EditorState,
editor: LexicalEditor,
tags: Set<string>,
) => void;
}): null {
const [editor] = useLexicalComposerContext();
useLayoutEffect(() => {
if (onChange) {
return editor.registerUpdateListener(
({editorState, dirtyElements, dirtyLeaves, prevEditorState, tags}) => {
if (
(ignoreSelectionChange &&
dirtyElements.size === 0 &&
dirtyLeaves.size === 0) ||
(ignoreHistoryMergeTagChange && tags.has('history-merge')) ||
prevEditorState.isEmpty()
) {
return;
}
onChange(editorState, editor, tags);
},
);
}
}, [editor, ignoreHistoryMergeTagChange, ignoreSelectionChange, onChange]);
return null;
}