From 781d80f5e5fedfcc27d0ce37424e46347f019fe0 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Sat, 14 Jun 2025 03:21:36 +0200 Subject: [PATCH] added basic profile --- backend/controller/userController.ts | 38 +++++++++-- bun.lockb | Bin 247819 -> 258168 bytes package.json | 1 + src/components/PastMatch.tsx | 6 +- src/components/Tooltip.tsx | 60 +++++++++++++++++ src/index.css | 30 +++++++-- src/views/profile/Profile.tsx | 96 +++++++++++++++++++++------ 7 files changed, 194 insertions(+), 37 deletions(-) create mode 100644 src/components/Tooltip.tsx diff --git a/backend/controller/userController.ts b/backend/controller/userController.ts index 78e22c4..21d40af 100644 --- a/backend/controller/userController.ts +++ b/backend/controller/userController.ts @@ -20,7 +20,7 @@ import { getWeight, lootboxes } from "../../shared/lootboxes"; import { weightedPickRandom } from "../../shared/utils"; import { emit } from "../events"; import { Game } from "../schema"; -import { and, eq, gt } from "drizzle-orm"; +import { and, count, eq, gt, max, not, sum } from "drizzle-orm"; import dayjs from "dayjs"; const secret = process.env.SECRET!; @@ -185,11 +185,7 @@ export const userController = createController({ }), async ({ id }, { db }) => { const now = dayjs(); - const firstOfYear = now - .set("day", 0) - .set("month", 0) - .set("hour", 0) - .set("minute", 0); + const firstOfYear = now.startOf("year"); const gamesOfUser = await db.query.Game.findMany({ where: and(eq(Game.user, id), gt(Game.finished, firstOfYear.valueOf())), }); @@ -203,4 +199,34 @@ export const userController = createController({ return heat; }, ), + getProfile: createEndpoint( + z.object({ + id: z.string(), + }), + async ({ id }, { db }) => { + const [{ value: totalGames }] = await db + .select({ + value: count(), + }) + .from(Game) + .where(and(eq(Game.user, id), not(eq(Game.finished, 0)))); + const [{ value: highestStage }] = await db + .select({ + value: max(Game.stage), + }) + .from(Game) + .where(and(eq(Game.user, id), not(eq(Game.finished, 0)))); + const [{ value: totalStages }] = await db + .select({ + value: sum(Game.stage), + }) + .from(Game) + .where(and(eq(Game.user, id), not(eq(Game.finished, 0)))); + return { + totalGames, + highestStage, + averageStage: Number(totalStages) / totalGames, + }; + }, + ), }); diff --git a/bun.lockb b/bun.lockb index 99f2628a6db91dbb4dd02923948392c2db34eeca..e7afa9353dcc236252775588c6777205abe03f41 100755 GIT binary patch delta 50078 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 CeGeG` diff --git a/package.json b/package.json index 72cf3f4..8c4363d 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-switch": "^1.1.1", + "@radix-ui/react-tooltip": "^1.2.7", "@tanstack/react-query": "^5.59.11", "@tanstack/react-query-devtools": "^5.59.11", "@tsparticles/engine": "^3.5.0", diff --git a/src/components/PastMatch.tsx b/src/components/PastMatch.tsx index 6eafdfe..fb54902 100644 --- a/src/components/PastMatch.tsx +++ b/src/components/PastMatch.tsx @@ -9,8 +9,8 @@ interface PastMatchProps { const PastMatch = ({ game }: PastMatchProps) => { return ( -
-
+
+
Endless
@@ -24,7 +24,7 @@ const PastMatch = ({ game }: PastMatchProps) => { {game.minesCount - game.isFlagged.flat().filter((f) => f).length}
-
+
Duration: {formatTimeSpan(game.finished - game.started)}
diff --git a/src/components/Tooltip.tsx b/src/components/Tooltip.tsx new file mode 100644 index 0000000..b899b2f --- /dev/null +++ b/src/components/Tooltip.tsx @@ -0,0 +1,60 @@ +"use client"; + +import * as React from "react"; +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; +import { cn } from "../lib/utils"; + +function TooltipProvider({ + delayDuration = 0, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function Tooltip({ + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +function TooltipTrigger({ + ...props +}: React.ComponentProps) { + return ; +} + +function TooltipContent({ + className, + sideOffset = 0, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + ); +} + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; diff --git a/src/index.css b/src/index.css index 31b1d71..cae1f4b 100644 --- a/src/index.css +++ b/src/index.css @@ -1,20 +1,36 @@ @import "tailwindcss"; @theme { - --color-primary: #D9AFD9; + --color-primary: #d9afd9; --color-input: color-mix(in srgb, var(--color-white, #fff) 20%, transparent); --color-background: black; --color-common: var(--color-sky-500); --color-uncommon: var(--color-green-400); --color-rare: var(--color-red-500); --color-legendary: var(--color-amber-500); - --bg-brand: -webkit-linear-gradient(225deg, rgb(251, 175, 21), rgb(251, 21, 242), - rgb(21, 198, 251)) 0% 0% / 100% 300%; - --bg-secondary: linear-gradient(90deg, #D9AFD9 0%, #97D9E1 100%) 0% 0% / 100% 300%; + --bg-brand: -webkit-linear-gradient( + 225deg, + rgb(251, 175, 21), + rgb(251, 21, 242), + rgb(21, 198, 251) + ) + 0% 0% / 100% 300%; + --bg-secondary: linear-gradient(90deg, #d9afd9 0%, #97d9e1 100%) 0% 0% / 100% + 300%; --animate-gradientmove: gradientmove 1s ease 0s 1 normal forwards; @keyframes gradientmove { - 0%{background-position: 0% 0%} - 100%{background-position: 0% 100%} + 0% { + background-position: 0% 0%; + } + 100% { + background-position: 0% 100%; + } + } +} + +@layer components { + .bg-brand { + background: var(--bg-brand); } } @@ -22,7 +38,7 @@ button { cursor: pointer; } -.grid-border-b div:not(:nth-last-child(-n+3)) { +.grid-border-b div:not(:nth-last-child(-n + 3)) { @apply border-b border-white/10; } diff --git a/src/views/profile/Profile.tsx b/src/views/profile/Profile.tsx index 85beb85..7b8c4a9 100644 --- a/src/views/profile/Profile.tsx +++ b/src/views/profile/Profile.tsx @@ -1,35 +1,89 @@ import { useMemo } from "react"; import { useWSQuery } from "../../hooks"; import dayjs from "dayjs"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "../../components/Tooltip"; +import PastMatch from "../../components/PastMatch"; const Profile: React.FC = () => { - const { data: heatmap } = useWSQuery("user.getHeatmap", { id: "Gordon" }); - const now = useMemo(() => dayjs(), []); - const firstOfYear = useMemo( - () => now.set("day", 0).set("month", 0).set("hour", 0).set("minute", 0), - [now], + const { data: username } = useWSQuery("user.getSelf", null); + const { data: heatmap } = useWSQuery( + "user.getHeatmap", + { id: username! }, + !!username, ); + const { data: profile } = useWSQuery( + "user.getProfile", + { id: username! }, + !!username, + ); + const { data: pastGames } = useWSQuery( + "game.getGames", + { + user: username!, + page: 0, + }, + !!username, + ); + const now = useMemo(() => dayjs(), []); + const firstOfYear = useMemo(() => now.startOf("year"), [now]); const weeks = now.diff(firstOfYear, "weeks") + 1; const maxHeat = heatmap ? Math.max(...heatmap) : 0; return ( -
+
+
+
{username}
+
+

Total Games: {profile?.totalGames}

+

Highest Stage: {profile?.highestStage}

+

Average Stage: {profile?.averageStage}

+
+
+
+ {pastGames?.data + .slice(0, 4) + .map((game) => )} +
{heatmap && ( -
- {Array.from({ length: weeks }).map((_, w) => ( -
- {Array.from({ length: 7 }).map((_, d) => ( -
-
-
- ))} -
- ))} +
+

Activity

+
+ {Array.from({ length: weeks }).map((_, w) => ( +
+ {Array.from({ length: 7 }).map((_, d) => { + const index = w * 7 + d; + if (index >= heatmap.length) return; + return ( + + +
+
+
+ + +

+ {firstOfYear + .clone() + .add(index, "days") + .format("DD/MM/YYYY")} +

+

{heatmap[index]} Games Played

+
+ + ); + })} +
+ ))} +
)}