import { createRobotSaveRequest, ROBOT_SAVE_FIXTURE, RobotSaveResponse } from "./robot-save-facade.js"; declare global { interface Window { __freecadRobotSaveState: { stage: string; requestId: string | null; response: RobotSaveResponse | null; workerMessages: number } } } const root = document.querySelector("#app")!; root.innerHTML = `
FCFreeCAD 1.2 WebRobot save/reopen
R

Save and reopen

Starting worker
`; const style = document.createElement("style"); style.textContent = `:root{color-scheme:dark;font-family:system-ui;background:#10171d;color:#e7edf3}*{box-sizing:border-box}body{margin:0;min-width:320px}header{display:flex;gap:18px;padding:16px 22px;background:#18242d;border-bottom:1px solid #33434e}header b{background:#3f9aa8;color:#081217;padding:7px 9px;border-radius:5px}header strong{margin-left:auto}section{display:grid;grid-template-columns:270px 1fr 300px;min-height:calc(100vh - 58px)}aside{padding:22px;background:#18242d;border-right:1px solid #33434e}section>aside:last-child{border-left:1px solid #33434e;border-right:0}h2{font-size:12px;color:#a4bdc6;text-transform:uppercase}aside p{font-size:13px;color:#b4c5cc}.stage{display:flex;flex-direction:column;justify-content:center;align-items:center;background:#0e141a}.mark{width:128px;height:128px;display:grid;place-items:center;border:1px solid #67b4c3;color:#9ee3e7;font-size:42px;font-weight:700}#status{margin-top:22px;color:#a4bdc6}#status[data-level=error]{color:#ff9d9d}#status[data-level=ok]{color:#9ce0bd}dl{margin:0}dl div{display:flex;justify-content:space-between;border-bottom:1px solid #33434e;padding:11px 0}dd{margin:0;max-width:190px;overflow-wrap:anywhere}button{margin:18px 4px 0;padding:8px 12px;background:#22323d;border:1px solid #50616b;border-radius:4px;color:#e6edf3}@media(max-width:820px){section{grid-template-columns:1fr}section>aside:first-child{display:none}.stage{min-height:58vh}}`; document.head.append(style); const status = document.querySelector("#status")!, type = document.querySelector("#type")!, axis = document.querySelector("#axis")!, size = document.querySelector("#size")!, request = document.querySelector("#request")!, run = document.querySelector("#run")!, error = document.querySelector("#error")!, reset = document.querySelector("#reset")!, worker = new Worker(new URL("./robot-save.worker.ts", import.meta.url), { type: "module" }); let sequence = 0; window.__freecadRobotSaveState = { stage: "starting", requestId: null, response: null, workerMessages: 0 }; const setStatus = (value: string, level = "normal") => { status.textContent = value; status.dataset.level = level; }; worker.onmessage = (event: MessageEvent) => { const state = window.__freecadRobotSaveState; state.workerMessages++; const message = event.data; if (message.kind === "ready") { state.stage = "ready"; run.disabled = false; error.disabled = false; reset.disabled = false; setStatus("Worker ready", "ok"); return; } if (message.kind === "reset") { state.stage = "reset"; state.requestId = message.requestId; state.response = null; setStatus("State reset", "ok"); return; } state.response = message; state.requestId = message.requestId; request.textContent = message.requestId; if (message.kind === "error") { state.stage = message.error.code === "invalid_path" ? "expected-error" : "error"; setStatus(message.error.code, state.stage === "expected-error" ? "ok" : "error"); return; } state.stage = "success"; type.textContent = message.result.objectType; axis.textContent = `${message.result.axis1} / ${message.result.axis2}`; size.textContent = String(message.result.size); setStatus("Robot FCStd round-trip complete", "ok"); }; worker.onerror = event => setStatus(`Worker error: ${event.message}`, "error"); run.onclick = () => worker.postMessage(createRobotSaveRequest(`robot-save-chrome-${++sequence}`)); error.onclick = () => worker.postMessage(createRobotSaveRequest(`robot-save-error-${++sequence}`, { ...ROBOT_SAVE_FIXTURE, path: "/tmp/Missing.invalid" })); reset.onclick = () => worker.postMessage({ kind: "reset", requestId: `robot-save-reset-${++sequence}` });