Fix theme mode fallback

This commit is contained in:
Natsumi
2026-01-10 21:21:02 +13:00
parent e7cfc945da
commit ffb091e4a9
5 changed files with 19 additions and 69 deletions
+1 -1
View File
@@ -516,7 +516,7 @@
const handleThemeSelect = (theme) => { const handleThemeSelect = (theme) => {
themeMenuVisible.value = false; themeMenuVisible.value = false;
settingsMenuVisible.value = false; settingsMenuVisible.value = false;
appearanceSettingsStore.saveThemeMode(theme); appearanceSettingsStore.setThemeMode(theme);
}; };
const handleThemeColorSelect = async (colorFamily) => { const handleThemeColorSelect = async (colorFamily) => {
-2
View File
@@ -23,9 +23,7 @@ export async function initUi() {
const { initThemeMode, isDarkMode } = const { initThemeMode, isDarkMode } =
await getThemeMode(configRepository); await getThemeMode(configRepository);
setLoginContainerStyle(isDarkMode); setLoginContainerStyle(isDarkMode);
changeAppDarkStyle(isDarkMode);
changeAppThemeStyle(initThemeMode); changeAppThemeStyle(initThemeMode);
} catch (error) { } catch (error) {
console.error('Error initializing locale and theme:', error); console.error('Error initializing locale and theme:', error);
+7 -4
View File
@@ -6,6 +6,8 @@ import { i18n } from '../../../plugin/i18n';
import { router } from '../../../plugin/router'; import { router } from '../../../plugin/router';
import { useAppearanceSettingsStore } from '../../../stores'; import { useAppearanceSettingsStore } from '../../../stores';
import configRepository from '../../../service/config.js';
/** /**
* *
* @returns {boolean} * @returns {boolean}
@@ -74,11 +76,11 @@ function changeAppThemeStyle(themeMode) {
let themeConfig = THEME_CONFIG[themeMode]; let themeConfig = THEME_CONFIG[themeMode];
if (!themeConfig) { if (!themeConfig) {
// fallback to system
console.error('Invalid theme mode:', themeMode); console.error('Invalid theme mode:', themeMode);
themeMode = 'dark'; configRepository.setString('VRCX_ThemeMode', 'system');
themeMode = systemIsDarkMode() ? 'dark' : 'light';
themeConfig = THEME_CONFIG[themeMode]; themeConfig = THEME_CONFIG[themeMode];
const appSettingsStore = useAppearanceSettingsStore();
appSettingsStore.setThemeMode(themeMode);
} }
const cssFiles = Array.isArray(themeConfig.cssFiles) const cssFiles = Array.isArray(themeConfig.cssFiles)
@@ -116,6 +118,8 @@ function changeAppThemeStyle(themeMode) {
} }
changeAppDarkStyle(themeConfig.isDark); changeAppDarkStyle(themeConfig.isDark);
return { isDark: themeConfig.isDark };
// let $appThemeDarkStyle = document.getElementById('app-theme-dark-style'); // let $appThemeDarkStyle = document.getElementById('app-theme-dark-style');
// const darkThemeCssPath = `${filePathPrefix}theme.dark.css`; // const darkThemeCssPath = `${filePathPrefix}theme.dark.css`;
// const shouldApplyDarkBase = themeConfig.isDark; // const shouldApplyDarkBase = themeConfig.isDark;
@@ -313,7 +317,6 @@ async function getThemeMode(configRepository) {
); );
let isDarkMode; let isDarkMode;
if (initThemeMode === 'light') { if (initThemeMode === 'light') {
isDarkMode = false; isDarkMode = false;
} else if (initThemeMode === 'system') { } else if (initThemeMode === 'system') {
+9 -60
View File
@@ -6,13 +6,10 @@ import { useRouter } from 'vue-router';
import { import {
HueToHex, HueToHex,
changeAppDarkStyle,
changeAppThemeStyle, changeAppThemeStyle,
changeHtmlLangAttribute, changeHtmlLangAttribute,
systemIsDarkMode,
updateTrustColorClasses updateTrustColorClasses
} from '../../shared/utils/base/ui'; } from '../../shared/utils/base/ui';
import { THEME_CONFIG } from '../../shared/constants';
import { database } from '../../service/database'; import { database } from '../../service/database';
import { getNameColour } from '../../shared/utils'; import { getNameColour } from '../../shared/utils';
import { languageCodes } from '../../localization'; import { languageCodes } from '../../localization';
@@ -204,16 +201,8 @@ export const useAppearanceSettingsStore = defineStore(
await changeAppLanguage(appLanguageConfig); await changeAppLanguage(appLanguageConfig);
} }
const normalizedThemeMode = normalizeThemeMode(themeModeConfig); themeMode.value = themeModeConfig;
if (normalizedThemeMode !== themeModeConfig) { setThemeMode(themeModeConfig);
configRepository.setString(
'VRCX_ThemeMode',
normalizedThemeMode
);
}
themeMode.value = normalizedThemeMode;
applyThemeMode();
await initPrimaryColor(); await initPrimaryColor();
displayVRCPlusIconsAsAvatar.value = displayVRCPlusIconsAsAvatar.value =
@@ -289,14 +278,6 @@ export const useAppearanceSettingsStore = defineStore(
{ flush: 'sync' } { flush: 'sync' }
); );
function normalizeThemeMode(mode) {
if (Object.prototype.hasOwnProperty.call(THEME_CONFIG, mode)) {
return mode;
} else {
return 'dark';
}
}
/** /**
* *
* @param {string} language * @param {string} language
@@ -321,21 +302,6 @@ export const useAppearanceSettingsStore = defineStore(
changeHtmlLangAttribute(language); changeHtmlLangAttribute(language);
} }
/**
* @param {string} newThemeMode
* @returns {Promise<void>}
*/
async function saveThemeMode(newThemeMode) {
setThemeMode(newThemeMode);
await changeThemeMode();
}
async function changeThemeMode() {
await changeAppThemeStyle(themeMode.value);
vrStore.updateVRConfigVars();
await updateTrustColor(undefined, undefined);
}
/** /**
* *
* @param {string} field * @param {string} field
@@ -463,7 +429,7 @@ export const useAppearanceSettingsStore = defineStore(
.matchMedia('(prefers-color-scheme: dark)') .matchMedia('(prefers-color-scheme: dark)')
.addEventListener('change', async () => { .addEventListener('change', async () => {
if (themeMode.value === 'system') { if (themeMode.value === 'system') {
await changeThemeMode(); setThemeMode(themeMode.value);
} }
}); });
@@ -471,29 +437,14 @@ export const useAppearanceSettingsStore = defineStore(
* @param {string} mode * @param {string} mode
*/ */
function setThemeMode(mode) { function setThemeMode(mode) {
const normalizedThemeMode = normalizeThemeMode(mode); themeMode.value = mode;
themeMode.value = normalizedThemeMode; configRepository.setString('VRCX_ThemeMode', mode);
configRepository.setString('VRCX_ThemeMode', normalizedThemeMode); const { isDark } = changeAppThemeStyle(mode);
applyThemeMode();
}
function applyThemeMode() {
if (themeMode.value === 'light') {
setIsDarkMode(false);
} else if (themeMode.value === 'system') {
setIsDarkMode(systemIsDarkMode());
} else {
setIsDarkMode(true);
}
}
/**
* @param {boolean} isDark
*/
function setIsDarkMode(isDark) {
isDarkMode.value = isDark; isDarkMode.value = isDark;
changeAppDarkStyle(isDark); vrStore.updateVRConfigVars();
updateTrustColor(undefined, undefined);
} }
function setDisplayVRCPlusIconsAsAvatar() { function setDisplayVRCPlusIconsAsAvatar() {
displayVRCPlusIconsAsAvatar.value = displayVRCPlusIconsAsAvatar.value =
!displayVRCPlusIconsAsAvatar.value; !displayVRCPlusIconsAsAvatar.value;
@@ -904,10 +855,8 @@ export const useAppearanceSettingsStore = defineStore(
setRandomUserColours, setRandomUserColours,
setCompactTableMode, setCompactTableMode,
setTrustColor, setTrustColor,
saveThemeMode,
tryInitUserColours, tryInitUserColours,
updateTrustColor, updateTrustColor,
changeThemeMode,
userColourInit, userColourInit,
applyUserTrustLevel, applyUserTrustLevel,
changeAppLanguage, changeAppLanguage,
@@ -19,7 +19,7 @@
</div> </div>
<div class="options-container-item"> <div class="options-container-item">
<span class="name">{{ t('view.settings.appearance.appearance.theme_mode') }}</span> <span class="name">{{ t('view.settings.appearance.appearance.theme_mode') }}</span>
<Select :model-value="themeMode" @update:modelValue="saveThemeMode"> <Select :model-value="themeMode" @update:modelValue="setThemeMode">
<SelectTrigger size="sm"> <SelectTrigger size="sm">
<SelectValue :placeholder="t(`view.settings.appearance.appearance.theme_mode_${themeMode}`)" /> <SelectValue :placeholder="t(`view.settings.appearance.appearance.theme_mode_${themeMode}`)" />
</SelectTrigger> </SelectTrigger>
@@ -437,7 +437,7 @@
setHideUserMemos, setHideUserMemos,
setHideUnfriends, setHideUnfriends,
updateTrustColor, updateTrustColor,
saveThemeMode, setThemeMode,
changeAppLanguage, changeAppLanguage,
promptMaxTableSizeDialog, promptMaxTableSizeDialog,
setNotificationIconDot, setNotificationIconDot,