mirror of
https://github.com/koush/scrypted.git
synced 2026-09-19 10:10:39 +01:00
common: add persisted default to StorageSettings
This commit is contained in:
@@ -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<StorageSetting>;
|
||||
mapPut?: (oldValue: any, newValue: any) => any;
|
||||
@@ -133,6 +133,10 @@ export class StorageSettings<T extends string> 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<T extends string> 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user