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}
+
+
+ );
+};