scoresaber-reloaded-v2/src/components/AnalyticsChart.tsx

115 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-10-27 15:26:23 +00:00
"use client";
import { ScoresaberPlayerCountHistory } from "@/schemas/fascinated/scoresaberPlayerCountHistory";
import { formatTimeAgo } from "@/utils/timeUtils";
import {
CategoryScale,
Chart as ChartJS,
Legend,
LineElement,
LinearScale,
PointElement,
Title,
Tooltip,
} from "chart.js";
import { Line } from "react-chartjs-2";
ChartJS.register(
CategoryScale,
LinearScale,
PointElement,
LineElement,
Title,
Tooltip,
Legend,
);
type PlayerChartProps = {
className?: string;
playerCountHistoryData: ScoresaberPlayerCountHistory;
};
export const options: any = {
maintainAspectRatio: false,
aspectRatio: 1,
interaction: {
mode: "index",
intersect: false,
},
scales: {
y: {
ticks: {
autoSkip: true,
maxTicksLimit: 8,
stepSize: 1,
},
},
x: {
ticks: {
autoSkip: true,
},
},
},
elements: {
point: {
radius: 0,
},
},
plugins: {
legend: {
position: "top" as const,
labels: {
color: "white",
},
},
title: {
display: false,
},
tooltip: {
callbacks: {
label(context: any) {
switch (
context.dataset.label
// case "Rank": {
// return `Rank #${formatNumber(context.parsed.y.toFixed(0))}`;
// }
) {
}
},
},
},
},
};
export default function AnalyticsChart({
className,
playerCountHistoryData,
}: PlayerChartProps) {
const playerCountHistory = playerCountHistoryData.history;
let labels = [];
for (let i = 0; i < playerCountHistory.length; i++) {
if (i == playerCountHistory.length - 1) {
labels.push("now");
continue;
}
labels.push(formatTimeAgo(playerCountHistory[i].time));
}
const data = {
labels,
datasets: [
{
lineTension: 0.5,
2023-10-27 15:28:29 +00:00
data: playerCountHistory.map((count) => count.value || "0"),
2023-10-27 15:26:23 +00:00
label: "Active Players",
borderColor: "#3e95cd",
fill: false,
color: "#fff",
},
],
};
return <Line className={className} options={options} data={data} />;
}