Some progress on charts
This commit is contained in:
58
web/pages/components/chart.tsx
Normal file
58
web/pages/components/chart.tsx
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
import { LineChart, XAxis, YAxis, Line, Tooltip, Legend } from "recharts";
|
||||||
|
import { timeFormat } from "d3-time-format";
|
||||||
|
|
||||||
|
export default function Chart({ data, color, unit }) {
|
||||||
|
const CustomizedTooltip = (props) => {
|
||||||
|
const { active, payload } = props;
|
||||||
|
if (active && payload && payload[0]) {
|
||||||
|
const time = payload[0].payload
|
||||||
|
? timeFormat("%I:%M")(new Date(payload[0].payload.time), {
|
||||||
|
nearestTo: 1,
|
||||||
|
})
|
||||||
|
: "";
|
||||||
|
return (
|
||||||
|
<div className="custom-tooltip">
|
||||||
|
<p className="label">
|
||||||
|
<strong>{time}</strong> {payload[0].payload.value} %
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const timeFormatter = (tick) => {
|
||||||
|
return timeFormat("%I:%M")(new Date(tick), {
|
||||||
|
nearestTo: 1,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<LineChart width={1200} height={400} data={data}>
|
||||||
|
<XAxis
|
||||||
|
dataKey="time"
|
||||||
|
// type="number"
|
||||||
|
tickFormatter={timeFormatter}
|
||||||
|
interval="preserveStartEnd"
|
||||||
|
tickCount={5}
|
||||||
|
minTickGap={15}
|
||||||
|
domain={["dataMin", "dataMax"]}
|
||||||
|
/>
|
||||||
|
<YAxis
|
||||||
|
dataKey="value"
|
||||||
|
interval="preserveStartEnd"
|
||||||
|
unit={unit}
|
||||||
|
domain={["dataMin", "dataMax"]}
|
||||||
|
/>
|
||||||
|
<Tooltip content={<CustomizedTooltip />} />
|
||||||
|
<Legend />
|
||||||
|
<Line
|
||||||
|
type="monotone"
|
||||||
|
dataKey="value"
|
||||||
|
stroke={color}
|
||||||
|
dot={null}
|
||||||
|
strokeWidth={3}
|
||||||
|
/>
|
||||||
|
</LineChart>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,18 +1,14 @@
|
|||||||
import React, { useState, useEffect, useContext } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { timeFormat } from "d3-time-format";
|
||||||
import { HARDWARE_STATS, fetchData, FETCH_INTERVAL } from './utils/apis';
|
import { HARDWARE_STATS, fetchData, FETCH_INTERVAL } from './utils/apis';
|
||||||
import { BroadcastStatusContext } from './utils/broadcast-status-context';
|
import Chart from './components/chart.tsx'
|
||||||
|
|
||||||
export default function HardwareInfo() {
|
export default function HardwareInfo() {
|
||||||
const context = useContext(BroadcastStatusContext);
|
|
||||||
const { broadcastActive } = context || {};
|
|
||||||
|
|
||||||
const [hardwareStatus, setHardwareStatus] = useState({});
|
const [hardwareStatus, setHardwareStatus] = useState({});
|
||||||
|
|
||||||
const getHardwareStatus = async () => {
|
const getHardwareStatus = async () => {
|
||||||
try {
|
try {
|
||||||
const result = await fetchData(HARDWARE_STATS);
|
const result = await fetchData(HARDWARE_STATS);
|
||||||
console.log("hardare result", result)
|
|
||||||
|
|
||||||
setHardwareStatus({ ...result });
|
setHardwareStatus({ ...result });
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -24,7 +20,7 @@ export default function HardwareInfo() {
|
|||||||
let getStatusIntervalId = null;
|
let getStatusIntervalId = null;
|
||||||
|
|
||||||
getHardwareStatus();
|
getHardwareStatus();
|
||||||
getStatusIntervalId = setInterval(getHardwareStatus, FETCH_INTERVAL); //runs every 1 min.
|
getStatusIntervalId = setInterval(getHardwareStatus, FETCH_INTERVAL); // runs every 1 min.
|
||||||
|
|
||||||
// returned function will be called on component unmount
|
// returned function will be called on component unmount
|
||||||
return () => {
|
return () => {
|
||||||
@@ -32,14 +28,39 @@ export default function HardwareInfo() {
|
|||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<h2>Hardware Info</h2>
|
if (!hardwareStatus.cpu) {
|
||||||
<p>cpu:[], disk: [], memory: []; value = %age.</p>
|
return null;
|
||||||
<p>the times should be the same for each, though milliseconds differ</p>
|
}
|
||||||
<div style={{border: '1px solid blue', height: '300px', width: '100%', overflow:'auto'}}>
|
|
||||||
{JSON.stringify(hardwareStatus)}
|
return (
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h2>Hardware Info</h2>
|
||||||
|
<div className="chart-container">
|
||||||
|
<h3>CPU</h3>
|
||||||
|
<Chart data={hardwareStatus.cpu} color="#FF7700" unit="%" />
|
||||||
|
<h3>Memory</h3>
|
||||||
|
<Chart data={hardwareStatus.memory} color="#004777" unit="%" />
|
||||||
|
<h3>Disk</h3>
|
||||||
|
<Chart data={hardwareStatus.disk} color="#A9E190" unit="%" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p>cpu:[], disk: [], memory: []; value = %age.</p>
|
||||||
|
<p>the times should be the same for each, though milliseconds differ</p>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
border: "1px solid blue",
|
||||||
|
height: "300px",
|
||||||
|
width: "100%",
|
||||||
|
overflow: "auto",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{JSON.stringify(hardwareStatus)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import React, { useState, useEffect, useContext } from 'react';
|
import React, { useState, useEffect, useContext } from 'react';
|
||||||
import {timeFormat} from 'd3-time-format';
|
import Chart from "./components/chart.tsx";
|
||||||
import { LineChart, XAxis, YAxis, Line, Tooltip } from 'recharts';
|
|
||||||
import { BroadcastStatusContext } from './utils/broadcast-status-context';
|
import { BroadcastStatusContext } from './utils/broadcast-status-context';
|
||||||
|
|
||||||
import { VIEWERS_OVER_TIME, fetchData } from './utils/apis';
|
import { VIEWERS_OVER_TIME, fetchData } from './utils/apis';
|
||||||
@@ -66,19 +65,19 @@ export default function ViewersOverTime() {
|
|||||||
<div>
|
<div>
|
||||||
<h2>Current Viewers</h2>
|
<h2>Current Viewers</h2>
|
||||||
<div className="chart-container">
|
<div className="chart-container">
|
||||||
<LineChart width={800} height={400} data={viewerInfo}>
|
<Chart data={viewerInfo} color="#ff84d8" unit="" />
|
||||||
<XAxis dataKey="time" tickFormatter={timeFormatter}/>
|
|
||||||
<YAxis dataKey="value"/>
|
{/* <LineChart width={800} height={400} data={viewerInfo}>
|
||||||
<Tooltip
|
<XAxis dataKey="time" tickFormatter={timeFormatter} />
|
||||||
content={<CustomizedTooltip />}
|
<YAxis dataKey="value" />
|
||||||
/>
|
<Tooltip content={<CustomizedTooltip />} />
|
||||||
<Line
|
<Line
|
||||||
type="monotone"
|
type="monotone"
|
||||||
dataKey="value"
|
dataKey="value"
|
||||||
stroke="#ff84d8"
|
stroke="#ff84d8"
|
||||||
dot={{ stroke: 'red', strokeWidth: 2 }}
|
dot={{ stroke: "red", strokeWidth: 2 }}
|
||||||
/>
|
/>
|
||||||
</LineChart>
|
</LineChart> */}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user