dashboard.html 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Loader Dashboard</title>
  7. <!-- Bootstrap CSS -->
  8. <link
  9. href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
  10. rel="stylesheet"
  11. />
  12. <!-- React + ReactDOM + Babel -->
  13. <script
  14. src="https://cdn.jsdelivr.net/npm/react@18/umd/react.development.js"
  15. crossorigin
  16. ></script>
  17. <script
  18. src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.development.js"
  19. crossorigin
  20. ></script>
  21. <script src="https://cdn.jsdelivr.net/npm/@babel/standalone/babel.min.js"></script>
  22. </head>
  23. <body>
  24. <div class="container mt-4">
  25. <h1>Loader Dashboard</h1>
  26. <div id="loader-controls"></div>
  27. <!-- React component will render here -->
  28. </div>
  29. <script type="text/babel">
  30. const { useState, useEffect } = React;
  31. function LoaderControls() {
  32. const [status, setStatus] = useState("idle");
  33. useEffect(() => {
  34. const interval = setInterval(async () => {
  35. const res = await fetch("/api/status");
  36. const data = await res.json();
  37. setStatus(data.loader_status);
  38. }, 1000);
  39. return () => clearInterval(interval);
  40. }, []);
  41. const startHoming = async () => {
  42. await fetch("/api/home", { method: "POST" });
  43. };
  44. const startLoader = async () => {
  45. await fetch("/api/start", { method: "POST" });
  46. };
  47. return (
  48. <div>
  49. <p>Status: {status}</p>
  50. <button onClick={startHoming} disabled={status === "homed"}>
  51. Homing
  52. </button>
  53. <button onClick={startLoader} disabled={status !== "homed"}>
  54. Start Automated Sequence
  55. </button>
  56. </div>
  57. );
  58. }
  59. const root = ReactDOM.createRoot(
  60. document.getElementById("loader-controls")
  61. );
  62. root.render(<LoaderControls />);
  63. </script>
  64. </body>
  65. </html>