demeter
Autonomous Hydroponic Intelligencegit clone https://github.com/maydayv7/demeter
frontend/src/hooks/useSettings.js (1752B)
1import React, { createContext, useContext, useState, useEffect } from "react";
2
3const DEFAULTS = {
4 userName: "Rajesh Rai",
5 userDesignation: "Farm Owner",
6 userInitials: "R",
7 theme: "dark",
8 language: "en",
9 maxResultsPerPage: 12,
10 alertsShowAcked: false,
11 compactMode: false,
12 onboardingDone: false,
13 historyLogLimit: 20,
14};
15
16const SettingsContext = createContext();
17
18const STORAGE_KEY = "demeter_settings";
19
20export function SettingsProvider({ children }) {
21 const [settings, setSettings] = useState(() => {
22 try {
23 const stored = localStorage.getItem(STORAGE_KEY);
24 return stored ? { ...DEFAULTS, ...JSON.parse(stored) } : DEFAULTS;
25 } catch {
26 return DEFAULTS;
27 }
28 });
29
30 // Persist on change
31 useEffect(() => {
32 localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
33 }, [settings]);
34
35 // Apply theme to <html>
36 useEffect(() => {
37 const theme =
38 settings.theme === "auto"
39 ? window.matchMedia("(prefers-color-scheme: dark)").matches
40 ? "dark"
41 : "light"
42 : settings.theme;
43 document.documentElement.setAttribute("data-theme", theme);
44 }, [settings.theme]);
45
46 // Use Noto Sans for Hindi
47 useEffect(() => {
48 if (settings.language === "hi") {
49 document.documentElement.setAttribute("data-lang", "hi");
50 } else {
51 document.documentElement.setAttribute("data-lang", "en");
52 }
53 }, [settings.language]);
54
55 const update = (key, value) =>
56 setSettings((prev) => ({ ...prev, [key]: value }));
57
58 const reset = () => setSettings(DEFAULTS);
59
60 return (
61 <SettingsContext.Provider value={{ settings, update, reset }}>
62 {children}
63 </SettingsContext.Provider>
64 );
65}
66
67export const useSettings = () => useContext(SettingsContext);