copay/src/providers/config/config.ts

295 lines
6.1 KiB
TypeScript

import { Injectable } from '@angular/core';
import { Logger } from '../../providers/logger/logger';
import { PersistenceProvider } from '../persistence/persistence';
import * as _ from "lodash";
interface Config {
limits: {
totalCopayers: number;
mPlusN: number;
};
wallet: {
useLegacyAddress: boolean,
requiredCopayers: number;
totalCopayers: number;
spendUnconfirmed: boolean;
reconnectDelay: number;
idleDurationMin: number;
settings: {
unitName: string;
unitToSatoshi: number;
unitDecimals: number;
unitCode: string;
alternativeName: string;
alternativeIsoCode: string;
defaultLanguage: string;
feeLevel: string;
};
};
bws: {
url: string;
};
download: {
bitpay: {
url: string;
};
copay: {
url: string;
}
};
rateApp: {
bitpay: {
ios: string;
android: string;
wp: string;
};
copay: {
ios: string;
android: string;
wp: string;
};
};
lock: {
method: any;
value: any;
bannedUntil: any;
};
recentTransactions: {
enabled: boolean;
};
showIntegration: {
coinbase: boolean,
glidera: boolean,
debitcard: boolean,
amazon: boolean,
mercadolibre: boolean,
shapeshift: boolean
};
rates: {
url: string;
};
release: {
url: string;
};
pushNotificationsEnabled: boolean;
confirmedTxsNotifications: {
enabled: boolean;
};
emailNotifications: {
enabled: boolean;
email: string;
};
log: {
weight: number;
};
blockExplorerUrl: {
btc: string;
bch: string;
}
};
const configDefault: Config = {
// wallet limits
limits: {
totalCopayers: 6,
mPlusN: 100
},
// wallet default config
wallet: {
useLegacyAddress: false,
requiredCopayers: 2,
totalCopayers: 3,
spendUnconfirmed: false,
reconnectDelay: 5000,
idleDurationMin: 4,
settings: {
unitName: 'BTC',
unitToSatoshi: 100000000,
unitDecimals: 8,
unitCode: 'btc',
alternativeName: 'US Dollar',
alternativeIsoCode: 'USD',
defaultLanguage: '',
feeLevel: 'normal'
}
},
// Bitcore wallet service URL
bws: {
url: 'https://bws.bitpay.com/bws/api'
},
download: {
bitpay: {
url: 'https://bitpay.com/wallet'
},
copay: {
url: 'https://copay.io/#download'
}
},
rateApp: {
bitpay: {
ios: 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=1149581638&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8',
android: 'https://play.google.com/store/apps/details?id=com.bitpay.wallet',
wp: ''
},
copay: {
ios: 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id=951330296&pageNumber=0&sortOrdering=2&type=Purple+Software&mt=8',
android: 'https://play.google.com/store/apps/details?id=com.bitpay.copay',
wp: ''
}
},
lock: {
method: null,
value: null,
bannedUntil: null
},
// External services
recentTransactions: {
enabled: true
},
showIntegration: {
coinbase: true,
glidera: true,
debitcard: true,
amazon: true,
mercadolibre: true,
shapeshift: true
},
rates: {
url: 'https://insight.bitpay.com:443/api/rates'
},
release: {
url: 'https://api.github.com/repos/bitpay/copay/releases/latest'
},
pushNotificationsEnabled: true,
confirmedTxsNotifications: {
enabled: true
},
emailNotifications: {
enabled: false,
email: ''
},
log: {
weight: 3
},
blockExplorerUrl: {
btc: 'explorer.btcprivate.org',
bch: 'bch-insight.bitpay.com'
}
};
@Injectable()
export class ConfigProvider {
private configCache: Config;
constructor(
private logger: Logger,
private persistence: PersistenceProvider
) {
this.logger.debug('ConfigProvider initialized.');
}
public load() {
return new Promise((resolve, reject) => {
this.persistence.getConfig().then((config: Config) => {
if (!_.isEmpty(config)) {
this.configCache = _.clone(config);
this.backwardCompatibility();
} else {
this.configCache = _.clone(configDefault);
}
resolve();
}).catch((err) => {
this.logger.error(err);
reject();
});
});
}
/**
* @param newOpts object or string (JSON)
*/
public set(newOpts: any) {
let config = _.cloneDeep(configDefault);
if (_.isString(newOpts)) {
newOpts = JSON.parse(newOpts);
}
_.merge(config, this.configCache, newOpts);
this.configCache = config;
this.persistence.storeConfig(this.configCache).then(() => {
this.logger.info('Config saved');
});
}
public get(): Config {
return this.configCache;
}
public getDefaults(): Config {
return configDefault;
}
private backwardCompatibility() {
// these ifs are to avoid migration problems
if (this.configCache.bws) {
this.configCache.bws = configDefault.bws;
}
if (!this.configCache.wallet) {
this.configCache.wallet = configDefault.wallet;
}
if (!this.configCache.wallet.settings.unitCode) {
this.configCache.wallet.settings.unitCode = configDefault.wallet.settings.unitCode;
}
if (!this.configCache.showIntegration) {
this.configCache.showIntegration = configDefault.showIntegration;
}
if (!this.configCache.recentTransactions) {
this.configCache.recentTransactions = configDefault.recentTransactions;
}
if (!this.configCache.pushNotificationsEnabled) {
this.configCache.pushNotificationsEnabled = configDefault.pushNotificationsEnabled;
}
if (this.configCache.wallet.settings.unitCode == 'bit') {
// Convert to BTC. Bits will be disabled
this.configCache.wallet.settings.unitName = configDefault.wallet.settings.unitName;
this.configCache.wallet.settings.unitToSatoshi = configDefault.wallet.settings.unitToSatoshi;
this.configCache.wallet.settings.unitDecimals = configDefault.wallet.settings.unitDecimals;
this.configCache.wallet.settings.unitCode = configDefault.wallet.settings.unitCode;
}
}
}