Skip to content

Commit 912035a

Browse files
committed
fix(mdviewer): use separate rerender message to avoid resetting edit mode on file switch
Replaced inline markdown in MDVIEWR_SET_EDIT_MODE with a dedicated MDVIEWR_RERENDER_CONTENT message sent only when user switches to reader. Prevents edit mode from being reset during file switches.
1 parent 76e83b5 commit 912035a

3 files changed

Lines changed: 28 additions & 17 deletions

File tree

src-mdviewer/src/bridge.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ export function initBridge() {
147147
case "MDVIEWR_HIGHLIGHT_SELECTION":
148148
handleHighlightSelection(data);
149149
break;
150+
case "MDVIEWR_RERENDER_CONTENT":
151+
handleRerenderContent(data);
152+
break;
150153
}
151154
});
152155

@@ -596,16 +599,20 @@ function handleSetTheme(data) {
596599
}
597600

598601
function handleSetEditMode(data) {
599-
const { editMode, markdown } = data;
602+
const { editMode } = data;
600603
setState({ editMode });
604+
}
601605

602-
// When switching to reader, re-render from CM's current markdown
603-
// so all elements get fresh data-source-line attributes for cursor sync.
604-
if (!editMode && markdown) {
605-
const parseResult = parseMarkdownToHTML(markdown);
606-
setState({ currentContent: markdown, parseResult });
607-
emit("file:rendered", parseResult);
608-
}
606+
/**
607+
* Re-render content from CM's authoritative markdown.
608+
* Called when switching edit→reader so data-source-line attributes are accurate.
609+
*/
610+
function handleRerenderContent(data) {
611+
const { markdown } = data;
612+
if (!markdown) return;
613+
const parseResult = parseMarkdownToHTML(markdown);
614+
setState({ currentContent: markdown, parseResult });
615+
emit("file:rendered", parseResult);
609616
}
610617

611618

src-mdviewer/to-create-tests.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
- [ ] Content sync still works when cursor sync is disabled
4040
- [ ] Cursor sync toggle works in both reader and edit mode
4141
- [ ] Disabling cursor sync in reader mode prevents CM scroll on click
42+
- [ ] Cursor sync works on newly edited elements after edit→reader switch
43+
- [ ] Edit→reader switch re-renders from CM content (data-source-line attrs refreshed)
44+
- [ ] Switching MD files preserves current edit/reader mode
45+
- [ ] Edit mode not reset when switching between MD files
4246

4347
## Edit Mode & Entitlement Gating
4448
- [ ] Free user sees Edit button → clicking shows upsell dialog

src/extensionsIntegrated/Phoenix-live-preview/MarkdownSync.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,16 @@ define(function (require, exports, module) {
107107
_handleRedo();
108108
break;
109109
case "mdviewrEditModeChanged":
110-
// When switching to reader, send CM content back so the iframe
110+
// When switching to reader, send CM content so the iframe
111111
// can re-render with accurate data-source-line for cursor sync.
112112
if (!data.editMode && _doc) {
113-
setEditMode(false);
113+
const iframeWindow = _getIframeWindow();
114+
if (iframeWindow) {
115+
iframeWindow.postMessage({
116+
type: "MDVIEWR_RERENDER_CONTENT",
117+
markdown: _doc.getText()
118+
}, "*");
119+
}
114120
}
115121
break;
116122
case "mdviewrRequestEditMode":
@@ -711,13 +717,7 @@ define(function (require, exports, module) {
711717
}
712718
const iframeWindow = _getIframeWindow();
713719
if (iframeWindow) {
714-
const msg = { type: "MDVIEWR_SET_EDIT_MODE", editMode: editMode };
715-
// When switching to reader, include current CM content so the iframe
716-
// can re-render with accurate data-source-line attributes for cursor sync.
717-
if (!editMode && _doc) {
718-
msg.markdown = _doc.getText();
719-
}
720-
iframeWindow.postMessage(msg, "*");
720+
iframeWindow.postMessage({ type: "MDVIEWR_SET_EDIT_MODE", editMode: editMode }, "*");
721721
}
722722
}
723723

0 commit comments

Comments
 (0)