ColorMode.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import React, { useState, useEffect } from 'react';
  2. import useMediaQuery from '@mui/material/useMediaQuery';
  3. import { createTheme } from '@mui/material/styles';
  4. import getCommonThemes from '../styles/theme';
  5. import { ThemeProvider } from '@mui/material';
  6. export const ColorModeContext = React.createContext({
  7. toggleColorMode: () => {},
  8. mode: 'light',
  9. });
  10. import { ATTU_THEME_MODE } from '@/consts';
  11. const { Provider } = ColorModeContext;
  12. type theme = 'light' | 'dark';
  13. export const ColorModeProvider = (props: { children: React.ReactNode }) => {
  14. const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
  15. const systemTheme = prefersDarkMode ? 'dark' : 'light';
  16. const userThemeMode = localStorage.getItem(ATTU_THEME_MODE) || systemTheme;
  17. const [mode, setMode] = useState<theme>(userThemeMode as theme);
  18. const theme = React.useMemo(() => createTheme(getCommonThemes(mode)), [mode]);
  19. const toggleColorMode = () => {
  20. setMode(prevMode => (prevMode === 'light' ? 'dark' : 'light'));
  21. };
  22. // store the current mode in localStorage
  23. useEffect(() => {
  24. localStorage.setItem(ATTU_THEME_MODE, mode);
  25. }, [mode]);
  26. return (
  27. <Provider value={{ toggleColorMode, mode }}>
  28. <ThemeProvider theme={theme}>{props.children}</ThemeProvider>
  29. </Provider>
  30. );
  31. };