Files
EMLy/frontend/src/lib/stores/settings.svelte.ts
Flavio Fois fc98f0ed74 Patch 1.5.3, Fixes theme sync issue on first startup
Addresses a bug where the email viewer's dark mode setting was not correctly synchronized with the selected theme on the first application launch.

This ensures a consistent user experience regarding light/dark mode across the application and email viewer.
2026-02-10 19:57:53 +01:00

105 lines
3.2 KiB
TypeScript

import { browser } from "$app/environment";
import type { EMLy_GUI_Settings } from "$lib/types";
import { getFromLocalStorage, saveToLocalStorage } from "$lib/utils/localStorageHelper";
import { applyTheme, getStoredTheme } from "$lib/utils/theme";
import { setLocale } from "$lib/paraglide/runtime";
const STORAGE_KEY = "emly_gui_settings";
const defaults: EMLy_GUI_Settings = {
selectedLanguage: "it",
useBuiltinPreview: true,
useBuiltinPDFViewer: true,
previewFileSupportedTypes: ["jpg", "jpeg", "png"],
enableAttachedDebuggerProtection: true,
useDarkEmailViewer: true,
enableUpdateChecker: false,
musicInspirationEnabled: false,
reduceMotion: false,
theme: "dark",
increaseWindowButtonsContrast: false,
};
class SettingsStore {
settings = $state<EMLy_GUI_Settings>({ ...defaults });
hasHydrated = $state(false);
constructor() {
if (browser) {
this.load();
}
}
load() {
const stored = getFromLocalStorage(STORAGE_KEY);
if (stored) {
try {
this.settings = { ...this.settings, ...JSON.parse(stored) };
} catch (e) {
console.error("Failed to load settings", e);
}
}
// Migration: Check for legacy musicInspirationEnabled key
const legacyMusic = getFromLocalStorage("musicInspirationEnabled");
if (legacyMusic !== null) {
this.settings.musicInspirationEnabled = legacyMusic === "true";
localStorage.removeItem("musicInspirationEnabled");
this.save(); // Save immediately to persist the migration
}
// Sync theme from localStorage key used in app.html
const storedTheme = getStoredTheme();
if (!this.settings.theme) {
this.settings.theme = storedTheme;
} else if (this.settings.theme !== storedTheme) {
// If there's a mismatch, prioritize the theme from emly_theme key
this.settings.theme = storedTheme;
}
// Sync useDarkEmailViewer with theme
this.settings.useDarkEmailViewer = this.settings.theme === "dark";
// Apply the theme
applyTheme(this.settings.theme);
// Apply the language
if (this.settings.selectedLanguage) {
setLocale(this.settings.selectedLanguage);
}
// Save defaults/merged settings to storage if they didn't exist or were updated during load
if (!stored) {
this.save();
}
this.hasHydrated = true;
}
save() {
if (!browser) return;
saveToLocalStorage(STORAGE_KEY, JSON.stringify(this.settings));
}
update(newSettings: Partial<EMLy_GUI_Settings>) {
this.settings = { ...this.settings, ...newSettings };
// Apply theme if it changed
if (newSettings.theme && this.settings.theme) {
applyTheme(this.settings.theme);
}
this.save();
}
reset() {
this.settings = { ...defaults };
if (this.settings.theme) {
applyTheme(this.settings.theme);
}
this.save();
}
}
export const settingsStore = new SettingsStore();