From c5a45131a54752e71394350db725c40a8410dfd6 Mon Sep 17 00:00:00 2001 From: Yuri Karamian Date: Fri, 19 Jun 2026 11:40:57 +0200 Subject: [PATCH] Fix editor not rendering on every other source mode switch --- src/lib/components/Editor.svelte | 57 ++++++++++++++++---------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/lib/components/Editor.svelte b/src/lib/components/Editor.svelte index d4a5bf4..62ca55b 100644 --- a/src/lib/components/Editor.svelte +++ b/src/lib/components/Editor.svelte @@ -4616,36 +4616,37 @@ // Only act if we have a loaded note if (!loadedPath) return; - if (isSource && !lastSourceMode) { - // Switching TO source: extract markdown from editor - sourceContent = editor ? editorToMarkdown() : ($activeNote?.content ?? ''); - resetSourceHistory(sourceContent); - lastSourceMode = true; - } else if (!isSource && lastSourceMode) { - lastSourceMode = false; - if (isMobile) { - // Mobile: editor stays in DOM, just update its content - const content = sourceContent || ($activeNote?.content ?? ''); - if (editor) { - ignoreNextUpdate = true; - editor.commands.setContent(markdownToHtml(content)); - } - } else { - // Desktop: destroy old editor, wait for DOM swap, then recreate. - destroyEditor(); - const content = sourceContent || ($activeNote?.content ?? ''); - tick().then(() => { - if (editorElement && !editor) { - createEditor(content); - } else if (!editor) { - // editorElement not ready yet — retry next frame - requestAnimationFrame(() => { - if (editorElement && !editor) createEditor(content); - }); + // untrack: prevent flushSave() (inside destroyEditor) from adding + // $editorDirty/$activeNote as effect dependencies, which causes + // the effect to re-run and race with tick().then() — resulting in + // the editor failing to render on every other source-mode switch. + untrack(() => { + if (isSource && !lastSourceMode) { + // Switching TO source: extract markdown from editor + sourceContent = editor ? editorToMarkdown() : ($activeNote?.content ?? ''); + resetSourceHistory(sourceContent); + lastSourceMode = true; + } else if (!isSource && lastSourceMode) { + lastSourceMode = false; + if (isMobile) { + // Mobile: editor stays in DOM, just update its content + const content = sourceContent || ($activeNote?.content ?? ''); + if (editor) { + ignoreNextUpdate = true; + editor.commands.setContent(markdownToHtml(content)); } - }); + } else { + // Desktop: destroy old editor, wait for DOM swap, then recreate. + destroyEditor(); + const content = sourceContent || ($activeNote?.content ?? ''); + tick().then(() => { + if (editorElement && !editor) { + createEditor(content); + } + }); + } } - } + }); }); // Tauri drag-drop listener for OS file drops (browser DragEvent doesn't have files in Tauri)