From 067a13c1e866dd55c331f9bc7d87adacdde75c8d Mon Sep 17 00:00:00 2001 From: Donkie Date: Mon, 23 Oct 2023 22:22:47 +0200 Subject: [PATCH] Replaced colormode context with a generic solution --- client/src/App.tsx | 6 +-- client/src/components/header/index.tsx | 10 ++--- client/src/contexts/color-mode/index.tsx | 51 ------------------------ client/src/contexts/settings.tsx | 44 ++++++++++++++++++++ 4 files changed, 52 insertions(+), 59 deletions(-) delete mode 100644 client/src/contexts/color-mode/index.tsx create mode 100644 client/src/contexts/settings.tsx diff --git a/client/src/App.tsx b/client/src/App.tsx index 634bed4d..7c37e012 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -13,7 +13,6 @@ import routerBindings, { import dataProvider from "./components/dataProvider"; import { useTranslation } from "react-i18next"; import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom"; -import { ColorModeContextProvider } from "./contexts/color-mode"; import { FileOutlined, HighlightOutlined, UserOutlined } from "@ant-design/icons"; import { ConfigProvider } from "antd"; import React from "react"; @@ -23,6 +22,7 @@ import loadable from "@loadable/component"; import SpoolmanNotificationProvider from "./components/notificationProvider"; import { SpoolmanLayout } from "./components/layout"; import liveProvider from "./components/liveProvider"; +import { SettingsContextProvider } from "./contexts/settings"; interface PageProps { resource: "spools" | "filaments" | "vendors"; @@ -71,7 +71,7 @@ function App() { return ( - + - + ); diff --git a/client/src/components/header/index.tsx b/client/src/components/header/index.tsx index 84cab789..0e7dba02 100644 --- a/client/src/components/header/index.tsx +++ b/client/src/components/header/index.tsx @@ -3,11 +3,11 @@ import type { RefineThemedLayoutV2HeaderProps } from "@refinedev/antd"; import { useGetLocale, useSetLocale } from "@refinedev/core"; import { Button, Dropdown, Layout as AntdLayout, MenuProps, theme } from "antd"; import React, { useContext } from "react"; -import { ColorModeContext } from "../../contexts/color-mode"; import "/node_modules/flag-icons/css/flag-icons.min.css"; import { languages } from "../../i18n"; import QRCodeScannerModal from "../qrCodeScanner"; +import { SettingsContext } from "../../contexts/settings"; const { useToken } = theme; @@ -15,7 +15,7 @@ export const Header: React.FC = ({ sticky }) => const { token } = useToken(); const locale = useGetLocale(); const changeLanguage = useSetLocale(); - const { mode, setMode } = useContext(ColorModeContext); + const { settings, setSetting } = useContext(SettingsContext); const currentLocale = locale(); @@ -48,9 +48,9 @@ export const Header: React.FC = ({ sticky }) => items: [ { key: "colorMode", - onClick: () => setMode(mode === "dark" ? "dark" : "light"), - icon: mode === "dark" ? : , - label: mode === "dark" ? "Light Theme" : "Dark Theme", + onClick: () => setSetting("colorMode", settings.colorMode === "light" ? "dark" : "light"), + icon: settings.colorMode === "dark" ? : , + label: settings.colorMode === "dark" ? "Light Theme" : "Dark Theme", }, { key: "language", diff --git a/client/src/contexts/color-mode/index.tsx b/client/src/contexts/color-mode/index.tsx deleted file mode 100644 index 3dc3862c..00000000 --- a/client/src/contexts/color-mode/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { RefineThemes } from "@refinedev/antd"; -import { ConfigProvider, theme } from "antd"; -import { createContext, PropsWithChildren, useEffect, useState } from "react"; - -type ColorModeContextType = { - mode: string; - setMode: (mode: string) => void; -}; - -export const ColorModeContext = createContext({} as ColorModeContextType); - -export const ColorModeContextProvider: React.FC = ({ children }) => { - const colorModeFromLocalStorage = localStorage.getItem("colorMode"); - const isSystemPreferenceDark = window?.matchMedia("(prefers-color-scheme: dark)").matches; - - const systemPreference = isSystemPreferenceDark ? "dark" : "light"; - const [mode, setMode] = useState(colorModeFromLocalStorage || systemPreference); - - useEffect(() => { - window.localStorage.setItem("colorMode", mode); - }, [mode]); - - const setColorMode = () => { - if (mode === "light") { - setMode("dark"); - } else { - setMode("light"); - } - }; - - const { darkAlgorithm, defaultAlgorithm } = theme; - - return ( - - - {children} - - - ); -}; diff --git a/client/src/contexts/settings.tsx b/client/src/contexts/settings.tsx new file mode 100644 index 00000000..ed2e3da5 --- /dev/null +++ b/client/src/contexts/settings.tsx @@ -0,0 +1,44 @@ +import { RefineThemes } from "@refinedev/antd"; +import { ConfigProvider, theme } from "antd"; +import { createContext, PropsWithChildren } from "react"; +import { useSavedState } from "../utils/saveload"; + +type Settings = { + colorMode: "light" | "dark"; +}; + +type SettingsContextType = { + settings: Settings; + setSetting: (key: K, value: Settings[K]) => void; +}; + +const defaultSettings: Settings = { + colorMode: window?.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light", +}; + +export const SettingsContext = createContext({} as SettingsContextType); + +export const SettingsContextProvider: React.FC = ({ children }) => { + const [settings, setSetting] = useSavedState("settings", defaultSettings); + + const { darkAlgorithm, defaultAlgorithm } = theme; + + return ( + setSetting({ ...settings, [key]: value }), + settings, + }} + > + + {children} + + + ); +};