import React from "react"; import { observer } from "mobx-react"; import { Icon } from "eez-studio-ui/icon"; import { IconAction } from "eez-studio-ui/action"; import { Loader } from "eez-studio-ui/loader"; import { ProjectContext } from "project-editor/project/context"; import { dockerBuildState } from "./docker-build-state"; //////////////////////////////////////////////////////////////////////////////// export const DockerSimulatorPreviewPanel = observer( class DockerSimulatorPreviewPanel extends React.Component { static contextType = ProjectContext; declare context: React.ContextType; iframeRef = React.createRef(); private messageHandler: ((event: MessageEvent) => void) | null = null; componentDidMount() { // Listen for console messages from the iframe this.messageHandler = (event: MessageEvent) => { if (event.data && event.data.type === "console") { const projectState = dockerBuildState.getProjectState( this.context?.filePath ); projectState.addPreviewLog( event.data.level || "log", event.data.message ); } }; window.addEventListener("message", this.messageHandler); } componentWillUnmount() { if (this.messageHandler) { window.removeEventListener("message", this.messageHandler); } } get projectState() { return dockerBuildState.getProjectState(this.context?.filePath); } handleRefresh = () => { const projectState = this.projectState; if (this.iframeRef.current && projectState.previewUrl) { this.iframeRef.current.src = projectState.previewUrl; } }; render() { const projectState = this.projectState; const isOutOfDate = projectState.hasProjectChangedSinceBuild( this.context?.lastRevisionStable ); return (
{projectState.state === "running" && (
)} {projectState.state === "running" && isOutOfDate && (
Preview may be out of date. Rebuild to see latest changes.
)}
{projectState.state === "idle" && (

Click "Run in Full Simulator" to start

)} {projectState.state === "building" && (

Building...

{projectState.buildPhase}

)} {projectState.state === "error" && (

Build Failed

{projectState.errorMessage}

)} {projectState.state === "running" && projectState.previewUrl && (