|
1 | 1 | import React, { useEffect, useImperativeHandle, useRef } from 'react'; |
2 | | -import { EditorStateConfig, StateEffect } from '@codemirror/state'; |
| 2 | +import { EditorStateConfig } from '@codemirror/state'; |
3 | 3 | import { getDefaultExtensions } from '@uiw/react-codemirror'; |
4 | 4 | import { MergeView, MergeConfig, DirectMergeConfig } from '@codemirror/merge'; |
5 | 5 | import { useStore } from './store'; |
6 | 6 | import { CodeMirrorMergeProps } from './'; |
7 | | - |
| 7 | +import { EditorView, ViewUpdate } from '@codemirror/view'; |
8 | 8 | export interface InternalRef { |
9 | 9 | container?: HTMLDivElement | null; |
10 | 10 | view?: MergeView; |
@@ -48,28 +48,46 @@ export const Internal = React.forwardRef<InternalRef, CodeMirrorMergeProps>((pro |
48 | 48 | [editor, view, modified, original, opts], |
49 | 49 | ); |
50 | 50 |
|
| 51 | + const originalUpdateListener = EditorView.updateListener.of((vu: ViewUpdate) => { |
| 52 | + if (vu.docChanged && typeof originalExtension?.onChange === 'function') { |
| 53 | + const doc = vu.state.doc; |
| 54 | + const val = doc.toString(); |
| 55 | + originalExtension?.onChange(val, vu); |
| 56 | + } |
| 57 | + }); |
| 58 | + |
| 59 | + const modifiedUpdateListener = EditorView.updateListener.of((vu: ViewUpdate) => { |
| 60 | + if (vu.docChanged && typeof modifiedExtension?.onChange === 'function') { |
| 61 | + const doc = vu.state.doc; |
| 62 | + const val = doc.toString(); |
| 63 | + modifiedExtension?.onChange(val, vu); |
| 64 | + } |
| 65 | + }); |
| 66 | + |
51 | 67 | useEffect(() => { |
52 | | - if (!view.current && editor.current) { |
| 68 | + if (!view.current && editor.current && originalExtension && modifiedExtension) { |
53 | 69 | view.current = new MergeView({ |
54 | 70 | a: { |
55 | 71 | ...original, |
56 | 72 | extensions: [ |
57 | 73 | ...(originalExtension?.extension || []), |
58 | 74 | ...getDefaultExtensions({ ...originalExtension?.option, theme }), |
| 75 | + originalUpdateListener, |
59 | 76 | ], |
60 | 77 | }, |
61 | 78 | b: { |
62 | 79 | ...modified, |
63 | 80 | extensions: [ |
64 | 81 | ...(modifiedExtension?.extension || []), |
65 | 82 | ...getDefaultExtensions({ ...modifiedExtension?.option, theme }), |
| 83 | + modifiedUpdateListener, |
66 | 84 | ], |
67 | 85 | }, |
68 | 86 | parent: editor.current, |
69 | 87 | ...opts, |
70 | 88 | }); |
71 | 89 | } |
72 | | - }, [view, editor]); |
| 90 | + }, [view, editor, originalExtension, modifiedExtension]); |
73 | 91 |
|
74 | 92 | useEffect(() => { |
75 | 93 | if (original && original.doc && view.current) { |
|
0 commit comments