From 16416f3d9e19f1f9849e9e929da0f7abb4a336f4 Mon Sep 17 00:00:00 2001 From: Irina Katsyuta Date: Tue, 17 Mar 2026 22:19:56 +0100 Subject: [PATCH 1/4] fix: restore cursor position --- .../app/src/features/MonakoEditor/MonacoEditor.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx index 221a81710..e8e6e593b 100644 --- a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx +++ b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx @@ -273,7 +273,20 @@ export const MonacoEditor = ({ if (!editor) return; if (editor.getValue() !== value) { + // Save the cursor position before calling setValue, because it resets the cursor to 0:0 + const position = editor.getPosition(); editor.setValue(value); + + if (position) { + const model = editor.getModel(); + if (!model) return; + + // Keep the cursor within valid bounds in case the new value is shorter than the previous one + const line = Math.min(position.lineNumber, model.getLineCount()); + const column = Math.min(position.column, model.getLineMaxColumn(line)); + + editor.setPosition({ lineNumber: line, column }); + } } }); From 2c80d1076c0a1e995a7a2aa0e9724997b768d3cf Mon Sep 17 00:00:00 2001 From: Irina Katsyuta Date: Tue, 17 Mar 2026 22:53:04 +0100 Subject: [PATCH 2/4] refactor: replace setValue --- .../features/MonakoEditor/MonacoEditor.tsx | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx index e8e6e593b..c3e244b0a 100644 --- a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx +++ b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx @@ -273,20 +273,15 @@ export const MonacoEditor = ({ if (!editor) return; if (editor.getValue() !== value) { - // Save the cursor position before calling setValue, because it resets the cursor to 0:0 - const position = editor.getPosition(); - editor.setValue(value); - - if (position) { - const model = editor.getModel(); - if (!model) return; - - // Keep the cursor within valid bounds in case the new value is shorter than the previous one - const line = Math.min(position.lineNumber, model.getLineCount()); - const column = Math.min(position.column, model.getLineMaxColumn(line)); - - editor.setPosition({ lineNumber: line, column }); - } + const model = editor.getModel(); + if (!model) return; + + // Update content without resetting cursor position + model.pushEditOperations( + [], + [{ range: model.getFullModelRange(), text: value }], + () => null, + ); } }); From 323894cf265c485f53a252587af25e0fe124f185 Mon Sep 17 00:00:00 2001 From: Irina Katsyuta Date: Sun, 22 Mar 2026 13:14:05 +0100 Subject: [PATCH 3/4] chore: set position before editing --- packages/app/src/features/MonakoEditor/MonacoEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx index c3e244b0a..0bc407308 100644 --- a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx +++ b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx @@ -278,7 +278,7 @@ export const MonacoEditor = ({ // Update content without resetting cursor position model.pushEditOperations( - [], + editor.getSelections(), [{ range: model.getFullModelRange(), text: value }], () => null, ); From 5a61d6c0f4e42ea019f26e91980ec3eba341eeb6 Mon Sep 17 00:00:00 2001 From: Irina Katsyuta Date: Sat, 25 Apr 2026 22:38:16 +0200 Subject: [PATCH 4/4] refactor: use layout effect --- .../src/features/MonakoEditor/MonacoEditor.tsx | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx index 0bc407308..1c3dd1a7e 100644 --- a/packages/app/src/features/MonakoEditor/MonacoEditor.tsx +++ b/packages/app/src/features/MonakoEditor/MonacoEditor.tsx @@ -4,6 +4,7 @@ import React, { Ref, useCallback, useEffect, + useLayoutEffect, useRef, useState, } from 'react'; @@ -268,22 +269,14 @@ export const MonacoEditor = ({ }, [isReadOnly]); // Update value - useEffect(() => { + useLayoutEffect(() => { const editor = editorRef.current; if (!editor) return; if (editor.getValue() !== value) { - const model = editor.getModel(); - if (!model) return; - - // Update content without resetting cursor position - model.pushEditOperations( - editor.getSelections(), - [{ range: model.getFullModelRange(), text: value }], - () => null, - ); + editor.setValue(value); } - }); + }, [value]); // Update config useEffect(() => {