Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions assets/typeset-preview.js
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,15 @@ app = rx.App(
}
}

// On SPA re-navigation React remounts the selects at their defaults; pull
// the persisted state back into them before re-rendering.
function syncAll() {
if (!ensureDefaults()) return;
syncSelectsToState();
applyAll();
renderCodeBlocks();
}

window.typesetPreview = {
state: state,
applyAll: applyAll,
Expand All @@ -269,6 +278,7 @@ app = rx.App(
getThemeTokensCode: getThemeTokensCode,
getUsageCode: getUsageCode,
renderCodeBlocks: renderCodeBlocks,
syncAll: syncAll,
};

document.addEventListener("change", function (e) {
Expand Down
3 changes: 1 addition & 2 deletions native/pages/typeset.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,7 @@ def typeset_page():
flow: {json.dumps(FLOW_OPTIONS)},
}};
if (window.typesetPreview) {{
window.typesetPreview.applyAll();
window.typesetPreview.renderCodeBlocks();
window.typesetPreview.syncAll();
}}
"""
),
Expand Down
35 changes: 35 additions & 0 deletions tests/test_typeset_sync.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""Regression: /typeset on_mount must sync remounted selects to persisted state."""

import pathlib
import re

from native.pages.typeset import typeset_page

JS = (pathlib.Path(__file__).parent.parent / "assets" / "typeset-preview.js").read_text(
encoding="utf-8",
)


def _on_mount_scripts() -> list[str]:
chain = typeset_page().event_triggers["on_mount"]
scripts = []
for event in chain.events:
for name_var, val_var in event.args:
if getattr(name_var, "_js_expr", None) == "javascript_code":
scripts.append(val_var._var_value)
break
return scripts


def test_on_mount_calls_sync_all() -> None:
init = _on_mount_scripts()[0]
assert "typesetPreview.syncAll()" in init
assert "typesetPreview.applyAll()" not in init


def test_sync_all_exported_and_syncs_selects() -> None:
assert re.search(r"window\.typesetPreview\s*=\s*\{[^}]*\bsyncAll:\s*syncAll", JS)
body = re.search(r"function syncAll\(\)\s*\{(.*?)\n \}", JS, re.S)
assert body
b = body.group(1)
assert b.index("syncSelectsToState()") < b.index("applyAll()") < b.index("renderCodeBlocks()")