import React, { Component } from "react"
import { Card, Button, Popover, Select, Divider, Input, Form, Col, Row, Checkbox, Space } from "antd"
import {
listSlaves,
listInstances,
startInstance,
stopInstance,
setInstanceOutputSubscriptions,
deleteInstance,
assignInstance,
createSave,
getInstanceConfig,
setInstanceConfigField,
sendRcon,
} from "../../util/wslink"
import DataTable from "../../components/data-table"
import notify from "../../util/notify"
import DeleteOutlined from "@ant-design/icons/DeleteOutlined"
import EditOutlined from "@ant-design/icons/EditOutlined"
import PlusOutlined from "@ant-design/icons/PlusOutlined"
const { Option } = Select
export class InstanceView extends Component {
constructor(props) {
super(props)
this.state = {
instance: {},
slaves: [],
logLines: [{ message: "Logviewer. Follows the latest logs if you scroll to the bottom. Does not store logs past the lifetime of this tab" }],
}
this.messagesEndRef = React.createRef()
}
navigate(url) {
this.props.history.push(url);
}
async componentDidMount() {
let id = this.props.match.params.id
await this.getData()
await setInstanceOutputSubscriptions({
instance_id: Number(id),
})
window.instanceOutputEventHandler = ({ instance_id, output }) => {
if (instance_id === Number(id)) {
this.setState({
logLines: [...this.state.logLines, output],
})
}
// Automatically scroll to bottom on new line.
// this.messagesEndRef.current.scrollIntoView({ behavior: 'smooth' })
}
}
async getData() {
let id = this.props.match.params.id
let instances = await listInstances()
let slaves = await listSlaves()
this.setState({
instance: instances.find(x => x.id === Number(id)),
slaves,
})
let config = await getInstanceConfig({ instance_id: Number(id) })
console.log(config)
this.setState({
config
})
}
async start() {
this.setState({
starting: true,
})
try {
await startInstance({
instance_id: this.state.instance.id,
save: null,
})
} catch (e) {
notify("Error starting instance", "error", e.message)
return this.setState({
starting: false,
})
}
notify("Instance started")
this.setState({
starting: false,
})
this.getData()
}
async stop() {
this.setState({
stopping: true,
})
try {
await stopInstance({
instance_id: this.state.instance.id,
})
} catch (e) {
notify("Error stopping instance", "error", e.message)
return this.setState({
stopping: false,
})
}
notify("Instance stopped")
this.setState({
stopping: false,
})
this.getData()
}
async createSave() {
this.setState({
creatingSave: true,
})
try {
await createSave({
instance_id: this.state.instance.id,
})
} catch (e) {
notify("Error creating save", "error", e.message)
return this.setState({
creatingSave: false,
})
}
notify("Save created", "success")
this.setState({
creatingSave: false,
})
}
async onConfigEditFinish(values) {
console.log("Completed config edit with", values)
for (let k in values) {
if (values[k] !== this.getInstanceConfigAsKvObject(this.state.config)[k]) {
let value = values[k]
if (typeof value === "boolean") value = value.toString()
console.log("Setting", k, value)
await setInstanceConfigField({
instance_id: this.state.instance.id,
field: k,
value: value,
})
}
}
notify("Set configuration fields", "success")
this.setState({
editingConfig: false
})
this.getData()
}
render() {
console.log(this.state)
let { instance, slaves } = this.state
let slave = slaves && slaves.find(x => x.id === instance.assigned_slave);
return ID: {instance.id} Slave: {slave && slave.name} {item.time} {item.level} {item.file}: {item.message}{instance.name}
>)} */}
{console.log(group)}
{Object.keys(group.fields).map(field =>