frontend/app/DayGraph.tsx (136 lines of code) (raw):
import React, { useState, useEffect } from "react";
import axios from "axios";
import { Bar } from "react-chartjs-2";
import { useHistory } from "react-router-dom";
interface GraphProps {}
const DayGraph: React.FC<GraphProps> = (props) => {
const [invalidCount, setInvalidCount] = useState<number[]>([
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
]);
const days = ["Sun", "Mon", "Tues", "Weds", "Thur", "Fri", "Sat"];
const now = new Date();
const currentDay = days[now.getDay()];
const dayThree = days[(days.indexOf(currentDay) - 2 + 7) % 7];
const dayFour = days[(days.indexOf(currentDay) - 3 + 7) % 7];
const dayFive = days[(days.indexOf(currentDay) - 4 + 7) % 7];
const daySix = days[(days.indexOf(currentDay) - 5 + 7) % 7];
const daySeven = days[(days.indexOf(currentDay) - 6 + 7) % 7];
const dayEight = days[(days.indexOf(currentDay) - 7 + 7) % 7];
const dayNine = days[(days.indexOf(currentDay) - 8 + 7) % 7];
let data = {
labels: [
dayFive,
dayFour,
dayThree,
dayNine,
dayEight,
daySeven,
daySix,
dayFive,
dayFour,
dayThree,
"Yesterday",
"Today",
],
datasets: [
{
backgroundColor: "#0052eb",
data: invalidCount,
},
],
};
let dateTwo = new Date();
dateTwo.setDate(dateTwo.getDate() - 1);
let dateThree = new Date();
dateThree.setDate(dateThree.getDate() - 2);
let dateFour = new Date();
dateFour.setDate(dateFour.getDate() - 3);
let dateFive = new Date();
dateFive.setDate(dateFive.getDate() - 4);
let dateSix = new Date();
dateSix.setDate(dateSix.getDate() - 5);
let dateSeven = new Date();
dateSeven.setDate(dateSeven.getDate() - 6);
let dateEight = new Date();
dateEight.setDate(dateEight.getDate() - 7);
let dateNine = new Date();
dateNine.setDate(dateNine.getDate() - 8);
let dateTen = new Date();
dateTen.setDate(dateTen.getDate() - 9);
let dateEleven = new Date();
dateEleven.setDate(dateEleven.getDate() - 10);
let dateTwelve = new Date();
dateTwelve.setDate(dateTwelve.getDate() - 11);
const dates = [
dateTwelve.toISOString().split("T")[0],
dateEleven.toISOString().split("T")[0],
dateTen.toISOString().split("T")[0],
dateNine.toISOString().split("T")[0],
dateEight.toISOString().split("T")[0],
dateSeven.toISOString().split("T")[0],
dateSix.toISOString().split("T")[0],
dateFive.toISOString().split("T")[0],
dateFour.toISOString().split("T")[0],
dateThree.toISOString().split("T")[0],
dateTwo.toISOString().split("T")[0],
now.toISOString().split("T")[0],
];
const loadInvalidCount = async () => {
try {
const response = await axios.get(`/api/invalid/count`);
return setInvalidCount(response.data);
} catch (err) {
console.error("Could not load in invalid count data: ", err);
}
};
let history = useHistory();
useEffect(() => {
loadInvalidCount();
}, []);
return (
<>
<div
style={{
width: "800px",
height: "400px",
}}
>
<Bar
data={data}
onElementsClick={(elems) => {
console.log("Date clicked: " + dates[elems[0]._index]);
history.push(`/invalid/date/${dates[elems[0]._index]}`);
}}
options={{
maintainAspectRatio: false,
legend: { display: false },
scales: {
yAxes: [
{
ticks: {
beginAtZero: true,
callback: function (value: number) {
if (Number.isInteger(value)) {
return value;
}
},
stepSize: 1,
},
},
],
},
}}
/>
</div>
</>
);
};
export default DayGraph;