import React, { useState, useEffect, useRef } from "react"; import Typography from "@mui/material/Typography"; import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; import { Link as MuiLink } from "@mui/material"; import { Theme } from "@mui/material/styles"; import makeStyles from "@mui/styles/makeStyles"; import createStyles from "@mui/styles/createStyles"; import Box from "@mui/material/Box"; import { ITerminal, Output, Link } from "../ITerminal"; import { IRouter } from "../../ui/Router"; import { IPlayer } from "../../PersonObjects/IPlayer"; import { TerminalInput } from "./TerminalInput"; import { TerminalEvents, TerminalClearEvents } from "../TerminalEvents"; interface IActionTimerProps { terminal: ITerminal; } function ActionTimer({ terminal }: IActionTimerProps): React.ReactElement { return ( {terminal.getProgressText()} ); } const useStyles = makeStyles((theme: Theme) => createStyles({ nopadding: { padding: theme.spacing(0), }, preformatted: { whiteSpace: "pre-wrap", overflowWrap: "anywhere", margin: theme.spacing(0), }, list: { padding: theme.spacing(0), height: "100%", }, }), ); interface IProps { terminal: ITerminal; router: IRouter; player: IPlayer; } export function TerminalRoot({ terminal, router, player }: IProps): React.ReactElement { const scrollHook = useRef(null); const setRerender = useState(0)[1]; const [key, setKey] = useState(0); function rerender(): void { setRerender((old) => old + 1); } function clear(): void { setKey((key) => key + 1); } useEffect(() => TerminalEvents.subscribe(rerender), []); useEffect(() => TerminalClearEvents.subscribe(clear), []); function doScroll(): void { const hook = scrollHook.current; if (hook !== null) { setTimeout(() => hook.scrollIntoView(true), 50); } } doScroll(); useEffect(() => { setTimeout(doScroll, 50); }, []); const classes = useStyles(); return ( <> {terminal.outputHistory.map((item, i) => { if (item instanceof Output) return ( {item.text} ); if (item instanceof Link) return ( {item.dashes}>  terminal.connectToServer(player, item.hostname)} > {item.hostname} ); })} {terminal.action !== null && ( {" "} )}
); }