File size: 1,215 Bytes
41a71fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { useContext } from 'react';
import { LOCAL_STORAGE_THEME_KEY, Theme, ThemeContext } from './ThemeContext';

interface UseThemeResult {
    toggleTheme: (newTheme: Theme) => void;
    theme: Theme;
}

export function useTheme(): UseThemeResult {
    const { theme, setTheme } = useContext(ThemeContext);

    const toggleTheme = (newTheme: Theme) => {
        setTheme?.(newTheme);

        // Что бы не перетереть доп классы на body меняем только сам класс темы, а остальные оставляем как есть
        let bodyClassesArray: any = document.body.className.split(' ');

        if (bodyClassesArray.includes('light')) {
            bodyClassesArray.splice(bodyClassesArray.indexOf('light'), 1);
        }

        if (bodyClassesArray.includes('dark')) {
            bodyClassesArray.splice(bodyClassesArray.indexOf('dark'), 1);
        }

        bodyClassesArray = bodyClassesArray.join(' ');
        document.body.className = `${bodyClassesArray} ${newTheme || Theme.LIGHT}`;
        localStorage.setItem(LOCAL_STORAGE_THEME_KEY, newTheme);
    };

    return {
        theme: theme || Theme.LIGHT,
        toggleTheme,
    };
}