import * as React from 'react' import * as dayjs from 'dayjs' import { translate } from 'react-i18next' import { I18nProps } from '@models' import { Card, Header } from '@components' import './style.scss' import { StreamReader } from '@lib/streamer' import { getExternalControllerConfig, getConfig } from '@lib/request' interface Log { type: string payload: string, time: Date } interface LogsProps extends I18nProps {} interface LogsState { logs: Log[] } class Logs extends React.Component { state: LogsState = { logs: [] } private streamReader = null private listRef = React.createRef() async componentDidMount () { const externalController = await getExternalControllerConfig() const { data: config } = await getConfig() const logUrl = `http://${externalController.hostname}:${externalController.port}/logs?level=${config['log-level']}` this.streamReader = new StreamReader({ url: logUrl }) let logs = [] this.streamReader.subscribe('data', (data) => { logs = [].concat(this.state.logs, data.map(d => ({ ...d, time: new Date() }))) this.setState({ logs }, () => this.scrollToBottom()) }) } scrollToBottom = () => { const ul = this.listRef.current ul.scrollTop = ul.scrollHeight } render () { const { t } = this.props return (
    { this.state.logs.map( (log, index) => (
  • { dayjs(log.time).format('YYYY-MM-DD HH:mm:ss') } [{ log.type }] { log.payload }
  • ) ) }
) } } export default translate(['Logs'])(Logs)