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";
import _ from "lodash";
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 && (
{" "}
)}
>
);
}