summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHaishan <[email protected]>2018-10-30 22:29:36 +0800
committerHaishan <[email protected]>2018-10-30 22:29:36 +0800
commitd247e37890de06b17da34646c0fe227a9b6ef2a6 (patch)
tree4913f0d1ca0b7783e5d23843da232b7da39ab4d6 /src
parent59cee786211114e6393f6218a040e2032d0000c7 (diff)
refactor: use react hooks
Diffstat (limited to 'src')
-rw-r--r--src/api/logs.js14
-rw-r--r--src/components/Logs.js114
-rw-r--r--src/components/TrafficChart.js51
3 files changed, 75 insertions, 104 deletions
diff --git a/src/api/logs.js b/src/api/logs.js
index 779a5b4..a9d358b 100644
--- a/src/api/logs.js
+++ b/src/api/logs.js
@@ -26,7 +26,7 @@ let even = false;
const store = {
logs: [],
size: Size,
- updateCallback: null,
+ subscribers: [],
appendData(o) {
const now = new Date();
const time = now.toLocaleString('zh-Hans');
@@ -36,8 +36,16 @@ const store = {
o.even = even = !even;
this.logs.unshift(o);
if (this.logs.length > this.size) this.logs.pop();
- // TODO consider throttle this
- if (this.updateCallback) this.updateCallback();
+ this.subscribers.forEach(f => f(o));
+ },
+
+ subscribe(listener) {
+ const me = this;
+ this.subscribers.push(listener);
+ return function unsubscribe() {
+ const idx = me.subscribers.indexOf(listener);
+ me.subscribers.splice(idx, 1);
+ };
}
};
diff --git a/src/components/Logs.js b/src/components/Logs.js
index e81ae99..74cdb33 100644
--- a/src/components/Logs.js
+++ b/src/components/Logs.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import cx from 'classnames';
@@ -18,78 +18,56 @@ const colors = {
error: '#c11c1c'
};
-class LogLine extends Component {
- static propTypes = {
- time: PropTypes.string,
- even: PropTypes.bool,
- type: PropTypes.string.isRequired,
- payload: PropTypes.string.isRequired
- };
-
- render() {
- const { time, type, payload, even } = this.props;
- const className = cx({ even });
- return (
- <li className={className}>
- <div className={s0.logMeta}>
- <div className={s0.logTime}>{time}</div>
- <div className={s0.logType} style={{ backgroundColor: colors[type] }}>
- {type}
- </div>
- <div className={s0.logText}>{payload}</div>
+function LogLine({ time, even, payload, type }) {
+ const className = cx({ even });
+ return (
+ <li className={className}>
+ <div className={s0.logMeta}>
+ <div className={s0.logTime}>{time}</div>
+ <div className={s0.logType} style={{ backgroundColor: colors[type] }}>
+ {type}
</div>
- </li>
- );
- }
+ <div className={s0.logText}>{payload}</div>
+ </div>
+ </li>
+ );
}
-class Logs extends Component {
- // static propTypes = {
- // isOpen: PropTypes.bool.isRequired,
- // onRequestClose: PropTypes.func.isRequired
- // };
- state = {
- logs: []
- };
-
- handle = null;
+LogLine.propTypes = {
+ time: PropTypes.string,
+ even: PropTypes.bool,
+ type: PropTypes.string.isRequired,
+ payload: PropTypes.string.isRequired
+};
- componentDidMount() {
- this.handle = fetchLogs();
- this.setState({ logs: this.handle.logs });
- this.handle.updateCallback = () => {
- this.setState({ logs: this.handle.logs });
- };
- }
+export default function Logs() {
+ const [logs, setLogs] = useState([]);
- componentWillUnmount() {
- this.handle.updateCallback = null;
- }
+ useEffect(() => {
+ const x = fetchLogs();
+ setLogs(x.logs);
+ return x.subscribe(() => setLogs(x.logs));
+ });
- render() {
- const { logs } = this.state;
- return (
- <div>
- <ContentHeader title="Logs" />
- {logs.length === 0 ? (
- <div className={s0.logPlaceholder}>
- <div>
- <Icon id={yacd.id} width={200} height={200} />
- </div>
- <div>No logs yet, hang tight...</div>
+ return (
+ <div>
+ <ContentHeader title="Logs" />
+ {logs.length === 0 ? (
+ <div className={s0.logPlaceholder}>
+ <div>
+ <Icon id={yacd.id} width={200} height={200} />
</div>
- ) : (
- <div className={s0.logs}>
- <ul className={s0.logUl}>
- {logs.map(l => (
- <LogLine key={l.id} {...l} />
- ))}
- </ul>
- </div>
- )}
- </div>
- );
- }
+ <div>No logs yet, hang tight...</div>
+ </div>
+ ) : (
+ <div className={s0.logs}>
+ <ul className={s0.logUl}>
+ {logs.map(l => (
+ <LogLine key={l.id} {...l} />
+ ))}
+ </ul>
+ </div>
+ )}
+ </div>
+ );
}
-
-export default Logs;
diff --git a/src/components/TrafficChart.js b/src/components/TrafficChart.js
index 6846031..f625d90 100644
--- a/src/components/TrafficChart.js
+++ b/src/components/TrafficChart.js
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import React, { useEffect } from 'react';
import Chart from 'chart.js/dist/Chart.min.js';
import prettyBytes from 'm/pretty-bytes';
@@ -107,26 +107,25 @@ const options = {
}
};
-class TrafficChart extends Component {
- traffic = {
- labels: [],
- up: [],
- down: []
- };
+const chartWrapperStyle = {
+ position: 'relative',
+ width: '90%'
+};
- componentDidMount() {
+export default function TrafficChart() {
+ useEffect(() => {
const ctx = document.getElementById('myChart').getContext('2d');
- this.traffic = fetchData();
+ const traffic = fetchData();
const data = {
- labels: this.traffic.labels,
+ labels: traffic.labels,
datasets: [
{
...upProps,
- data: this.traffic.up
+ data: traffic.up
},
{
...downProps,
- data: this.traffic.down
+ data: traffic.down
}
]
};
@@ -135,26 +134,12 @@ class TrafficChart extends Component {
data,
options
});
- this.unsubscribe = this.traffic.subscribe(() => c.update());
- }
-
- componentWillUnmount() {
- this.unsubscribe();
- }
+ return traffic.subscribe(() => c.update());
+ }, []);
- render() {
- return (
- <div>
- <div
- style={{
- position: 'relative',
- width: '90%'
- }}>
- <canvas id="myChart" />
- </div>
- </div>
- );
- }
+ return (
+ <div style={chartWrapperStyle}>
+ <canvas id="myChart" />
+ </div>
+ );
}
-
-export default TrafficChart;