diff --git a/src/renderer/components/ScriptsView/ScriptsView.tsx b/src/renderer/components/ScriptsView/ScriptsView.tsx index c0e0a01..996be30 100644 --- a/src/renderer/components/ScriptsView/ScriptsView.tsx +++ b/src/renderer/components/ScriptsView/ScriptsView.tsx @@ -60,6 +60,9 @@ export const ScriptsView: React.FC = ({ scriptId }) => { const [isCheckingSyntax, setIsCheckingSyntax] = useState(false); const editorRef = useRef(null); const monacoRef = useRef(null); + // Token incremented to signal Monaco to remount with fresh defaultValue. + // Prevents controlled-mode cursor jumps during typing. + const [monacoResetToken, setMonacoResetToken] = useState(0); const buildCacheKey = (scriptMeta: Pick, content: string): string => { let hash = 0; @@ -203,6 +206,7 @@ export const ScriptsView: React.FC = ({ scriptId }) => { setAvailableEntrypoints(['main']); setEnabled(true); setScriptContent(''); + setMonacoResetToken(prev => prev + 1); setIsSlugManuallyEdited(false); return; } @@ -217,6 +221,7 @@ export const ScriptsView: React.FC = ({ scriptId }) => { setAvailableEntrypoints(['main']); setEnabled(true); setScriptContent(''); + setMonacoResetToken(prev => prev + 1); setIsSlugManuallyEdited(false); return; } @@ -228,6 +233,7 @@ export const ScriptsView: React.FC = ({ scriptId }) => { setEntrypoint(item.entrypoint || 'render'); setEnabled(item.enabled ?? true); setScriptContent(item.content || ''); + setMonacoResetToken(prev => prev + 1); const normalizedExisting = toFunctionSlug(item.slug || item.title || ''); setIsSlugManuallyEdited(normalizedExisting !== toFunctionSlug(item.title || '')); await refreshEntrypoints(item.content || '', item); @@ -520,10 +526,11 @@ export const ScriptsView: React.FC = ({ scriptId }) => {
setScriptContent(value || '')} onMount={handleEditorDidMount} options={{ diff --git a/tests/renderer/components/ScriptsView.test.tsx b/tests/renderer/components/ScriptsView.test.tsx index 100879d..a4f440a 100644 --- a/tests/renderer/components/ScriptsView.test.tsx +++ b/tests/renderer/components/ScriptsView.test.tsx @@ -13,6 +13,7 @@ const setModelMarkersMock = vi.fn(); vi.mock('@monaco-editor/react', () => ({ default: (props: { value?: string; + defaultValue?: string; onChange?: (value?: string) => void; language?: string; onMount?: (editor: unknown, monaco: unknown) => void; @@ -34,7 +35,7 @@ vi.mock('@monaco-editor/react', () => ({ return (