Some progress on charts

This commit is contained in:
Gabe Kangas
2020-10-26 23:53:04 -07:00
parent 87afef3b11
commit 9e12d87edd
3 changed files with 107 additions and 29 deletions

View 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>
);
}

View File

@@ -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> );
);
}
}

View File

@@ -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>
); );