From 78d3ec8a551c2973eb81fa244260419b683bc47b Mon Sep 17 00:00:00 2001 From: Vomitblood Date: Tue, 6 Aug 2024 23:31:05 +0800 Subject: [PATCH] added settings panel --- .github/workflows/build-validation.yml | 32 ----- .prettierrc | 2 +- bun.lockb | Bin 170176 -> 173096 bytes package.json | 1 + src/components/Generic/FloatingDialog.tsx | 23 ++- src/components/HeaderBar/HeaderBar.tsx | 6 +- .../HeaderBar/Settings/Settings.tsx | 135 +++++++++++++++--- src/components/HeaderBar/WindowButtons.tsx | 49 ++++--- src/lib/settings.ts | 4 + src/lib/store/jotai/settings.ts | 4 + src/pages/testing.tsx | 19 +-- 11 files changed, 172 insertions(+), 103 deletions(-) delete mode 100644 .github/workflows/build-validation.yml create mode 100644 src/lib/store/jotai/settings.ts diff --git a/.github/workflows/build-validation.yml b/.github/workflows/build-validation.yml deleted file mode 100644 index c9ae82a..0000000 --- a/.github/workflows/build-validation.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Test Build Frontend - -on: - push: - branches: - - "*" - -jobs: - build: - runs-on: ubuntu-latest - container: - image: oven/bun - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Install Rustup and Cargo - run: | - apt update - apt install curl -y - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - . "/root/.cargo/env" - - - name: bun install - run: | - bun install - - - name: bun run tauri build - run: | - NO_STRIP=true bun run tauri build - echo "winning ranks" diff --git a/.prettierrc b/.prettierrc index 794bbbd..5189c3a 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,7 +5,7 @@ "endOfLine": "lf", "htmlWhitespaceSensitivity": "css", "jsxBracketSameLine": false, - "jsxSingleQuote": true, + "jsxSingleQuote": false, "printWidth": 120, "proseWrap": "preserve", "quoteProps": "consistent", diff --git a/bun.lockb b/bun.lockb index 3b9fabc2ceb57cd32ccb8976b5229ba28d323403..f4ba319658f6801bcaa57799fbfba9c2045061a5 100755 GIT binary patch delta 31475 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 H`=|duQUy^l delta 29799 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 Sbd>(3y%ktfwW$@E^M3#+uLjTn diff --git a/package.json b/package.json index 52feba7..6c2f6f7 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@emotion/server": "^11.11.0", "@emotion/styled": "^11.13.0", "@mui/icons-material": "^5.16.6", + "@mui/lab": "^5.0.0-alpha.173", "@mui/material": "^5.16.6", "@tauri-apps/api": "^1.6.0", "jotai": "^2.9.1", diff --git a/src/components/Generic/FloatingDialog.tsx b/src/components/Generic/FloatingDialog.tsx index e0bf96a..4274dad 100644 --- a/src/components/Generic/FloatingDialog.tsx +++ b/src/components/Generic/FloatingDialog.tsx @@ -12,9 +12,8 @@ interface FloatingDialog { openButton: ReactNode; openState: boolean; setMaximisedState: (state: boolean) => void; - sx?: any; title: string; - toggleOpen: () => void; + sx?: any; } export const FloatingDialog: FC = ({ @@ -26,9 +25,8 @@ export const FloatingDialog: FC = ({ openButton, openState, setMaximisedState, - sx, title, - toggleOpen, + sx, }) => { const { settings } = useSettings(); @@ -36,18 +34,17 @@ export const FloatingDialog: FC = ({ <> {openButton} - + = ({ transform: "translate(-50%, -50%)", transition: "all ease-in-out", transitionDuration: settings.display.transition_duration + "ms", - width: maximisedState - ? "100vw" - : settings.display.window_width + "px", + width: maximisedState ? "100vw" : settings.display.window_width + "px", }} > { const router = useRouter(); @@ -46,8 +47,9 @@ export const HeaderBar = () => { router.push("/testing"); }} > - + + diff --git a/src/components/HeaderBar/Settings/Settings.tsx b/src/components/HeaderBar/Settings/Settings.tsx index d6c0f0e..088235c 100644 --- a/src/components/HeaderBar/Settings/Settings.tsx +++ b/src/components/HeaderBar/Settings/Settings.tsx @@ -1,20 +1,119 @@ -// import { IconButton, Typography, useTheme } from "@mui/material"; -// import { FloatingDialog } from "../../Generic/FloatingDialog"; -// import { SettingsCell, SettingsOutlined } from "@mui/icons-material"; +import { SettingsOutlined } from "@mui/icons-material"; +import { LoadingButton } from "@mui/lab"; +import { Box, Button, IconButton, Typography, useTheme } from "@mui/material"; +import { useAtom } from "jotai"; +import { useEffect, useState } from "react"; +import { useSettings } from "../../../contexts/SettingsContext"; +import { settingsAtom } from "../../../lib/store/jotai/settings"; +import { FloatingDialog } from "../../Generic/FloatingDialog"; -// export const Settings = () => { -// // contexts -// const theme = useTheme(); -// const { settings, updateSettingsLocal } = useSettings(); +export const Settings = () => { + // contexts + const theme = useTheme(); + const { settings, updateSettings, resetSettings } = useSettings(); -// return ( -// Settings} -// openButton={ -// -// -// -// } -// /> -// ); -// }; + // atoms + const [stagedSettings, setStagedSettings] = useAtom(settingsAtom); + + // states + const [settingsOpenState, setSettingsOpenState] = useState(false); + const [settingsMaximisedState, setSettingsMaximisedState] = useState(false); + const [subTabValue, setSubTabValue] = useState("display"); + const [applyLoading, setApplyLoading] = useState(false); + const [saveLoading, setSaveLoading] = useState(false); + + const toggleSettings = () => { + // reset the settings maximised state + setSettingsMaximisedState(false); + setSettingsOpenState((prevState) => !prevState); + }; + + const closeSettings = () => { + setSettingsOpenState(false); + }; + + // logic for switching tabs + const subTabChangeEvent = (newTabValue: string) => { + setSubTabValue(newTabValue); + }; + + const applyClickEvent = () => { + setApplyLoading(true); + + updateSettings(stagedSettings); + + setApplyLoading(false); + }; + + const saveClickEvent = () => { + setSaveLoading(true); + + updateSettings(stagedSettings); + + setSaveLoading(false); + closeSettings(); + }; + + useEffect(() => { + setStagedSettings(settings); + }, [setStagedSettings, settings]); + + return ( + Settings} + bottomBar={ + + + + + Apply + + + Save + + + } + close={closeSettings} + maximisedState={settingsMaximisedState} + openButton={ + + + + } + openState={settingsOpenState} + setMaximisedState={setSettingsMaximisedState} + title="Settings" + /> + ); +}; diff --git a/src/components/HeaderBar/WindowButtons.tsx b/src/components/HeaderBar/WindowButtons.tsx index 835f8d1..a79f08a 100644 --- a/src/components/HeaderBar/WindowButtons.tsx +++ b/src/components/HeaderBar/WindowButtons.tsx @@ -1,11 +1,16 @@ import { Close, CloseFullscreen, Minimize } from "@mui/icons-material"; -import { Box, Button, ButtonGroup, Stack, useTheme } from "@mui/material"; +import { Box, Button, ButtonGroup, IconButton, Stack, useTheme } from "@mui/material"; import { WebviewWindow } from "@tauri-apps/api/window"; import { useEffect, useState } from "react"; +import { useSettings } from "../../contexts/SettingsContext"; +import { exit } from "@tauri-apps/api/process"; export const WindowButtons = () => { + // contexts const userTheme = useTheme(); + const { settings } = useSettings(); + // states const [appWindow, setAppWindow] = useState(); // explanation: @@ -27,8 +32,8 @@ export const WindowButtons = () => { appWindow?.toggleMaximize(); }; - const close = () => { - appWindow?.close(); + const close = async () => { + await exit(1); }; useEffect(() => { @@ -37,10 +42,14 @@ export const WindowButtons = () => { return ( - - - - - - + + )} + + + ); diff --git a/src/lib/settings.ts b/src/lib/settings.ts index 271d618..d286767 100644 --- a/src/lib/settings.ts +++ b/src/lib/settings.ts @@ -12,6 +12,10 @@ export const defaultSettings = { font_family: "monospace" as string, font_scaling: 100, }, + window: { + minimize_button: false as boolean, + maximize_button: false as boolean, + }, }; export type SettingsType = typeof defaultSettings; diff --git a/src/lib/store/jotai/settings.ts b/src/lib/store/jotai/settings.ts new file mode 100644 index 0000000..50fd9b1 --- /dev/null +++ b/src/lib/store/jotai/settings.ts @@ -0,0 +1,4 @@ +import { atom } from "jotai"; +import { defaultSettings } from "../../settings"; + +export const settingsAtom = atom(defaultSettings); diff --git a/src/pages/testing.tsx b/src/pages/testing.tsx index f8f9c24..298a0c6 100644 --- a/src/pages/testing.tsx +++ b/src/pages/testing.tsx @@ -29,24 +29,7 @@ export default function Testing() { > reset settings - +