prometheus
48 строк · 1.7 Кб
1import React, { FC, useEffect } from 'react';
2import { Form, Button, ButtonGroup } from 'reactstrap';
3import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4import { faMoon, faSun, faAdjust } from '@fortawesome/free-solid-svg-icons';
5import { useTheme } from './contexts/ThemeContext';
6
7export const themeLocalStorageKey = 'user-prefers-color-scheme';
8
9export const Theme: FC = () => {
10const { theme } = useTheme();
11
12useEffect(() => {
13document.body.classList.toggle('bootstrap-dark', theme === 'dark');
14document.body.classList.toggle('bootstrap', theme === 'light');
15}, [theme]);
16
17return null;
18};
19
20export const ThemeToggle: FC = () => {
21const { userPreference, setTheme } = useTheme();
22
23return (
24<Form className="ml-auto" inline>
25<ButtonGroup size="sm">
26<Button
27color="secondary"
28title="Use light theme"
29active={userPreference === 'light'}
30onClick={() => setTheme('light')}
31>
32<FontAwesomeIcon icon={faSun} className={userPreference === 'light' ? 'text-white' : 'text-dark'} />
33</Button>
34<Button color="secondary" title="Use dark theme" active={userPreference === 'dark'} onClick={() => setTheme('dark')}>
35<FontAwesomeIcon icon={faMoon} className={userPreference === 'dark' ? 'text-white' : 'text-dark'} />
36</Button>
37<Button
38color="secondary"
39title="Use browser-preferred theme"
40active={userPreference === 'auto'}
41onClick={() => setTheme('auto')}
42>
43<FontAwesomeIcon icon={faAdjust} className={userPreference === 'auto' ? 'text-white' : 'text-dark'} />
44</Button>
45</ButtonGroup>
46</Form>
47);
48};
49