@@ -882,12 +882,34 @@ function getFinalTheme(baseTheme) {
882882 } , baseTheme ) ;
883883}
884884
885+ /* Get the actual system theme is user selected system theme in preferences */
886+ function parseSystemTheme ( selectedTheme ) {
887+ if ( selectedTheme === 'system' ) {
888+ const systemMatchMedia = matchMedia ( '(prefers-color-scheme: dark)' ) ;
889+ return {
890+ 'theme' : systemMatchMedia . matches ? 'dark' : 'light' ,
891+ 'systemMatchMedia' : systemMatchMedia ,
892+ } ;
893+ }
894+ return {
895+ 'theme' : selectedTheme ,
896+ 'systemMatchMedia' : null ,
897+ } ;
898+ }
899+
885900/* Theme wrapper used by DOM containers to apply theme */
886901/* In future, this will be moved to App container */
887902export default function Theme ( { children} ) {
888903 const prefStore = usePreferences ( ) ;
889- const [ theme , setTheme ] = useState ( ) ;
904+ const selectedTheme =
905+ prefStore ?. getPreferencesForModule ( 'misc' ) ?. theme ||
906+ window . theme ||
907+ 'light' ;
908+
909+ // Initialize theme state
910+ const [ theme , setTheme ] = useState ( parseSystemTheme ( selectedTheme ) . theme ) ;
890911
912+ // Memoize the theme object
891913 const themeObj = useMemo ( ( ) => {
892914 let baseTheme = getLightTheme ( basicSettings ) ;
893915 switch ( theme ) {
@@ -901,31 +923,26 @@ export default function Theme({children}) {
901923 return getFinalTheme ( baseTheme ) ;
902924 } , [ theme ] ) ;
903925
926+ // Handle theme updates
904927 useEffect ( ( ) => {
905- const selectedTheme = prefStore . getPreferencesForModule ( 'misc' ) . theme ;
906- if ( theme && theme === selectedTheme ) {
907- return ;
908- } else {
909- if ( selectedTheme !== 'system' ) {
910- setTheme ( selectedTheme ) ;
911- return ;
912- }
913- const isSystemInDarkMode = matchMedia ( '(prefers-color-scheme: dark)' ) ;
914- setTheme ( isSystemInDarkMode . matches ? 'dark' : 'light' ) ;
915- const listener = ( event ) => {
916- setTheme ( event . matches ? 'dark' : 'light' ) ;
917- } ;
918- isSystemInDarkMode . addEventListener ( 'change' , listener ) ;
919- return ( ) => {
920- isSystemInDarkMode . removeEventListener ( 'change' , listener ) ;
921- } ;
922- }
923- } , [ prefStore ] ) ;
928+ let { theme, systemMatchMedia} = parseSystemTheme ( selectedTheme ) ;
929+ setTheme ( theme ) ;
930+
931+ const updateTheme = ( event ) => {
932+ const newTheme = event . matches ? 'dark' : 'light' ;
933+ setTheme ( newTheme ) ;
934+ } ;
935+ systemMatchMedia ?. addEventListener ( 'change' , updateTheme ) ;
936+
937+ return ( ) => {
938+ systemMatchMedia ?. removeEventListener ( 'change' , updateTheme ) ;
939+ } ;
940+ } , [ selectedTheme ] ) ;
924941
925942 return (
926943 < ThemeProvider theme = { themeObj } >
927944 < CssBaseline />
928- < LocalizationProvider dateAdapter = { AdapterDateFns } >
945+ < LocalizationProvider dateAdapter = { AdapterDateFns } >
929946 { children }
930947 </ LocalizationProvider >
931948 </ ThemeProvider >
0 commit comments