From 276d2faf42895be801fc81ef11ddada40b98d2df Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Tue, 24 Sep 2024 01:27:07 +0200 Subject: [PATCH] wip --- .env | 1 + .gitignore | 2 + backend/controller/controller.ts | 2 + backend/controller/userController.ts | 60 ++++++++ backend/router.ts | 6 + bun.lockb | Bin 121367 -> 142813 bytes index.html | 3 +- package.json | 4 + src/Shell.tsx | 17 +-- src/atoms.ts | 5 + src/components/Auth/LoginButton.tsx | 57 +++++++ src/components/Auth/RegisterButton.tsx | 57 +++++++ src/components/Button.tsx | 8 +- src/components/Dialog.tsx | 119 +++++++++++++++ src/components/DropdownMenu.tsx | 197 +++++++++++++++++++++++++ src/components/Header.tsx | 58 ++++++++ src/components/Popover.tsx | 32 ++++ src/images/banner.png | Bin 0 -> 45877 bytes src/images/expert.png | Bin 0 -> 7075 bytes src/images/mine.png | Bin 0 -> 5368 bytes src/index.css | 15 +- src/main.tsx | 12 +- 22 files changed, 635 insertions(+), 20 deletions(-) create mode 100644 .env create mode 100644 backend/controller/userController.ts create mode 100644 src/components/Auth/LoginButton.tsx create mode 100644 src/components/Auth/RegisterButton.tsx create mode 100644 src/components/Dialog.tsx create mode 100644 src/components/DropdownMenu.tsx create mode 100644 src/components/Header.tsx create mode 100644 src/components/Popover.tsx create mode 100644 src/images/banner.png create mode 100644 src/images/expert.png create mode 100644 src/images/mine.png diff --git a/.env b/.env new file mode 100644 index 0000000..948a18b --- /dev/null +++ b/.env @@ -0,0 +1 @@ +SECRET=Aijd108jAW8dj98uj12918AWdijo83289jAdioj diff --git a/.gitignore b/.gitignore index 497553e..6a2b49e 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ temp_dbs *.njsproj *.sln *.sw? + +deploy.sh diff --git a/backend/controller/controller.ts b/backend/controller/controller.ts index 07daf42..1548862 100644 --- a/backend/controller/controller.ts +++ b/backend/controller/controller.ts @@ -1,10 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import type { ServerWebSocket } from "bun"; import type { BunSQLiteDatabase } from "drizzle-orm/bun-sqlite"; import type { z } from "zod"; interface RequestContext { user?: string; db: BunSQLiteDatabase; + ws: ServerWebSocket; } export type Endpoint = { diff --git a/backend/controller/userController.ts b/backend/controller/userController.ts new file mode 100644 index 0000000..433df26 --- /dev/null +++ b/backend/controller/userController.ts @@ -0,0 +1,60 @@ +import { z } from "zod"; +import { createController, createEndpoint } from "./controller"; +import { loginUser, registerUser } from "../repositories/userRepository"; +import crypto from "crypto"; +import { resetSessionUser, setSessionUser } from "../router"; + +const secret = process.env.SECRET!; + +const signString = (payload: string) => { + return crypto.createHmac("sha256", secret).update(payload).digest("hex"); +}; + +export const userController = createController({ + getSelf: createEndpoint(z.null(), async (_, { user }) => { + return user; + }), + login: createEndpoint( + z.object({ username: z.string(), password: z.string() }), + async (input, { db, ws }) => { + const { name: user } = await loginUser( + db, + input.username, + input.password, + ); + const session = { user, expires: Date.now() + 1000 * 60 * 60 * 24 * 14 }; + const sig = signString(JSON.stringify(session)); + setSessionUser(ws, user); + return { token: JSON.stringify({ session, sig }) }; + }, + ), + loginWithToken: createEndpoint( + z.object({ token: z.string() }), + async (input, { ws }) => { + const { session, sig } = JSON.parse(input.token); + const { user } = session; + if (sig !== signString(JSON.stringify(session))) { + return { success: false }; + } + if (Date.now() > session.expires) { + return { success: false }; + } + setSessionUser(ws, user); + return { success: true }; + }, + ), + logout: createEndpoint(z.null(), async (_, { ws }) => { + resetSessionUser(ws); + }), + register: createEndpoint( + z.object({ username: z.string().max(15), password: z.string().min(6) }), + async (input, { db, ws }) => { + await registerUser(db, input.username, input.password); + const user = input.username; + const session = { user, expires: Date.now() + 1000 * 60 * 60 * 24 * 14 }; + const sig = signString(JSON.stringify(session)); + setSessionUser(ws, user); + return { token: JSON.stringify({ session, sig }) }; + }, + ), +}); diff --git a/backend/router.ts b/backend/router.ts index b251e89..1d0524a 100644 --- a/backend/router.ts +++ b/backend/router.ts @@ -3,9 +3,11 @@ import type { ServerWebSocket } from "bun"; import type { Controller, Endpoint } from "./controller/controller"; import { gameController } from "./controller/gameController"; import { db } from "./database/db"; +import { userController } from "./controller/userController"; const controllers = { game: gameController, + user: userController, } satisfies Record>; const userName = new WeakMap, string>(); @@ -14,6 +16,10 @@ export const setSessionUser = (ws: ServerWebSocket, user: string) => { userName.set(ws, user); }; +export const resetSessionUser = (ws: ServerWebSocket) => { + userName.delete(ws); +}; + export const handleRequest = async ( message: unknown, ws: ServerWebSocket, diff --git a/bun.lockb b/bun.lockb index f2ecc908d963512428bc8fc203e76d87a1d1a985..bc27cb34d91f7b3b464662bbfacdb662227d8d90 100755 GIT binary patch delta 35022 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 - + + Minesweeper diff --git a/package.json b/package.json index 0f628f6..e459c12 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,12 @@ "drizzle:migrate": "bun run backend/migrate.ts" }, "dependencies": { + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-dropdown-menu": "^2.1.1", + "@radix-ui/react-popover": "^1.1.1", "@tailwindcss/vite": "^4.0.0-alpha.24", "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.0.0-alpha.91", "@uidotdev/usehooks": "^2.4.1", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", diff --git a/src/Shell.tsx b/src/Shell.tsx index 2d909b2..0fff75e 100644 --- a/src/Shell.tsx +++ b/src/Shell.tsx @@ -3,16 +3,16 @@ import { Button } from "./components/Button"; import { motion } from "framer-motion"; import { GitBranch, - Github, History, LayoutDashboard, Menu, Play, Settings, - Settings2, } from "lucide-react"; import Hr from "./components/Hr"; import NavLink from "./components/NavLink"; +import { useMediaQuery } from "@uidotdev/usehooks"; +import Header from "./components/Header"; const drawerWidth = 256; const drawerWidthWithPadding = drawerWidth; @@ -22,14 +22,10 @@ const Shell: React.FC = () => { const x = isOpen ? 0 : -drawerWidthWithPadding; const width = isOpen ? drawerWidthWithPadding : 0; + const isMobile = useMediaQuery("(max-width: 768px)"); useEffect(() => { - const onResize = () => { - setIsOpen(window.innerWidth > 768); - }; - window.addEventListener("resize", onResize); - onResize(); - return () => window.removeEventListener("resize", onResize); - }, []); + setIsOpen(!isMobile); + }, [isMobile]); return (
@@ -85,7 +81,8 @@ const Shell: React.FC = () => { layout /> -
+
+
diff --git a/src/atoms.ts b/src/atoms.ts index 7180609..c7b54e3 100644 --- a/src/atoms.ts +++ b/src/atoms.ts @@ -1,3 +1,8 @@ import { atom } from "jotai"; +import { atomWithStorage } from "jotai/utils"; export const gameId = atom(undefined); +export const loginToken = atomWithStorage( + "loginToken", + undefined, +); diff --git a/src/components/Auth/LoginButton.tsx b/src/components/Auth/LoginButton.tsx new file mode 100644 index 0000000..3bc122d --- /dev/null +++ b/src/components/Auth/LoginButton.tsx @@ -0,0 +1,57 @@ +import { useEffect, useState } from "react"; +import { Button } from "../Button"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../Dialog"; + +const LoginButton = () => { + const [isOpen, setIsOpen] = useState(false); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + + useEffect(() => { + setUsername(""); + setPassword(""); + }, [isOpen]); + + return ( + + + + + + + Login + +
+ + setUsername(e.target.value)} + /> + + setPassword(e.target.value)} + /> +
+ + + + +
+
+ ); +}; + +export default LoginButton; diff --git a/src/components/Auth/RegisterButton.tsx b/src/components/Auth/RegisterButton.tsx new file mode 100644 index 0000000..27f7f33 --- /dev/null +++ b/src/components/Auth/RegisterButton.tsx @@ -0,0 +1,57 @@ +import { useEffect, useState } from "react"; +import { Button } from "../Button"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../Dialog"; + +const RegisterButton = () => { + const [isOpen, setIsOpen] = useState(false); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + + useEffect(() => { + setUsername(""); + setPassword(""); + }, [isOpen]); + + return ( + + + + + + + Register + +
+ + setUsername(e.target.value)} + /> + + setPassword(e.target.value)} + /> +
+ + + + +
+
+ ); +}; + +export default RegisterButton; diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 6934afb..b609125 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -2,11 +2,15 @@ import { cva, type VariantProps } from "class-variance-authority"; import { forwardRef } from "react"; import { cn } from "../lib/utils"; -const buttonVariants = cva("font-semibold py-2 px-4 rounded-md", { +const buttonVariants = cva("font-semibold py-2 px-4 rounded-md flex gap-2", { variants: { variant: { - default: "bg-primary text-white/95 hover:bg-primary/90", + default: "bg-gray-900 text-white/95", ghost: "bg-transparent text-white/95 hover:bg-white/05", + outline: + "bg-transparent text-white/95 hover:bg-white/05 border-white/10 border-1", + primary: + "[background:var(--bg-brand)] text-white/95 hover:bg-white/05 hover:animate-gradientmove", }, size: { default: "h-10 py-2 px-4", diff --git a/src/components/Dialog.tsx b/src/components/Dialog.tsx new file mode 100644 index 0000000..65e3747 --- /dev/null +++ b/src/components/Dialog.tsx @@ -0,0 +1,119 @@ +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; +import { cn } from "../lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/src/components/DropdownMenu.tsx b/src/components/DropdownMenu.tsx new file mode 100644 index 0000000..3aeb137 --- /dev/null +++ b/src/components/DropdownMenu.tsx @@ -0,0 +1,197 @@ +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { Check, ChevronRight, Circle } from "lucide-react"; +import { cn } from "../lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..ed4b056 --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,58 @@ +import { UserRound } from "lucide-react"; +import { Button } from "./Button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "./DropdownMenu"; +import { useLocation } from "wouter"; +import LoginButton from "./Auth/LoginButton"; +import { useWSQuery } from "../hooks"; +import RegisterButton from "./Auth/RegisterButton"; +import banner from "../images/banner.png"; +import mine from "../images/mine.png"; + +const Header = () => { + const [, setLocation] = useLocation(); + const { data: username } = useWSQuery("user.getSelf", null); + return ( +
+
+ + +
+ {username ? ( + + + + + + setLocation("/profile")}> + Profile + + setLocation("/settings")}> + Settings + + + Logout + + + ) : ( + <> + + + + )} +
+ ); +}; + +export default Header; diff --git a/src/components/Popover.tsx b/src/components/Popover.tsx new file mode 100644 index 0000000..fe5daa2 --- /dev/null +++ b/src/components/Popover.tsx @@ -0,0 +1,32 @@ +import * as PopoverPrimitive from "@radix-ui/react-popover"; +import { forwardRef, PropsWithChildren } from "react"; +import { cn } from "../lib/utils"; + +const Popover = PopoverPrimitive.Root; + +const PopoverTrigger: React.FC = ({ children }) => { + return ( + {children} + ); +}; + +const PopoverContent = forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; + +export { Popover, PopoverTrigger, PopoverContent }; diff --git a/src/images/banner.png b/src/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..baff3b06d1c1c2c846cd42eff68fc74d78ae3171 GIT binary patch literal 45877 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 PAP_ZWEv0G&%kcjJTr*i=zb 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 literal 0 HcmV?d00001 diff --git a/src/images/mine.png b/src/images/mine.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecdd4713a1c0c9f9feb5ffc1415fea0dd70bbd3 GIT binary patch literal 5368 zcmeHKdsGuw8lOZs270vA$5OSrF}S`blS~FO83>PpLRJH)6!EaTb(opNS;@m>fB<3@ zTeXT6t5}Ob>yd3&yWml3-IYVZ+M??Vm0GsQ>nNzK3c6ZteZbzCB#=n=^mxwpKf<}p zo$vm>-~I0I`|byMH!(hTl>bD32!clG;$jv8Is(D+zDAFo{wdvs&j=Bwz=^KUHM z9XLMaNt!XaYr`AqZKIzC-CO^!_b$yH6Y*~7qKOkis@D`RJn`EE`<^3sHLlLPESJwH zxk{?iPQU&3=1OeIjaN5n_b-U5)BbKRHZ|Gu$%mUKEt)msgXoKqYuSFfv6JlUebjt%Sq*DCcmHF_zrV{r5Ip6?lc2x7OkSIid~nj?U2oM^koEhG zeLvMB<1!O-qBhK&2@1r)CZ%vG`h^5#G092VlE%m#CM&Nd6c*vIlGI9ulcq67)~uEF zR@cg;EUlF-4c064)@Wu08<%5amgK}IQ8_Cq4K0fZ_YZRrfWX9Xq|{+bH`@t^RwnQg zV9uKnnN)yqE48u|kmP8KjgewWmrr8C<((o8Wt6(ECE+nxgW(h~~YAV&J zTB$;D4UVZas5)d2l+4)dpb~jbp|J@od|C)_7$7Xk*C`+n?BFa!w2dJ-i!I4wN!Q8- zTH?U69$Y7yGT$wHDv!1n!h~KFn|Xsk7Mm%|7^kJ zyirS-Rn9l(YdR}jC8<=n6a+~*k6l(Hm;mr-GQiJi1I-KcLS&#Bx-{e4&ae1! z<>FV|0Zm`b^YJu@*n&<#hAf=L0RC-Qfch2 zOz=fZoVFk~2I}9q?QAW0^Rvb+vqR8JWBDP1ic4Mv#*v&(KX2qszraArm~Y2fDI%7Dm=)32uN@C~GnzgFODM{J^m&PCa$Gk?fkuoG(i=Le~?zyCwq z$h)NxW|73lM=TbtTN@cEl?DVzBtHE3C6g2Bg&JaV^Ld~mrFX|JJ-WQ?Om%NV4boFI zesCk_{&9_=XS)K;+^x1pqtEG^DqJD)6dpA02nAE5IQP<)_Q+f>FgOmhuI}ZcpGqHG ztktwVTjSUC@W{2iS?KYj`GY4F{OkNo8r`;q|1j!Lr8eH(R`=wGzSgDn+B>UjCx3b? zSy04dYkcp@t}VAFw>*qL7nFPAqpeNh;*aiq@3`~D1?>@m*^~Xs?E9hJ`yLg?J}hh~ zwjB){(cWe0u$T6Xo^mKs>J8ND8t}b&84c$nnu;s;l&3~Lr(Va-N@I0L0qdZ1w2zsF+`pV)+E!BECwbbsDYmn}zP$UGN9vuG6ThOl zyJug-kCz>=?fu*Zy`1)NZ77vfdT-CoeIJ&ukDcp|%bE3J7DTe+V!@%lrC%MX2rv3m z-mxAo>+U9Bp_U<6@Vo!qT=t*Ic z4&z^K$ErP|a}{P)SJ{J8?-Z1+Zl94izq1*={rCPBfA5RqBYy4Vs;_i83uv)6ry;AT z`JtSQ?fop!uPFeuMo2d=KBn^Z<@x^wbkrC} literal 0 HcmV?d00001 diff --git a/src/index.css b/src/index.css index b54dbc4..c6022f6 100644 --- a/src/index.css +++ b/src/index.css @@ -4,6 +4,16 @@ --color-primary: hotpink; --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%} + } +} + +button { + cursor: pointer; } /* .game-board { */ @@ -99,11 +109,6 @@ /* animation: gradient_move 1s ease infinite; */ /* } */ /**/ -/* @keyframes gradient_move { */ -/* 0%{background-position: 0% 92%} */ -/* 50%{background-position: 100% 9%} */ -/* 100%{background-position: 0% 92%} */ -/* } */ /**/ /* .header { */ /* display: grid; */ diff --git a/src/main.tsx b/src/main.tsx index 7555605..5b0c196 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,8 +4,13 @@ import App from "./App.tsx"; import "./index.css"; import { connectWS } from "./ws.ts"; import { Toaster } from "react-hot-toast"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { + QueryCache, + QueryClient, + QueryClientProvider, +} from "@tanstack/react-query"; import Shell from "./Shell.tsx"; +import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; document.addEventListener("contextmenu", (event) => { event.preventDefault(); @@ -13,7 +18,9 @@ document.addEventListener("contextmenu", (event) => { connectWS(); -const queryClient = new QueryClient(); +const queryClient = new QueryClient({ + queryCache: new QueryCache(), +}); createRoot(document.getElementById("root")!).render( @@ -21,6 +28,7 @@ createRoot(document.getElementById("root")!).render( {/* */} + , );