summaryrefslogtreecommitdiffstats
path: root/src/contexts/DarkMode.tsx
blob: 4326fe91353614066631c3d434d9d688c9376cfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import * as React from "react";
import {
  Context,
  createContext,
  ReactNode,
  useEffect,
  useMemo,
  useState,
} from "react";
import { ThemeConfig } from "bootstrap-darkmode";

interface DarkModeApi {
  darkMode: boolean;
  toggle: () => void;
}

export const DarkModeContext = createContext<Partial<DarkModeApi>>(
  {}
) as Context<DarkModeApi>;
interface DarkModeProviderProps {
  children: ReactNode;
}

export default function DarkModeProvider({ children }: DarkModeProviderProps) {
  const themeConfig = useMemo(() => new ThemeConfig(), []);
  const [darkMode, setDarkMode] = useState(
    () => themeConfig.getTheme() === "dark"
  );

  useEffect(() => {
    themeConfig.setTheme(darkMode ? "dark" : "light");
  }, [darkMode]);

  return (
    <DarkModeContext.Provider
      value={{
        darkMode,
        toggle: () => setDarkMode((dm) => !dm),
      }}
    >
      {children}
    </DarkModeContext.Provider>
  );
}