Просмотр исходного кода

fix: Preserve Vim insert mode state by using ref for onSave in keymap extension

Shun Miyazawa 2 месяцев назад
Родитель
Сommit
b375e03c9a
1 измененных файлов с 13 добавлено и 3 удалено
  1. 13 3
      packages/editor/src/client/stores/use-editor-settings.ts

+ 13 - 3
packages/editor/src/client/stores/use-editor-settings.ts

@@ -1,4 +1,4 @@
-import { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useRef, useState } from 'react';
 import type { Extension } from '@codemirror/state';
 import type { Extension } from '@codemirror/state';
 import { Prec } from '@codemirror/state';
 import { Prec } from '@codemirror/state';
 import {
 import {
@@ -93,12 +93,22 @@ const useKeymapExtension = (
     undefined,
     undefined,
   );
   );
 
 
+  // Use ref for onSave to prevent keymap extension recreation on callback changes
+  // This is critical for Vim mode to preserve insert mode state
+  const onSaveRef = useRef(onSave);
+  useEffect(() => {
+    onSaveRef.current = onSave;
+  }, [onSave]);
+
   useEffect(() => {
   useEffect(() => {
     const settingKeyMap = async (name?: KeyMapMode) => {
     const settingKeyMap = async (name?: KeyMapMode) => {
-      setKeymapExtension(await getKeymap(name, onSave));
+      // Pass a stable wrapper function that delegates to the ref
+      const stableOnSave =
+        onSaveRef.current != null ? () => onSaveRef.current?.() : undefined;
+      setKeymapExtension(await getKeymap(name, stableOnSave));
     };
     };
     settingKeyMap(keymapMode);
     settingKeyMap(keymapMode);
-  }, [keymapMode, onSave]);
+  }, [keymapMode]);
 
 
   useEffect(() => {
   useEffect(() => {
     if (keymapExtension == null) {
     if (keymapExtension == null) {