From b6e07f57800faee93636da109a2fcde0ab03227c Mon Sep 17 00:00:00 2001 From: Luc Mcgrady Date: Fri, 3 Oct 2025 02:14:24 +0100 Subject: [PATCH] pycmd relay example --- ts/routes/reviewer-inner/index.ts | 5 +++++ ts/routes/reviewer/reviewer.ts | 24 +++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ts/routes/reviewer-inner/index.ts b/ts/routes/reviewer-inner/index.ts index 7b9645d9d..7bd319339 100644 --- a/ts/routes/reviewer-inner/index.ts +++ b/ts/routes/reviewer-inner/index.ts @@ -34,3 +34,8 @@ addEventListener("message", (e) => { const base = document.createElement("base"); base.href = "/"; document.head.appendChild(base); + +function pycmd(cmd: string) { + window.parent.postMessage({ type: "pycmd", value: cmd }, "*"); +} +globalThis.pycmd = pycmd; diff --git a/ts/routes/reviewer/reviewer.ts b/ts/routes/reviewer/reviewer.ts index 19f0c2334..f80c4e081 100644 --- a/ts/routes/reviewer/reviewer.ts +++ b/ts/routes/reviewer/reviewer.ts @@ -19,26 +19,32 @@ export function setupReviewer(iframe: HTMLIFrameElement) { } function onReady() { + // TODO This should probably be a "ready" command now that it is part of the actual reviewer, + // Currently this depends on the reviewer component mounting after the bottom-reviewer which it should but seems hacky. + // Maybe use a counter with a counter.subscribe($counter == 2 then call("ready")) bridgeCommand("bottomReady"); iframe.contentWindow?.postMessage({ type: "nightMode", value: true }, "*"); } iframe?.addEventListener("load", onReady); - /* addEventListener("message", (e) => { + addEventListener("message", (e) => { switch (e.data.type) { - case "ready": - // TODO This should probably be a "ready" command now that it is part of the actual reviewer, - // Currently this depends on the reviewer component mounting after the bottom-reviewer which it should but seems hacky. - // Maybe use a counter with a counter.subscribe($counter == 2 then call("ready")) - bridgeCommand("bottomReady"); - iframe.contentWindow?.postMessage({ type: "nightMode", value: true }); + case "pycmd": { + const cmd = e.data.value as string; + if (cmd.startsWith("play:")) { + bridgeCommand(e.data.value); + } else { + console.error("pycmd command is either invalid or forbidden:", cmd); + } break; - default: + } + default: { console.warn(`Unknown message type: ${e.data.type}`); break; + } } - }); */ + }); globalThis._showAnswer = updateHtml; globalThis._showQuestion = showQuestion;