You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
1.9 KiB
JavaScript

"use strict";
const Promise = require("bluebird");
const React = require("react");
const ReactDOM = require("react-dom");
const documentReadyPromise = require("document-ready-promise");
const axios = require("axios");
// The below require path is a placeholder, filled out at build time, using aliasify (see the budo-express config)
const DisplayComponent = require("__internal_display_component");
const Error = require("./error.jsx");
const Running = require("./running.jsx");
function Root() {
let [ data, setData ] = React.useState(null);
let [ error, setError ] = React.useState(null);
let [ running, setRunning ] = React.useState(true);
function processData(incomingData) {
if (incomingData.type === "error") {
setRunning(false);
setError(incomingData.payload);
} else if (incomingData.type === "output") {
setRunning(false);
setError(null);
setData(incomingData.payload);
} else if (incomingData.type === "running") {
setRunning(true);
}
}
React.useEffect(() => {
let eventReceived = false;
let eventStream = new EventSource("/stream");
eventStream.addEventListener("message", (event) => {
eventReceived = true;
processData(JSON.parse(event.data));
});
Promise.try(() => {
return axios.get("/initial_data");
}).then((response) => {
if (!eventReceived) {
processData(response.data);
}
});
return function cleanup() {
eventStream.close();
}
}, []);
if (data != null) {
return (<>
{(error != null)
? <Error {... error} />
: null
}
{(running === true)
? <Running />
: null
}
<DisplayComponent data={data} />
</>);
} else {
if (error == null) {
return "Loading initial data, please wait...";
} else {
return <Error {... error} />;
}
}
}
Promise.try(() => {
return documentReadyPromise();
}).then(() => {
ReactDOM.render(<Root />, document.getElementById("render"));
});