From a3392ca468e278ec03bb6ade11f080e5494f37fb Mon Sep 17 00:00:00 2001 From: Liam Date: Sat, 28 Sep 2024 14:38:02 +0100 Subject: [PATCH] add tracked stats indicator --- .../api/player/isbeingtracked/route.ts | 20 ++++++++++ src/components/player/player-header.tsx | 6 ++- .../player/player-tracked-status.tsx | 39 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/app/(pages)/api/player/isbeingtracked/route.ts create mode 100644 src/components/player/player-tracked-status.tsx diff --git a/src/app/(pages)/api/player/isbeingtracked/route.ts b/src/app/(pages)/api/player/isbeingtracked/route.ts new file mode 100644 index 0000000..427fafb --- /dev/null +++ b/src/app/(pages)/api/player/isbeingtracked/route.ts @@ -0,0 +1,20 @@ +import { NextRequest, NextResponse } from "next/server"; +import { connectMongo } from "@/common/mongo"; +import { IPlayer, PlayerModel } from "@/common/schema/player-schema"; + +export async function GET(request: NextRequest) { + const id = request.nextUrl.searchParams.get("id"); + if (id == null) { + return NextResponse.json( + { error: "Unknown player. Missing: ?id=" }, + { status: 400 }, + ); + } + await connectMongo(); // Connect to Mongo + + // Fetch the player and return their statistic history + let foundPlayer: IPlayer | null = await PlayerModel.findById(id); + return NextResponse.json({ + tracked: foundPlayer != null, + }); +} diff --git a/src/components/player/player-header.tsx b/src/components/player/player-header.tsx index 42e13a5..3c382a4 100644 --- a/src/components/player/player-header.tsx +++ b/src/components/player/player-header.tsx @@ -8,6 +8,7 @@ import PlayerStats from "./player-stats"; import ScoreSaberPlayer from "@/common/model/player/impl/scoresaber-player"; import Tooltip from "@/components/tooltip"; import { ReactElement } from "react"; +import PlayerTrackedStatus from "@/components/player/player-tracked-status"; /** * Renders the change for a stat. @@ -114,7 +115,10 @@ export default function PlayerHeader({ player }: Props) {
-

{player.name}

+
+

{player.name}

+ +
{player.inactive && ( diff --git a/src/components/player/player-tracked-status.tsx b/src/components/player/player-tracked-status.tsx new file mode 100644 index 0000000..1ef8ba7 --- /dev/null +++ b/src/components/player/player-tracked-status.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { useQuery } from "@tanstack/react-query"; +import ScoreSaberPlayer from "@/common/model/player/impl/scoresaber-player"; +import ky from "ky"; +import { config } from "../../../config"; +import Tooltip from "@/components/tooltip"; +import { InformationCircleIcon } from "@heroicons/react/16/solid"; + +type Props = { + player: ScoreSaberPlayer; +}; + +export default function PlayerTrackedStatus({ player }: Props) { + const { data, isLoading, isError } = useQuery({ + queryKey: ["playerIsBeingTracked", player.id], + queryFn: () => + ky + .get<{ + tracked: boolean; + }>(`${config.siteUrl}/api/player/isbeingtracked?id=${player.id}`) + .json(), + }); + + if (isLoading || isError || !data?.tracked) { + return undefined; + } + + return ( +
+ This player is having their statistics tracked!

} + side="bottom" + > + +
+
+ ); +}