"use client"; import * as React from "react"; import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; import { useEffectOnce } from "@/lib/useEffectOnce"; import { ServerResponse } from "@/lib/types/mh-server"; import { getCommunityServerFavorites, getShortTermData } from "@/lib/api"; import { Skeleton } from "./ui/skeleton"; import FadeIn from "react-fade-in/lib/FadeIn"; const chartConfig = { player_count: { label: "Joins", color: "hsl(var(--chart-1))", }, favorites: { label: "Favorites", color: "hsl(var(--chart-3))", }, } satisfies ChartConfig; export function NewChart({ server }: { server: string }) { const [activeChart, setActiveChart] = React.useState("player_count"); const [chartData, setChartData] = React.useState([]); const [joins, setJoins] = React.useState(0); const [loading, setLoading] = React.useState(true); const [favorites, setFavorites] = React.useState(0); const allNums = { player_count: joins, favorites }; useEffectOnce(() => { getShortTermData(server, ["player_count", "favorites", "date"]).then( (c) => { setChartData(c); getCommunityServerFavorites(server).then((b) => setFavorites(b)); fetch("https://api.minehut.com/server/" + server + "?byName=true").then( (k) => { k.json().then((p: { server: ServerResponse }) => { setJoins(p.server.joins); }); } ); setLoading(false); } ); }); if (loading) return ( <> ); return (
{chartConfig[activeChart].label} Chart for {server} Showing the past 30 entries.
{["player_count", "favorites"].map((key) => { const chart = key as keyof typeof chartConfig; return ( ); })}
{ return new Date(value).toLocaleTimeString("en-US", { timeStyle: "short", }); }} /> { return ( value + (activeChart == "player_count" ? ` plyr${value != 1 ? "s" : ""}.` : ` ${value == 1 ? "favorite" : "favrts."}`) ); }} /> { return new Date(value).toLocaleTimeString("en-US", { timeStyle: "short", }); }} /> } />
); } function convert(value: number) { var result: string = value.toString(); if (value >= 1000000) { result = Math.floor(value / 1000000) + "m"; } else if (value >= 1000) { result = Math.floor(value / 1000) + "k"; } return result; }