diff --git a/utils/atoms/settings.ts b/utils/atoms/settings.ts index 28f7d1b46..f12f091c7 100644 --- a/utils/atoms/settings.ts +++ b/utils/atoms/settings.ts @@ -341,6 +341,14 @@ export const pluginSettingsAtom = atom( loadPluginSettings(), ); +const hasMeaningfulSettingValue = (value: unknown) => + value !== undefined && value !== null && value !== ""; + +const getEffectiveSettingValue = ( + settings: Partial | null | undefined, + settingsKey: K, +) => settings?.[settingsKey] ?? defaultValues[settingsKey]; + export const useSettings = () => { const api = useAtomValue(apiAtom); const [_settings, setSettings] = useAtom(settingsAtom); @@ -381,12 +389,13 @@ export const useSettings = () => { for (const [key, setting] of Object.entries(newPluginSettings)) { if (setting && !setting.locked && setting.value !== undefined) { const settingsKey = key as keyof Settings; - // Apply if forceOverride is true, or if user hasn't explicitly set this value - if ( - forceOverride || - _settings[settingsKey] === undefined || - _settings[settingsKey] === "" - ) { + const effectiveValue = getEffectiveSettingValue( + _settings, + settingsKey, + ); + // Apply if forceOverride is true, or if neither persisted settings + // nor app defaults provide a meaningful value. + if (forceOverride || !hasMeaningfulSettingValue(effectiveValue)) { (updates as any)[settingsKey] = setting.value; } } @@ -438,28 +447,22 @@ export const useSettings = () => { // We do not want to save over users pre-existing settings in case admin ever removes/unlocks a setting. // If admin sets locked to false but provides a value, - // use user settings first and fallback on admin setting if required. + // use persisted settings first, then app defaults, and only fallback on the + // plugin value when neither provides a meaningful value. const settings: Settings = useMemo(() => { - const unlockedPluginDefaults: Partial = {}; const overrideSettings = Object.entries(pluginSettings ?? {}).reduce< Partial >((acc, [key, setting]) => { if (setting) { const { value, locked } = setting; const settingsKey = key as keyof Settings; - - // Make sure we override default settings with plugin settings when they are not locked. - if ( - !locked && - value !== undefined && - _settings?.[settingsKey] !== value - ) { - (unlockedPluginDefaults as any)[settingsKey] = value; - } + const effectiveValue = getEffectiveSettingValue(_settings, settingsKey); (acc as any)[settingsKey] = locked ? value - : (_settings?.[settingsKey] ?? value); + : hasMeaningfulSettingValue(effectiveValue) + ? effectiveValue + : value; } return acc; }, {});