session-desktop/ts/themes/switchTheme.tsx
2022-10-12 16:49:43 +11:00

63 lines
1.9 KiB
TypeScript

import { Dispatch } from '@reduxjs/toolkit';
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);
}
}
}
}
}