Files
grin-web-wallet/scripts/settings.js
2024-12-20 18:08:44 -08:00

404 lines
9.1 KiB
JavaScript
Executable File

// Use strict
"use strict";
// Classes
// Settings class
class Settings {
// Public
// Constructor
constructor() {
// Set default values
this.defaultValues = {};
// Set self
var self = this;
// Create database
Database.createDatabase(function(database, currentVersion, databaseTransaction) {
// Create or get settings object store
var settingsObjectStore = (currentVersion === Database.NO_CURRENT_VERSION) ? database.createObjectStore(Settings.OBJECT_STORE_NAME, {
// Key path
"keyPath": [
// Wallet type
Database.toKeyPath(Settings.DATABASE_WALLET_TYPE_NAME),
// Network type
Database.toKeyPath(Settings.DATABASE_NETWORK_TYPE_NAME),
// Setting
Database.toKeyPath(Settings.DATABASE_SETTING_NAME)
]
}) : databaseTransaction.objectStore(Settings.OBJECT_STORE_NAME);
// Check if no database version exists
if(currentVersion === Database.NO_CURRENT_VERSION) {
// Create index to search settings object store by wallet type and network type
settingsObjectStore.createIndex(Settings.DATABASE_WALLET_TYPE_AND_NETWORK_TYPE_NAME, [
// Wallet Type
Database.toKeyPath(Settings.DATABASE_WALLET_TYPE_NAME),
// Network Type
Database.toKeyPath(Settings.DATABASE_NETWORK_TYPE_NAME)
], {
// Unique
"unique": false
});
}
});
}
// Create value
createValue(setting, defaultValue) {
// Set self
var self = this;
// Return promise
return new Promise(function(resolve, reject) {
// Append settings to default values
self.defaultValues[setting] = defaultValue;
// Resolve
resolve();
});
}
// Get default value
getDefaultValue(setting) {
// Set self
var self = this;
// Return promise
return new Promise(function(resolve, reject) {
// Check if setting has a default values
if(setting in self.defaultValues === true)
// Resolve default value
resolve(self.defaultValues[setting]);
// Otherwise
else
// Reject error
reject(Language.getDefaultTranslation('The setting doesn\'t exist.'));
});
}
// Get value
getValue(setting) {
// Set self
var self = this;
// Return promise
return new Promise(function(resolve, reject) {
// Return result from searching for setting in the database
return Database.getResult(Settings.OBJECT_STORE_NAME, [
// Wallet type
Consensus.getWalletType(),
// Network type
Consensus.getNetworkType(),
// Setting
setting
]).then(function(result) {
// Check if result was found
if(result !== Database.RESULT_NOT_FOUND)
// Resolve value
resolve(result[Database.toKeyPath(Settings.DATABASE_VALUE_NAME)]);
// Otherwise check if setting has a default values
else if(setting in self.defaultValues === true)
// Resolve default value
resolve(self.defaultValues[setting]);
// Otherwise
else
// Reject error
reject(Language.getDefaultTranslation('The setting doesn\'t exist.'));
// Catch error
}).catch(function(error) {
// Reject error
reject(Language.getDefaultTranslation('The database failed.'));
});
});
}
// Set value
setValue(setting, value, logMessage = false, sensitive = false) {
// Set self
var self = this;
// Return promise
return new Promise(function(resolve, reject) {
// Return saving setting in the database
return Database.saveResults(Settings.OBJECT_STORE_NAME, [{
// Wallet Type
[Database.toKeyPath(Settings.DATABASE_WALLET_TYPE_NAME)]: Consensus.getWalletType(),
// Network type
[Database.toKeyPath(Settings.DATABASE_NETWORK_TYPE_NAME)]: Consensus.getNetworkType(),
// Setting
[Database.toKeyPath(Settings.DATABASE_SETTING_NAME)]: setting,
// Value
[Database.toKeyPath(Settings.DATABASE_VALUE_NAME)]: value
}], [], Database.CREATE_NEW_TRANSACTION, Database.RELAXED_DURABILITY).then(function() {
// Check if logging message
if(logMessage === true) {
// Check if sensitive
if(sensitive === true) {
// Log message
Log.logMessage(Language.getDefaultTranslation('Changed %1$y setting.'), [
// Setting
setting
]);
}
// Otherwise
else {
// Log message
Log.logMessage(Language.getDefaultTranslation('Changed %1$y setting to %2$y.'), [
// Setting
setting,
// Value
value
]);
}
}
// Trigger change event
$(self).trigger(Settings.CHANGE_EVENT, {
// Setting
[Settings.DATABASE_SETTING_NAME]: setting,
// Value
[Settings.DATABASE_VALUE_NAME]: value
});
// Resolve
resolve();
// Catch errors
}).catch(function(error) {
// Reject error
reject(Language.getDefaultTranslation('The database failed.'));
});
});
}
// Delete values
deleteValues(triggerChangeEvents = true) {
// Set self
var self = this;
// Return promise
return new Promise(function(resolve, reject) {
// Initialize get values
var getValues = [];
// Check if triggering change events
if(triggerChangeEvents === true) {
// Initialize settings
var settings = [];
// Initialize default values
var defaultValues = [];
// Go through all settings
for(let setting in self.defaultValues) {
if(self.defaultValues.hasOwnProperty(setting) === true) {
// Append setting to list
settings.push(setting);
// Append default value to list
defaultValues.push(self.defaultValues[setting]);
// Append getting setting's value to list
getValues.push(new Promise(function(resolve, reject) {
// Return getting setting's value
return self.getValue(setting).then(function(value) {
// Resolve value
resolve(value);
// Catch errors
}).catch(function(error) {
// Reject error
reject(error);
});
}));
}
}
}
// Return getting all setting's values
return Promise.all(getValues).then(function(values) {
// Return deleting settings with the wallet type and network type in the database
return Database.deleteResultsWithValue(Settings.OBJECT_STORE_NAME, Settings.DATABASE_WALLET_TYPE_AND_NETWORK_TYPE_NAME, IDBKeyRange.only([
// Wallet type
Consensus.getWalletType(),
// Network type
Consensus.getNetworkType()
]), Database.CREATE_NEW_TRANSACTION, Database.STRICT_DURABILITY).then(function() {
// Log message
Log.logMessage(Language.getDefaultTranslation('Reset settings.'));
// Check if triggering change events
if(triggerChangeEvents === true) {
// Go through all settings
for(var i = 0; i < settings["length"]; ++i) {
// Get setting
var setting = settings[i];
// Get default value
var defaultValue = defaultValues[i];
// Get value
var value = values[i];
// Check if setting's value changed
if(value !== defaultValue) {
// Trigger change event
$(self).trigger(Settings.CHANGE_EVENT, {
// Setting
[Settings.DATABASE_SETTING_NAME]: setting,
// Value
[Settings.DATABASE_VALUE_NAME]: defaultValue
});
}
}
}
// Resolve
resolve();
// Catch errors
}).catch(function(error) {
// Reject error
reject(error);
});
// Catch errors
}).catch(function(error) {
// Reject error
reject(error);
});
});
}
// Change event
static get CHANGE_EVENT() {
// Return changed event
return "SettingsChangeEvent";
}
// Private
// Object store name
static get OBJECT_STORE_NAME() {
// Return object store name
return "Settings";
}
// Database wallet type name
static get DATABASE_WALLET_TYPE_NAME() {
// Return database wallet type name
return "Wallet Type";
}
// Database network type name
static get DATABASE_NETWORK_TYPE_NAME() {
// Return database network type name
return "Network Type";
}
// Database setting name
static get DATABASE_SETTING_NAME() {
// Return database setting name
return "Setting";
}
// Database value name
static get DATABASE_VALUE_NAME() {
// Return database value name
return "Value";
}
// Database wallet type and network type name
static get DATABASE_WALLET_TYPE_AND_NETWORK_TYPE_NAME() {
// Return database wallet type and network type name
return "Wallet Type And Network Type";
}
}
// Main function
// Set global object's settings
globalThis["Settings"] = Settings;