summaryrefslogtreecommitdiffstats
path: root/src/contexts/Settings.tsx
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2024-09-04 10:27:24 +0200
committerGravatar Tom van der Lee <tom@vanderlee.io>2024-09-04 10:27:24 +0200
commita087494f6809a7a8ea8e6c27a105d8c8f0f3839e (patch)
tree617c0dbd168d6e340923dd17b07cc8239787e196 /src/contexts/Settings.tsx
parentfe61544bafafc8b4de78cc71cb641af2dfb7b72d (diff)
downloadclient-a087494f6809a7a8ea8e6c27a105d8c8f0f3839e.tar.gz
client-a087494f6809a7a8ea8e6c27a105d8c8f0f3839e.tar.bz2
client-a087494f6809a7a8ea8e6c27a105d8c8f0f3839e.zip
Updated the libraries
Diffstat (limited to 'src/contexts/Settings.tsx')
-rw-r--r--src/contexts/Settings.tsx65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/contexts/Settings.tsx b/src/contexts/Settings.tsx
new file mode 100644
index 0000000..2bbebcc
--- /dev/null
+++ b/src/contexts/Settings.tsx
@@ -0,0 +1,65 @@
1import * as React from "react";
2import {
3 Context,
4 createContext,
5 PropsWithChildren,
6 useCallback,
7 useEffect,
8 useState,
9} from "react";
10import { Settings } from "~/types";
11
12interface SettingsApi {
13 darkMode: boolean;
14 setSetting: (key: keyof Settings, value: any) => void;
15}
16
17export const SettingsContext = createContext<Partial<SettingsApi>>(
18 {}
19) as Context<SettingsApi>;
20
21export default function SettingsProvider({ children }: PropsWithChildren<any>) {
22 // const themeConfig = useMemo(() => new ThemeConfig(), []);
23 const [settings, setSettings] = useState<Settings>(() => {
24 const stored = localStorage.getItem("settings");
25
26 if (stored) {
27 return JSON.parse(stored);
28 }
29
30 return {
31 darkMode:
32 window.matchMedia &&
33 window.matchMedia("(prefers-color-scheme: dark)").matches,
34 };
35 });
36
37 const setSetting = useCallback(
38 (key: keyof Settings, value: any) => {
39 const newSetting = {
40 ...settings,
41 [key]: value,
42 };
43 setSettings(newSetting);
44 localStorage.setItem("settings", JSON.stringify(newSetting));
45 },
46 [settings]
47 );
48
49 useEffect(() => {
50 document
51 .querySelector("html")
52 ?.setAttribute("data-bs-theme", settings.darkMode ? "dark" : "light");
53 }, [settings.darkMode]);
54
55 return (
56 <SettingsContext.Provider
57 value={{
58 darkMode: settings.darkMode,
59 setSetting,
60 }}
61 >
62 {children}
63 </SettingsContext.Provider>
64 );
65}