reiji-h 2 лет назад
Родитель
Сommit
bd323194a5

+ 4 - 0
packages/editor/src/services/codemirror-editor/use-codemirror-editor/use-codemirror-editor.ts

@@ -13,6 +13,7 @@ import { useFocus, type Focus } from './utils/focus';
 import { useGetDoc, type GetDoc } from './utils/get-doc';
 import { useInitDoc, type InitDoc } from './utils/init-doc';
 import { useInsertText, type InsertText } from './utils/insert-text';
+import { useReplaceText, type ReplaceText } from './utils/replace-text';
 import { useSetCaretLine, type SetCaretLine } from './utils/set-caret-line';
 
 type UseCodeMirrorEditorUtils = {
@@ -22,6 +23,7 @@ type UseCodeMirrorEditorUtils = {
   focus: Focus,
   setCaretLine: SetCaretLine,
   insertText: InsertText,
+  replaceText: ReplaceText,
 }
 export type UseCodeMirrorEditor = {
   state: EditorState | undefined;
@@ -60,6 +62,7 @@ export const useCodeMirrorEditor = (props?: UseCodeMirror): UseCodeMirrorEditor
   const focus = useFocus(view);
   const setCaretLine = useSetCaretLine(view);
   const insertText = useInsertText(view);
+  const replaceText = useReplaceText(view);
 
   return {
     state,
@@ -70,5 +73,6 @@ export const useCodeMirrorEditor = (props?: UseCodeMirror): UseCodeMirrorEditor
     focus,
     setCaretLine,
     insertText,
+    replaceText,
   };
 };

+ 12 - 3
packages/editor/src/services/codemirror-editor/use-codemirror-editor/utils/insert-text.ts

@@ -7,9 +7,18 @@ export type InsertText = (text: string) => void;
 export const useInsertText = (view?: EditorView): InsertText => {
 
   return useCallback((text) => {
-    view?.dispatch(
-      view?.state.replaceSelection(text),
-    );
+    if (view == null) {
+      return;
+    }
+    const insertPos = view.state.selection.main.head;
+    view.dispatch({
+      changes: {
+        from: insertPos,
+        to: insertPos,
+        insert: text,
+      },
+      selection: { anchor: insertPos },
+    });
   }, [view]);
 
 };

+ 15 - 0
packages/editor/src/services/codemirror-editor/use-codemirror-editor/utils/replace-text.ts

@@ -0,0 +1,15 @@
+import { useCallback } from 'react';
+
+import { EditorView } from '@codemirror/view';
+
+export type ReplaceText = (text: string) => void;
+
+export const useReplaceText = (view?: EditorView): ReplaceText => {
+
+  return useCallback((text) => {
+    view?.dispatch(
+      view?.state.replaceSelection(text),
+    );
+  }, [view]);
+
+};