Rocket.Chat.ReactNative/app/utils/theme.js

70 lines
2.0 KiB
JavaScript
Raw Normal View History

2019-12-04 16:39:53 +00:00
import { Appearance } from 'react-native-appearance';
import changeNavigationBarColor from 'react-native-navigation-bar-color';
import setRootViewColor from 'rn-root-view';
import { themes } from '../constants/colors';
import { isAndroid } from './deviceInfo';
2019-12-04 16:39:53 +00:00
let themeListener;
export const defaultTheme = () => {
const systemTheme = Appearance.getColorScheme();
if (systemTheme && systemTheme !== 'no-preference') {
return systemTheme;
}
return 'light';
};
export const getTheme = themePreferences => {
2019-12-04 16:39:53 +00:00
const { darkLevel, currentTheme } = themePreferences;
let theme = currentTheme;
if (currentTheme === 'automatic') {
theme = defaultTheme();
}
return theme === 'dark' ? darkLevel : 'light';
};
export const newThemeState = (prevState, newTheme) => {
// new theme preferences
const themePreferences = {
...prevState.themePreferences,
...newTheme
};
// set new state of themePreferences
// and theme (based on themePreferences)
return { themePreferences, theme: getTheme(themePreferences) };
};
export const setNativeTheme = async themePreferences => {
2019-12-04 16:39:53 +00:00
const theme = getTheme(themePreferences);
if (isAndroid) {
const iconsLight = theme === 'light';
try {
await changeNavigationBarColor(themes[theme].navbarBackground, iconsLight);
} catch (error) {
// Do nothing
}
2019-12-04 16:39:53 +00:00
}
setRootViewColor(themes[theme].backgroundColor);
};
export const unsubscribeTheme = () => {
if (themeListener && themeListener.remove) {
themeListener.remove();
themeListener = null;
}
};
export const subscribeTheme = (themePreferences, setTheme) => {
const { currentTheme } = themePreferences;
if (!themeListener && currentTheme === 'automatic') {
// not use listener params because we use getTheme
themeListener = Appearance.addChangeListener(() => setTheme());
} else if (currentTheme !== 'automatic') {
// unsubscribe appearance changes when automatic was disabled
unsubscribeTheme();
}
// set native components theme
setNativeTheme(themePreferences);
};