diff --git a/src/app/server/[server]/historical-data/page.tsx b/src/app/server/[server]/historical-data/page.tsx index 35ac9cb..515a071 100644 --- a/src/app/server/[server]/historical-data/page.tsx +++ b/src/app/server/[server]/historical-data/page.tsx @@ -15,6 +15,7 @@ import { banner } from "@/banner"; import Link from "next/link"; import TabServer from "@/components/misc/TabServer"; import { ChartComponent } from "@/components/Chart"; +import { NewChart } from "@/components/NewChart"; type Props = { params: { server: string }; @@ -81,9 +82,8 @@ export default function ServerPage({ params }: { params: { server: string } }) {
-
- - +
+
diff --git a/src/components/FavoritesView.tsx b/src/components/FavoritesView.tsx index e948399..a693328 100644 --- a/src/components/FavoritesView.tsx +++ b/src/components/FavoritesView.tsx @@ -14,7 +14,7 @@ export default function FavoritesView() { const [loading, setLoading] = useState(true); useEffectOnce(() => { - fetch("/api/accountLocked/getAllFavorites").then((c) => { + fetch("/api/favorites/getAllFavorites").then((c) => { c.json().then((d) => { let num = 0; d.result.forEach((a: any, i: number) => { @@ -28,7 +28,7 @@ export default function FavoritesView() { if (num == d.result.length) { setLoading(false); } - }), + }) ); }); if (d.result.length == 0) setLoading(false); @@ -65,7 +65,7 @@ export default function FavoritesView() { className=" min-w-[128px] max-w-[328px] mb-2 h-[32px] max-md:hidden" onClick={() => { navigator.clipboard.writeText( - server.name + ".mshf.minehut.gg", + server.name + ".mshf.minehut.gg" ); toast.success("Copied IP to clipboard"); }} @@ -105,7 +105,7 @@ export default function FavoritesView() { } function convert(value: number) { - var result: string = ""; + var result: string = value.toString(); if (value >= 1000000) { result = Math.floor(value / 1000000) + "m"; } else if (value >= 1000) { diff --git a/src/components/NewChart.tsx b/src/components/NewChart.tsx new file mode 100644 index 0000000..b015123 --- /dev/null +++ b/src/components/NewChart.tsx @@ -0,0 +1,174 @@ +"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 "./ServerView"; + +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 [favorites, setFavorites] = React.useState(0); + + const allNums = { player_count: joins, favorites }; + useEffectOnce(() => { + fetch("/api/history/getShortTermData", { + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + scopes: ["player_count", "favorites", "time"], + server, + }), + method: "POST", + }).then((c) => { + c.json().then((b) => { + setChartData(b.data); + fetch("/api/favorites/getCommunityNum", { + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ server }), + method: "POST", + }).then((b) => + b.json().then((f) => { + setFavorites(f.result); + }) + ); + fetch("https://api.minehut.com/server/" + server + "?byName=true").then( + (k) => { + k.json().then((p: { server: ServerResponse }) => { + setJoins(p.server.joins); + }); + } + ); + }); + }); + }); + + 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 ( + + ); + })} +
+
+ + + + + { + const date = new Date(value); + return date.toLocaleTimeString("en-US", { + timeStyle: "short", + }); + }} + /> + { + return ( + value + + (activeChart == "player_count" + ? ` plyr${value != 1 ? "s" : ""}.` + : ` ${value == 1 ? "favorite" : "favrts."}`) + ); + }} + /> + + } + /> + + + + +
+ ); +} + +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; +} diff --git a/src/components/ServerView.tsx b/src/components/ServerView.tsx index 7e68800..d735da3 100644 --- a/src/components/ServerView.tsx +++ b/src/components/ServerView.tsx @@ -54,7 +54,7 @@ export default function ServerView(props: { server: string }) { useEffect(() => { setRandomText(getRandomText()); single.init().then(() => { - fetch("/api/accountLocked/isFavorited", { + fetch("/api/favorites/isFavorited", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ @@ -211,7 +211,7 @@ export default function ServerView(props: { server: string }) {