Reactive-Resume/client/wrappers/ThemeWrapper.tsx

35 lines
1.0 KiB
TypeScript
Raw Normal View History

import { ThemeProvider } from '@mui/material';
2022-03-02 16:44:11 +00:00
import { useEffect, useMemo } from 'react';
import { darkTheme, lightTheme } from '@/config/theme';
import { setTheme } from '@/store/build/buildSlice';
2022-03-02 16:44:11 +00:00
import { useAppDispatch, useAppSelector } from '@/store/hooks';
2022-04-30 10:58:17 +00:00
const ThemeWrapper: React.FC<React.PropsWithChildren<unknown>> = ({ children }) => {
2022-03-02 16:44:11 +00:00
const dispatch = useAppDispatch();
const theme = useAppSelector((state) => state.build.theme);
2022-03-02 16:44:11 +00:00
const isDarkMode = useMemo(() => theme === 'dark', [theme]);
const muiTheme = useMemo(() => (isDarkMode ? darkTheme : lightTheme), [isDarkMode]);
useEffect(() => {
if (theme === undefined) {
dispatch(setTheme({ theme: 'dark' }));
2022-03-02 16:44:11 +00:00
}
}, [theme, dispatch]);
2022-03-02 16:44:11 +00:00
useEffect(() => {
if (isDarkMode) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
}, [isDarkMode]);
return <ThemeProvider theme={muiTheme}>{children}</ThemeProvider>;
};
export default ThemeWrapper;