import React, { useEffect, useRef, useState } from "react"; import { Chart, registerables } from "chart.js"; import { Box, Typography, useTheme } from "@mui/material"; import { useAuth } from "../contexts/AuthContext"; import { Constants } from "../lib"; Chart.register(...registerables); const Statistics: React.FC = () => { const theme = useTheme(); const elementsChartRef = useRef(null); const jobsChartRef = useRef(null); const [elementsChart, setElementsChart] = useState(null); const [jobsChart, setJobsChart] = useState(null); const { user } = useAuth(); useEffect(() => { const fetchElementsData = async () => { try { const response = await fetch( `${Constants.DOMAIN}/api/statistics/get-average-element-per-link`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ user: user.email }), } ); const data = await response.json(); const dates = data.map((item: any) => item.date); const averages = data.map((item: any) => item.average_elements); if (elementsChartRef.current) { const ctx = elementsChartRef.current.getContext("2d"); if (ctx) { if (elementsChart) { elementsChart.destroy(); } const newChart = new Chart(ctx, { type: "line", data: { labels: dates, datasets: [ { label: "Average Elements per Link", data: averages, backgroundColor: theme.palette.mode === "light" ? "rgba(75, 192, 192, 0.2)" : "rgba(255, 99, 132, 0.2)", borderColor: theme.palette.mode === "light" ? "rgba(75, 192, 192, 1)" : "rgba(255, 99, 132, 1)", borderWidth: 1, }, ], }, options: { scales: { y: { beginAtZero: true, ticks: { color: theme.palette.text.primary, }, }, x: { ticks: { color: theme.palette.text.primary, }, }, }, responsive: true, maintainAspectRatio: false, }, }); setElementsChart(newChart); } } } catch (error) { console.error("Error fetching elements data:", error); } }; fetchElementsData(); }, [elementsChartRef, theme.palette.mode]); useEffect(() => { const fetchJobsData = async () => { try { const response = await fetch( `${Constants.DOMAIN}/api/statistics/get-average-jobs-per-day`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ user: user.email }), } ); const data = await response.json(); const dates = data.map((item: any) => item.date); const jobCounts = data.map((item: any) => item.job_count); if (jobsChartRef.current) { const ctx = jobsChartRef.current.getContext("2d"); if (ctx) { if (jobsChart) { jobsChart.destroy(); } const newChart = new Chart(ctx, { type: "line", data: { labels: dates, datasets: [ { label: "Average Jobs per Day", data: jobCounts, backgroundColor: theme.palette.mode === "light" ? "rgba(153, 102, 255, 0.2)" : "rgba(54, 162, 235, 0.2)", borderColor: theme.palette.mode === "light" ? "rgba(153, 102, 255, 1)" : "rgba(54, 162, 235, 1)", borderWidth: 1, }, ], }, options: { scales: { y: { beginAtZero: true, ticks: { color: theme.palette.text.primary, }, }, x: { ticks: { color: theme.palette.text.primary, }, }, }, responsive: true, maintainAspectRatio: false, }, }); setJobsChart(newChart); } } } catch (error) { console.error("Error fetching jobs data:", error); } }; fetchJobsData(); }, [jobsChartRef, theme.palette.mode]); return ( <> {user ? (
Average Elements per Link
Average Jobs per Day
) : (

Statistics for jobs not viewable unless logged in.

)} ); }; export default Statistics;