import { Dispatch } from 'redux'; import { applyTheme } from '../state/ducks/theme'; import { classicDark, classicLight, oceanDark, oceanLight } from '.'; import { convertThemeStateToName, THEMES, ThemeStateType } from './constants/colors'; import { loadThemeColors } from './variableColors'; import { findPrimaryColorId, switchPrimaryColorTo } from './switchPrimaryColor'; type SwitchThemeProps = { theme: ThemeStateType; mainWindow?: boolean; usePrimaryColor?: boolean; dispatch?: Dispatch; }; export async function switchThemeTo(props: SwitchThemeProps) { const { theme, mainWindow, usePrimaryColor, dispatch } = props; let newTheme: ThemeStateType | null = null; switch (theme) { case 'classic-dark': loadThemeColors(classicDark); newTheme = 'classic-dark'; break; case 'classic-light': loadThemeColors(classicLight); newTheme = 'classic-light'; break; case 'ocean-dark': loadThemeColors(oceanDark); newTheme = 'ocean-dark'; break; case 'ocean-light': loadThemeColors(oceanLight); newTheme = 'ocean-light'; break; default: window.log.warn('Unsupported theme: ', theme); } if (newTheme) { if (mainWindow) { await window.setTheme(theme); } if (dispatch) { dispatch(applyTheme(newTheme)); if (usePrimaryColor) { // Set primary color after the theme is loaded so that it's not overwritten const primaryColor = window.Events.getPrimaryColorSetting(); await switchPrimaryColorTo(primaryColor, dispatch); } else { // By default, when we change themes we want to reset the primary color const defaultPrimaryColor = findPrimaryColorId( THEMES[convertThemeStateToName(newTheme)].PRIMARY ); if (defaultPrimaryColor) { await switchPrimaryColorTo(defaultPrimaryColor, dispatch); } } } } }