aboutsummaryrefslogtreecommitdiffstats
path: root/webui/src/components/Themer.tsx
blob: 13d098da2e4c2edef7401db9b6dc0a82c4c6b22c (plain) (blame)
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import React, { createContext, useCallback, useContext, useState } from 'react';

import { ThemeProvider } from '@material-ui/core';
import IconButton from '@material-ui/core/IconButton/IconButton';
import Tooltip from '@material-ui/core/Tooltip/Tooltip';
import { createMuiTheme, ThemeOptions } from '@material-ui/core/styles';
import { NightsStayRounded, WbSunnyRounded } from '@material-ui/icons';

const defaultTheme: ThemeOptions = {
  palette: {
    type: 'light',
    primary: {
      main: '#263238',
    },
  },
};

const ThemeContext = createContext({
  toggleMode: () => {},
  mode: '',
});

const LightSwitch = () => {
  const { mode, toggleMode } = useContext(ThemeContext);

  return (
    <Tooltip title="Toggle Dark-/Lightmode">
      <IconButton onClick={toggleMode} aria-label="Toggle Dark-/Lightmode">
        {mode === 'light' ? (
          <WbSunnyRounded color="secondary" />
        ) : (
          <NightsStayRounded color="secondary" />
        )}
      </IconButton>
    </Tooltip>
  );
};

type Props = { children: React.ReactNode };
const Themer = ({ children }: Props) => {
  const [theme, setTheme] = useState(defaultTheme);

  const toggleMode = useCallback(() => {
    const newMode = theme.palette?.type === 'dark' ? 'light' : 'dark';
    const adjustedTheme: ThemeOptions = {
      ...theme,
      palette: {
        ...theme.palette,
        type: newMode,
      },
    };
    setTheme(adjustedTheme);
  }, [theme, setTheme]);

  const newMode = theme.palette?.type === 'dark' ? 'light' : 'dark';

  return (
    <ThemeContext.Provider value={{ toggleMode: toggleMode, mode: newMode }}>
      <ThemeProvider theme={createMuiTheme(theme)}> {children} </ThemeProvider>
    </ThemeContext.Provider>
  );
};

export { Themer as default, LightSwitch };