You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			62 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
import { ipcRenderer } from 'electron';
 | 
						|
 | 
						|
import { ReactNode } from 'react';
 | 
						|
import useMount from 'react-use/lib/useMount';
 | 
						|
import { SettingsKey } from '../data/settings-key';
 | 
						|
import { getOppositeTheme, isThemeMismatched } from '../util/theme';
 | 
						|
import { THEME_GLOBALS, setThemeValues } from './globals';
 | 
						|
import { switchThemeTo } from './switchTheme';
 | 
						|
 | 
						|
export async function ensureThemeConsistency(): Promise<boolean> {
 | 
						|
  const theme = window.Events.getThemeSetting();
 | 
						|
 | 
						|
  return new Promise(resolve => {
 | 
						|
    ipcRenderer.send('get-native-theme');
 | 
						|
    ipcRenderer.once('send-native-theme', (_, shouldUseDarkColors) => {
 | 
						|
      const isMismatchedTheme = isThemeMismatched(theme, shouldUseDarkColors);
 | 
						|
      if (isMismatchedTheme) {
 | 
						|
        const newTheme = getOppositeTheme(theme);
 | 
						|
        void switchThemeTo({
 | 
						|
          theme: newTheme,
 | 
						|
          mainWindow: true,
 | 
						|
          usePrimaryColor: true,
 | 
						|
          dispatch: window?.inboxStore?.dispatch,
 | 
						|
        });
 | 
						|
        resolve(true); // Theme was switched
 | 
						|
      } else {
 | 
						|
        resolve(false); // Theme was not switched
 | 
						|
      }
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
const setupTheme = async () => {
 | 
						|
  const shouldFollowSystemTheme = window.getSettingValue(SettingsKey.hasFollowSystemThemeEnabled);
 | 
						|
  const theme = window.Events.getThemeSetting();
 | 
						|
  const themeConfig = {
 | 
						|
    theme,
 | 
						|
    mainWindow: true,
 | 
						|
    usePrimaryColor: true,
 | 
						|
    dispatch: window?.inboxStore?.dispatch || undefined,
 | 
						|
  };
 | 
						|
 | 
						|
  if (shouldFollowSystemTheme) {
 | 
						|
    // Check if system theme matches currently set theme, if not switch it and return true, if matching return false
 | 
						|
    const wasThemeSwitched = await ensureThemeConsistency();
 | 
						|
    if (!wasThemeSwitched) {
 | 
						|
      // if theme wasn't switched them set theme to default
 | 
						|
      await switchThemeTo(themeConfig);
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    await switchThemeTo(themeConfig);
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
export const SessionTheme = ({ children }: { children: ReactNode }) => {
 | 
						|
  useMount(() => {
 | 
						|
    setThemeValues(THEME_GLOBALS);
 | 
						|
    void setupTheme();
 | 
						|
  });
 | 
						|
  return children;
 | 
						|
};
 |