import React, { useEffect, useContext, useRef, useState } from "react";
import { Typography } from "antd";
import { libLink } from "@clusterio/lib";
import ControlContext from "./ControlContext";
const { Paragraph } = Typography;
function formatParsedOutput(parsed, key) {
let time = "";
if (parsed.format === "seconds") {
time = {parsed.time.padStart(8)} ;
} else if (parsed.format === "date") {
time = {parsed.time} ;
}
let info = "";
if (parsed.type === "log") {
let level = parsed.level;
if (level === "Script") {
level = {level};
} else if (level === "Verbose") {
level = {level};
} else if (level === "Info") {
level = {level};
} else if (parsed.level === "Warning") {
level = {level};
} else if (parsed.level === "Error") {
level = {level};
}
info = <>{level} {parsed.file}: >;
} else if (parsed.type === "action") {
info = <>[{parsed.action}] >;
}
return {time}{info}{parsed.message}
;
}
function formatLog(info, key) {
if (info.level === "server" && info.parsed) {
return formatParsedOutput(info.parsed, key);
}
let level = {info.level};
return [{level}] {info.message}
;
}
export default function InstanceConsole(props) {
let control = useContext(ControlContext);
let anchor = useRef();
let [pastLines, setPastLines] = useState([{"Loading past entries..."}
]);
let [lines, setLines] = useState([]);
useEffect(() => {
// Scroll view to the anchor so it sticks to the bottom
let parent = anchor.current.parentElement;
parent.scrollTop = parent.scrollHeight - parent.clientHeight;
libLink.messages.queryLog.send(control, {
all: false,
master: false,
slave_ids: [],
instance_ids: [props.id],
max_level: null,
limit: 400,
order: "desc",
}).then(result => {
setPastLines(result.log.map((info, index) => formatLog(info, index)).reverse());
}).catch(err => {
setPastLines([{`Error loading log: ${err.message}`}
]);
});
function logHandler(info) {
setLines(currentLines => currentLines.concat(
[formatLog(info, currentLines.length)]
));
}
control.onInstanceLog(props.id, logHandler);
return () => {
control.offInstanceLog(props.id, logHandler);
};
}, [props.id]);
return <>
{pastLines}
{lines}
>;
}