import PauseIcon from "@mui/icons-material/Pause"; import PersonalVideoIcon from "@mui/icons-material/PersonalVideo"; import PlayArrowIcon from "@mui/icons-material/PlayArrow"; import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew"; import ReplayIcon from "@mui/icons-material/Replay"; import StopIcon from "@mui/icons-material/Stop"; import { CircularProgress, Typography } from "@mui/material"; import React from "react"; import { useNavigate } from "react-router-dom"; import { VMApi, VMInfo, VMState } from "../../api/VMApi"; import { useSnackbar } from "../../hooks/providers/SnackbarProvider"; import { StateActionButton } from "../StateActionButton"; export function VMStatusWidget(p: { vm: VMInfo; onChange?: (s: VMState) => void; }): React.ReactElement { const snackbar = useSnackbar(); const navigate = useNavigate(); const [state, setState] = React.useState(undefined); const refresh = async () => { try { const s = await VMApi.GetState(p.vm); if (s !== state) p.onChange?.(s); setState(s); } catch (e) { console.error(e); snackbar("Failed to refresh VM status!"); } }; const changedAction = () => setState(undefined); React.useEffect(() => { refresh(); const i = setInterval(() => refresh(), 3000); return () => clearInterval(i); }); if (state === undefined) return ( <> ); return (
{state} { /* VNC console */ p.vm.vnc_access && ( } tooltip="Graphical remote control over the VM" performAction={async () => navigate(p.vm.VNCURL)} onExecuted={() => {}} /> ) } {/* Start VM */} } tooltip="Start the Virtual Machine" performAction={() => VMApi.StartVM(p.vm)} onExecuted={changedAction} /> {/* Resume VM */} } tooltip="Resume the Virtual Machine" performAction={() => VMApi.ResumeVM(p.vm)} onExecuted={changedAction} /> {/* Suspend VM */} } tooltip="Suspend the Virtual Machine" confirmMessage="Do you really want to supsend this VM?" performAction={() => VMApi.SuspendVM(p.vm)} onExecuted={changedAction} /> {/* Shutdown VM */} } tooltip="Shutdown the Virtual Machine" confirmMessage="Do you really want to shutdown this VM?" performAction={() => VMApi.ShutdownVM(p.vm)} onExecuted={changedAction} /> {/* Kill VM */} } tooltip="Kill the Virtual Machine" confirmMessage="Do you really want to kill this VM? This could lead to data loss / corruption!" performAction={() => VMApi.KillVM(p.vm)} onExecuted={changedAction} /> {/* Reset VM */} } tooltip="Reset the Virtual Machine" confirmMessage="Do you really want to reset this VM?" performAction={() => VMApi.ResetVM(p.vm)} onExecuted={changedAction} />
); }