fix(preferences): use Object.assign mutation to prevent infinite effect loops
Replacing the preferences object (spread reassignment) caused all consumers' prefs references to go stale — the loop guard read the old value forever. Svelte 5 shared state pattern requires a stable const object with property mutations, not reassignment. Also removes duplicate theme sync $effect from SettingsPage (already handled in +layout.svelte).
This commit is contained in:
@@ -281,14 +281,6 @@
|
||||
saveSettings();
|
||||
});
|
||||
|
||||
// Sync theme setting to preferences store
|
||||
$effect(() => {
|
||||
const map = { Dark: 'dark', Light: 'light', System: 'system' };
|
||||
const mapped = map[settings.theme] || 'dark';
|
||||
if (prefs.theme !== mapped) {
|
||||
updatePreferences({ theme: mapped });
|
||||
}
|
||||
});
|
||||
|
||||
$effect(() => {
|
||||
settings.engine;
|
||||
|
||||
@@ -98,7 +98,9 @@ function persistToSQLite(prefs) {
|
||||
}, 500);
|
||||
}
|
||||
|
||||
let preferences = $state(readFromDOM());
|
||||
// Export as const so it is never reassigned — consumers hold a stable reference
|
||||
// and mutations are tracked by Svelte 5's deep reactivity.
|
||||
export const preferences = $state(readFromDOM());
|
||||
|
||||
// Ensure data-theme and zone attributes are always present on the DOM, even
|
||||
// when there is no Tauri webview injection script (e.g. browser dev mode).
|
||||
@@ -106,21 +108,19 @@ if (typeof window !== 'undefined') {
|
||||
applyToDOM(preferences);
|
||||
}
|
||||
|
||||
/** @deprecated Use `preferences` directly — kept for backwards compatibility */
|
||||
export function getPreferences() {
|
||||
return preferences;
|
||||
}
|
||||
|
||||
export function updatePreferences(updates) {
|
||||
preferences = { ...preferences, ...updates };
|
||||
Object.assign(preferences, updates);
|
||||
applyToDOM(preferences);
|
||||
persistToSQLite(preferences);
|
||||
}
|
||||
|
||||
export function updateAccessibility(updates) {
|
||||
preferences = {
|
||||
...preferences,
|
||||
accessibility: { ...preferences.accessibility, ...updates }
|
||||
};
|
||||
Object.assign(preferences.accessibility, updates);
|
||||
applyToDOM(preferences);
|
||||
persistToSQLite(preferences);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user