'use strict'; angular.module('copayApp.services').factory('configService', function(storageService, lodash, $log, $timeout, $rootScope) { var root = {}; var defaultConfig = { // wallet limits limits: { totalCopayers: 6, mPlusN: 100, }, // Bitcore wallet service URL bws: { url: 'https://bws.bitpay.com/bws/api', }, download: { url: 'https://bitpay.com/wallet', }, rateApp: { ios: 'https://itunes.apple.com/app/bitpay-secure-bitcoin-wallet/id1149581638', android: 'https://play.google.com/store/apps/details?id=com.bitpay.wallet', wp: '' }, // wallet default config wallet: { requiredCopayers: 2, totalCopayers: 3, spendUnconfirmed: false, reconnectDelay: 5000, idleDurationMin: 4, settings: { unitName: 'BTC', unitToSatoshi: 100000000, unitDecimals: 8, unitCode: 'btc', alternativeName: 'US Dollar', alternativeIsoCode: 'USD', } }, // External services glidera: { enabled: true, testnet: false }, coinbase: { enabled: false, //disable coinbase for this release testnet: false }, bitpayCard: { enabled: true }, amazon: { enabled: true }, //Experimental Features recentTransactions: { enabled: false //disabled by default }, frequentlyUsed: { enabled: true }, rates: { url: 'https://insight.bitpay.com:443/api/rates', }, release: { url: 'https://api.github.com/repos/bitpay/copay/releases/latest' }, pushNotifications: { enabled: true, config: { android: { senderID: '1036948132229', icon: 'push', iconColor: '#2F4053' }, ios: { alert: 'true', badge: 'true', sound: 'true', }, windows: {}, } }, emailNotifications: { enabled: false, }, }; var configCache = null; var colorList = [ { color: "#DD4B39", name: "Cinnabar" }, { color: "#F38F12", name: "Carrot Orange" }, { color: "#FAA77F", name: "Light Salmon" }, { color: "#D0B136", name: "Metallic Gold" }, { color: "#9EDD72", name: "Feijoa" }, { color: "#29BB9C", name: "Shamrock" }, { color: "#019477", name: "Observatory" }, { color: "#77DADA", name: "Turquoise Blue" }, { color: "#4A90E2", name: "Cornflower Blue" }, { color: "#484ED3", name: "Free Speech Blue" }, { color: "#9B59B6", name: "Deep Lilac" }, { color: "#E856EF", name: "Free Speech Magenta" }, { color: "#FF599E", name: "Brilliant Rose" }, { color: "#7A8C9E", name: "Light Slate Grey" } ]; root.getColorList = function() { return colorList; }; root.getSync = function() { if (!configCache) throw new Error('configService#getSync called when cache is not initialized'); return configCache; }; root._queue = []; root.whenAvailable = function(cb) { if (!configCache) { root._queue.push(cb); return; } return cb(configCache); }; root.get = function(cb) { storageService.getConfig(function(err, localConfig) { if (localConfig) { configCache = JSON.parse(localConfig); //these ifs are to avoid migration problems if (!configCache.bws) { configCache.bws = defaultConfig.bws; } if (!configCache.wallet) { configCache.wallet = defaultConfig.wallet; } if (!configCache.wallet.settings.unitCode) { configCache.wallet.settings.unitCode = defaultConfig.wallet.settings.unitCode; } if (!configCache.glidera) { configCache.glidera = defaultConfig.glidera; } if (!configCache.coinbase) { configCache.coinbase = defaultConfig.coinbase; } if (!configCache.amazon) { configCache.amazon = defaultConfig.amazon; } if (!configCache.bitpayCard) { configCache.bitpayCard = defaultConfig.bitpayCard; } if (!configCache.recentTransactions) { configCache.recentTransactions = defaultConfig.recentTransactions; } if (!configCache.frequentlyUsed) { configCache.frequentlyUsed = defaultConfig.frequentlyUsed; } if (!configCache.pushNotifications) { configCache.pushNotifications = defaultConfig.pushNotifications; } } else { configCache = lodash.clone(defaultConfig); }; configCache.bwsFor = configCache.bwsFor || {}; configCache.colorFor = configCache.colorFor || {}; configCache.aliasFor = configCache.aliasFor || {}; configCache.emailFor = configCache.emailFor || {}; // Coinbase // Disabled for testnet configCache.coinbase.testnet = false; $log.debug('Preferences read:', configCache) lodash.each(root._queue, function(x) { $timeout(function() { return x(configCache); }, 1); }); root._queue = []; return cb(err, configCache); }); }; root.set = function(newOpts, cb) { var config = lodash.cloneDeep(defaultConfig); storageService.getConfig(function(err, oldOpts) { oldOpts = oldOpts || {}; if (lodash.isString(oldOpts)) { oldOpts = JSON.parse(oldOpts); } if (lodash.isString(config)) { config = JSON.parse(config); } if (lodash.isString(newOpts)) { newOpts = JSON.parse(newOpts); } lodash.merge(config, oldOpts, newOpts); configCache = config; $rootScope.$emit('Local/SettingsUpdated'); storageService.storeConfig(JSON.stringify(config), cb); }); }; root.reset = function(cb) { configCache = lodash.clone(defaultConfig); storageService.removeConfig(cb); }; root.getDefaults = function() { return lodash.clone(defaultConfig); }; return root; });