summaryrefslogtreecommitdiffstats
path: root/src/contexts/DarkMode.tsx
blob: 6dc1c31fc88c34330c93f401b530802181926d80 (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
import * as React from "react";
import {
  Context,
  createContext,
  ReactElement,
  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>
  )
}