Files
WeatherStar4000/server/scripts/modules/utils/setting.mjs
2024-04-12 16:16:01 -05:00

101 lines
2.5 KiB
JavaScript

const SETTINGS_KEY = 'Settings';
class Setting {
constructor(shortName, name, type, defaultValue, changeAction, sticky) {
// store values
this.shortName = shortName;
this.name = name;
this.defaultValue = defaultValue;
this.myValue = defaultValue;
this.type = type;
// a default blank change function is provided
this.changeAction = changeAction ?? (() => {});
// get existing value if present
const storedValue = this.getFromLocalStorage();
if (sticky && storedValue !== null) {
this.myValue = storedValue;
}
// call the change function on startup
this.changeAction(this.myValue);
}
generateCheckbox() {
// create a checkbox in the selected displays area
const label = document.createElement('label');
label.for = `settings-${this.shortName}-checkbox`;
label.id = `settings-${this.shortName}-label`;
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.value = true;
checkbox.id = `settings-${this.shortName}-checkbox`;
checkbox.name = `settings-${this.shortName}-checkbox`;
checkbox.checked = this.myValue;
checkbox.addEventListener('change', (e) => this.checkboxChange(e));
const span = document.createElement('span');
span.innerHTML = this.name;
label.append(checkbox, span);
this.checkbox = label;
return label;
}
checkboxChange(e) {
// update the state
this.myValue = e.target.checked;
this.storeToLocalStorage(this.myValue);
// call change action
this.changeAction(this.myValue);
}
storeToLocalStorage(value) {
if (!this.sticky) return;
const allSettingsString = localStorage?.getItem(SETTINGS_KEY) ?? '{}';
const allSettings = JSON.parse(allSettingsString);
allSettings[this.shortName] = value;
localStorage?.setItem(SETTINGS_KEY, JSON.stringify(allSettings));
}
getFromLocalStorage() {
const allSettings = localStorage?.getItem(SETTINGS_KEY);
try {
if (allSettings) {
const storedValue = JSON.parse(allSettings)?.[this.shortName];
if (storedValue !== undefined) {
switch (this.type) {
case 'boolean':
return storedValue;
case 'int':
return storedValue;
default:
return null;
}
}
}
} catch {
return null;
}
return null;
}
get value() {
return this.myValue;
}
set value(newValue) {
// update the state
this.myValue = newValue;
this.checkbox.checked = newValue;
this.storeToLocalStorage(this.myValue);
// call change action
this.changeAction(this.myValue);
}
}
export default Setting;