From 99e7325edb577af4a4ab8d6f2fa79bc165abacdb Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Sun, 29 Sep 2024 20:35:48 +0200 Subject: [PATCH] added settings --- backend/entities/game.ts | 1 + bun.lockb | Bin 171566 -> 172732 bytes package.json | 1 + src/Shell.tsx | 3 +- src/components/Auth/LoginButton.tsx | 6 ++- src/components/Auth/RegisterButton.tsx | 6 ++- src/components/Board.tsx | 11 ++-- src/components/Switch.tsx | 28 ++++++++++ src/components/Tag.tsx | 2 +- src/index.css | 4 +- src/main.tsx | 8 +-- src/views/endless/Endless.tsx | 1 + src/views/settings/Settings.tsx | 71 +++++++++++++++++++++++++ 13 files changed, 126 insertions(+), 16 deletions(-) create mode 100644 src/components/Switch.tsx create mode 100644 src/views/settings/Settings.tsx diff --git a/backend/entities/game.ts b/backend/entities/game.ts index b5f4508..d0850f6 100644 --- a/backend/entities/game.ts +++ b/backend/entities/game.ts @@ -291,6 +291,7 @@ export const game = { if (finished) return; if (!isValid(serverGame, x, y)) return; if (isRevealed[x][y]) return; + serverGame.isFlagged[x][y] = false; serverGame.isQuestionMark[x][y] = true; }, clearTile: (serverGame: ServerGame, x: number, y: number) => { diff --git a/bun.lockb b/bun.lockb index 79594710d41ad9a72f2adfcc26b6ec0ec0603379..29a569c2fe501d0a19485a007566f1b0bb714abe 100755 GIT binary patch delta 28852 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 rTuPQYh+|1o8! = ({ children }) => { - Settings + Settings NEW
diff --git a/src/components/Auth/LoginButton.tsx b/src/components/Auth/LoginButton.tsx index 0be97c4..7acbee6 100644 --- a/src/components/Auth/LoginButton.tsx +++ b/src/components/Auth/LoginButton.tsx @@ -13,6 +13,7 @@ import { useWSMutation } from "../../hooks"; import { useAtom } from "jotai"; import { loginTokenAtom } from "../../atoms"; import PasswordInput from "./PasswordInput"; +import { wsClient } from "../../wsClient"; const LoginButton = () => { const [isOpen, setIsOpen] = useState(false); @@ -57,8 +58,11 @@ const LoginButton = () => { onClick={() => { login .mutateAsync({ username, password }) - .then((res) => { + .then(async (res) => { setToken(res.token); + await wsClient.dispatch("user.loginWithToken", { + token: JSON.parse(res.token), + }); queryClient.invalidateQueries(); }) .catch((e) => { diff --git a/src/components/Auth/RegisterButton.tsx b/src/components/Auth/RegisterButton.tsx index ceacb32..6936842 100644 --- a/src/components/Auth/RegisterButton.tsx +++ b/src/components/Auth/RegisterButton.tsx @@ -13,6 +13,7 @@ import { useAtom } from "jotai"; import { loginTokenAtom } from "../../atoms"; import { useQueryClient } from "@tanstack/react-query"; import PasswordInput from "./PasswordInput"; +import { wsClient } from "../../wsClient"; const RegisterButton = () => { const [isOpen, setIsOpen] = useState(false); @@ -57,8 +58,11 @@ const RegisterButton = () => { onClick={() => { register .mutateAsync({ username, password }) - .then((res) => { + .then(async (res) => { setToken(res.token); + await wsClient.dispatch("user.loginWithToken", { + token: JSON.parse(res.token), + }); queryClient.invalidateQueries(); }) .catch((e) => { diff --git a/src/components/Board.tsx b/src/components/Board.tsx index d0745e5..f4eeea0 100644 --- a/src/components/Board.tsx +++ b/src/components/Board.tsx @@ -239,11 +239,12 @@ const Tile = ({ : false; const isFlagged = game.isFlagged[i][j]; const isQuestionMark = game.isQuestionMark[i][j]; - const base = isRevealed ? ( - - ) : ( - - ); + const base = + isRevealed || isMine ? ( + + ) : ( + + ); const extra = isLastPos ? : null; const touchStart = useRef(0); const isMove = useRef(false); diff --git a/src/components/Switch.tsx b/src/components/Switch.tsx new file mode 100644 index 0000000..e6e26cc --- /dev/null +++ b/src/components/Switch.tsx @@ -0,0 +1,28 @@ +"use client"; + +import * as React from "react"; +import * as SwitchPrimitives from "@radix-ui/react-switch"; +import { cn } from "../lib/utils"; + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +Switch.displayName = SwitchPrimitives.Root.displayName; + +export { Switch }; diff --git a/src/components/Tag.tsx b/src/components/Tag.tsx index d88c5ea..4d86321 100644 --- a/src/components/Tag.tsx +++ b/src/components/Tag.tsx @@ -16,7 +16,7 @@ const tagVariants = cva("font-semibold py-2 px-4 rounded-md flex gap-2", { }, size: { default: "h-10 py-2 px-4", - sm: "h-9 px-3 rounded-md", + sm: "h-7 py-2 px-2 rounded-md text-xs", lg: "h-11 px-8 rounded-md", }, }, diff --git a/src/index.css b/src/index.css index 413761b..8717290 100644 --- a/src/index.css +++ b/src/index.css @@ -1,7 +1,9 @@ @import "tailwindcss"; @theme { - --color-primary: rgb(251, 21, 242); + --color-primary: #D9AFD9; + --color-input: color-mix(in srgb, var(--color-white, #fff) 20%, transparent); + --color-background: black; --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%; diff --git a/src/main.tsx b/src/main.tsx index 3521dd5..72f83b4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -11,6 +11,7 @@ import { Route, Switch } from "wouter"; import Endless from "./views/endless/Endless.tsx"; import { queryClient } from "./queryClient.ts"; import Home from "./views/home/Home.tsx"; +import Settings from "./views/settings/Settings.tsx"; connectWS(); @@ -43,12 +44,7 @@ setup().then(() => {

Comming Soon

)} /> - ( -

Comming Soon

- )} - /> + {/* */} diff --git a/src/views/endless/Endless.tsx b/src/views/endless/Endless.tsx index c43a1f4..2acb9a8 100644 --- a/src/views/endless/Endless.tsx +++ b/src/views/endless/Endless.tsx @@ -22,6 +22,7 @@ const Endless = () => { setGameId(undefined); }; }, [setGameId]); + console.log("set", setGameId); return game ? ( <> diff --git a/src/views/settings/Settings.tsx b/src/views/settings/Settings.tsx new file mode 100644 index 0000000..878073f --- /dev/null +++ b/src/views/settings/Settings.tsx @@ -0,0 +1,71 @@ +import { ReactNode } from "react"; +import { Switch } from "../../components/Switch"; +import { useWSMutation, useWSQuery } from "../../hooks"; + +interface BoolSettingProps { + label: string; + description: ReactNode; + value: boolean; + onChange: (value: boolean) => void; +} + +const BoolSetting: React.FC = ({ + label, + description, + value, + onChange, +}) => ( +
+
+ +

{description}

+
+ +
+); + +const Settings = () => { + const { data: settings, refetch } = useWSQuery("user.getSettings", null); + const updateSettings = useWSMutation("user.updateSettings"); + + return ( +
+
+

Settings

+
+ + You can place a question mark on a tile after placing a flag. +
+ Just right click again on the tile. + + } + value={settings?.placeQuestionMark ?? false} + onChange={async (value) => { + await updateSettings.mutateAsync({ placeQuestionMark: value }); + refetch(); + }} + /> + + You can long press on a tile to reveal it. This is useful for + touch devices. + + } + value={settings?.longPressOnDesktop ?? false} + onChange={async (value) => { + updateSettings.mutateAsync({ longPressOnDesktop: value }); + refetch(); + }} + /> +
+
+
+ ); +}; + +export default Settings;