import { useState, useEffect, useRef } from "react"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import TextField from "@mui/material/TextField"; import Skeleton from "@mui/material/Skeleton"; import Typography from "@mui/material/Typography"; import RconSocket from "./RconSocket.js"; import "@mcl/css/rcon.css"; function RconLogSkeleton() { return ( ); } export default function RconView(props) { const { serverId } = props; const logsRef = useRef(0); const [cmd, setCmd] = useState(""); const [logs, setLogs] = useState([]); const [rcon, setRcon] = useState(); const updateCmd = (e) => setCmd(e.target.value); const disconnectRcon = () => { if (!rcon || typeof rcon.disconnect !== "function") return; rcon.disconnect(); }; useEffect( function () { if (!serverId) return; const rs = new RconSocket(setLogs, serverId); setRcon(rs); return disconnectRcon; }, [serverId], ); useEffect( () => logsRef.current.scrollTo(0, logsRef.current.scrollHeight), [(rcon ?? {}).logs], ); function sendCommand() { rcon.send(cmd); setCmd(""); } return ( {logs.length === 0 && [...Array(20).keys()].map((_v, i) => )} {logs.length > 0 && logs.map((v, k) => ( {v} ))} {rcon && rcon.rconLive && !rcon.rconError && ( )} {!(rcon && rcon.rconLive && !rcon.rconError) && ( )} ); }