@@ -4,6 +4,8 @@ import IconButton from '@mui/material/IconButton';
44import Tooltip from '@mui/material/Tooltip' ;
55import DarkModeOutlined from '@mui/icons-material/DarkModeOutlined' ;
66import LightModeOutlined from '@mui/icons-material/LightModeOutlined' ;
7+ import useMediaQuery from '@mui/material/useMediaQuery' ;
8+ import { useChangeTheme } from 'docs/src/modules/components/ThemeContext' ;
79
810function CssVarsModeToggle ( props : { onChange : ( checked : boolean ) => void } ) {
911 const [ mounted , setMounted ] = React . useState ( false ) ;
@@ -34,29 +36,55 @@ function CssVarsModeToggle(props: { onChange: (checked: boolean) => void }) {
3436 ) ;
3537}
3638
37- export default function ThemeModeToggle ( props : {
38- checked : boolean ;
39- onChange : ( checked : boolean ) => void ;
40- } ) {
39+ export default function ThemeModeToggle ( ) {
4140 const theme = useTheme ( ) ;
41+ const changeTheme = useChangeTheme ( ) ;
42+ const [ mode , setMode ] = React . useState < string | null > ( null ) ;
43+ const prefersDarkMode = useMediaQuery ( '(prefers-color-scheme: dark)' ) ;
44+
45+ React . useEffect ( ( ) => {
46+ let initialMode = 'system' ;
47+ try {
48+ initialMode = localStorage . getItem ( 'mui-mode' ) || initialMode ;
49+ } catch ( error ) {
50+ // do nothing
51+ }
52+ setMode ( initialMode ) ;
53+ } , [ ] ) ;
54+
55+ const handleChangeThemeMode = ( checked : boolean ) => {
56+ const paletteMode = checked ? 'dark' : 'light' ;
57+ setMode ( paletteMode ) ;
58+
59+ try {
60+ localStorage . setItem ( 'mui-mode' , paletteMode ) ; // syncing with homepage, can be removed once all pages are migrated to CSS variables
61+ } catch ( error ) {
62+ // do nothing
63+ }
64+ changeTheme ( { paletteMode } ) ;
65+ } ;
66+
67+ if ( mode === null ) {
68+ return < IconButton color = "primary" disableTouchRipple /> ;
69+ }
70+
4271 if ( theme . vars ) {
4372 // Temporarily renders conditionally because `useColorScheme` could not be used in the pages that haven't migrated to CSS theme variables.
44- return < CssVarsModeToggle { ... props } /> ;
73+ return < CssVarsModeToggle onChange = { handleChangeThemeMode } /> ;
4574 }
75+
76+ const checked = mode === 'system' ? prefersDarkMode : mode === 'dark' ;
77+
4678 return (
47- < Tooltip title = { props . checked ? 'Turn on the light' : 'Turn off the light' } >
79+ < Tooltip title = { checked ? 'Turn on the light' : 'Turn off the light' } >
4880 < IconButton
4981 color = "primary"
5082 disableTouchRipple
5183 onClick = { ( ) => {
52- props . onChange ( ! props . checked ) ;
84+ handleChangeThemeMode ( ! checked ) ;
5385 } }
5486 >
55- { props . checked ? (
56- < LightModeOutlined fontSize = "small" />
57- ) : (
58- < DarkModeOutlined fontSize = "small" />
59- ) }
87+ { checked ? < LightModeOutlined fontSize = "small" /> : < DarkModeOutlined fontSize = "small" /> }
6088 </ IconButton >
6189 </ Tooltip >
6290 ) ;
0 commit comments