diff --git a/common/src/settings.ts b/common/src/settings.ts index d1302f709..4a25aa335 100644 --- a/common/src/settings.ts +++ b/common/src/settings.ts @@ -2,8 +2,7 @@ import sdk, { MixinDeviceBase, ScryptedDeviceBase, ScryptedInterface, Setting, S const { systemManager } = sdk; -function parseValue(value: string, setting: StorageSetting) { - const { defaultValue } = setting; +function parseValue(value: string, setting: StorageSetting, readDefaultValue: () => any) { const type = setting.multiple ? 'array' : setting.type; if (type === 'boolean') { @@ -11,20 +10,20 @@ function parseValue(value: string, setting: StorageSetting) { return true; if (value === 'false') return false; - return defaultValue || false; + return readDefaultValue() || false; } if (type === 'number') { - return parseFloat(value) || defaultValue || 0; + return parseFloat(value) || readDefaultValue() || 0; } if (type === 'integer') { - return parseInt(value) || defaultValue || 0; + return parseInt(value) || readDefaultValue() || 0; } if (type === 'array') { try { return JSON.parse(value); } catch (e) { - return defaultValue || []; + return readDefaultValue() || []; } } if (type === 'device') { @@ -37,17 +36,18 @@ function parseValue(value: string, setting: StorageSetting) { return JSON.parse(value) } catch (e) { - return defaultValue; + return readDefaultValue(); } } - return value || defaultValue; + return value || readDefaultValue(); } export type HideFunction = (device: any) => boolean; export interface StorageSetting extends Setting { defaultValue?: any; + persistedDefaultValue?: any; onPut?: (oldValue: any, newValue: any) => void; onGet?: () => Promise; mapPut?: (oldValue: any, newValue: any) => any; @@ -133,6 +133,10 @@ export class StorageSettings implements Settings { let oldValue: any; if (setting) oldValue = this.getItemInternal(key as T, setting); + return this.putSettingInternal(setting, oldValue, key, value); + } + + putSettingInternal(setting: StorageSetting, oldValue: any, key: string, value: SettingValue) { if (!setting?.noStore) { if (setting.mapPut) value = setting.mapPut(oldValue, value); @@ -148,7 +152,14 @@ export class StorageSettings implements Settings { private getItemInternal(key: T, setting: StorageSetting): any { if (!setting) return this.device.storage.getItem(key); - const ret = parseValue(this.device.storage.getItem(key), setting); + const readDefaultValue = () => { + if (setting.persistedDefaultValue) { + this.putSettingInternal(setting, undefined, key, setting.persistedDefaultValue); + return setting.persistedDefaultValue; + } + return setting.defaultValue; + }; + const ret = parseValue(this.device.storage.getItem(key), setting, readDefaultValue); return setting.mapGet ? setting.mapGet(ret) : ret; }