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:
@@ -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