demeter

Autonomous Hydroponic Intelligence

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