diff --git a/app-template/apply.js b/app-template/apply.js index a93a624f8..17b721d9f 100755 --- a/app-template/apply.js +++ b/app-template/apply.js @@ -74,7 +74,6 @@ Object.keys(templates).forEach(function(k) { ///////////////// console.log('Copying ' + configDir + '/appConfig.json' + ' to assets'); -configBlob = configBlob.replace('{', JSONheader); fs.writeFileSync('../src/assets/appConfig.json', configBlob, 'utf8'); //////////////// diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 79828b06b..d5eb311d3 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -7,7 +7,6 @@ import { Logger } from '@nsalaun/ng-logger'; import { AppProvider } from '../providers/app/app'; import { ProfileProvider } from '../providers/profile/profile'; import { ConfigProvider } from '../providers/config/config'; -import { TouchIdProvider } from '../providers/touchid/touchid'; import { TabsPage } from '../pages/tabs/tabs'; import { OnboardingPage } from '../pages/onboarding/onboarding'; @@ -15,8 +14,7 @@ import { PinModalPage } from '../pages/pin/pin'; import { FingerprintModalPage } from '../pages/fingerprint/fingerprint'; @Component({ - templateUrl: 'app.html', - providers: [TouchIdProvider] + templateUrl: 'app.html' }) export class CopayApp { rootPage: any; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a875781a7..e39d64d93 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -152,7 +152,7 @@ let providers: any = [ useFactory: persistenceProviderFactory, deps: [PlatformProvider, Logger], multi: false - }, + } ]; export function declarationsComponents() { diff --git a/src/providers/app/app.ts b/src/providers/app/app.ts index a95404b39..8a375c49b 100644 --- a/src/providers/app/app.ts +++ b/src/providers/app/app.ts @@ -8,39 +8,35 @@ import { ConfigProvider } from '../../providers/config/config'; import { TouchIdProvider } from '../../providers/touchid/touchid'; interface App { - WindowsStoreDisplayName: string; - WindowsStoreIdentityName: string; - androidVersion: string; - appDescription: string; - appUri: string; + packageName: string; + packageDescription: string; + packageNameId: string; + themeColor: string; + userVisibleName: string; + purposeLine: string; bundleName: string; - commitHash: string; - description: string; - disclaimerUrl: string; - gitHubRepoBugs: string; - gitHubRepoName: string; - gitHubRepoUrl: string; + appUri: string; name: string; + nameNoSpace: string; nameCase: string; nameCaseNoSpace: string; - nameNoSpace: string; - packageDescription: string; - packageName: string; - packageNameId: string; - purposeLine: string; - pushSenderId: string; - statusBarColor: string; + gitHubRepoName: string; + gitHubRepoUrl: string; + gitHubRepoBugs: string; + disclaimerUrl: string; url: string; - userVisibleName: string; - version: string; + appDescription: string; winAppName: string; + WindowsStoreIdentityName: string; + WindowsStoreDisplayName: string; windowsAppId: string; - _enabledExtensions: { - amazon: boolean; - coinbase: boolean; - glidera: boolean; - } + pushSenderId: string; + description: string; + version: string; + androidVersion: string; + commitHash: string; _extraCSS: string; + _enabledExtensions: object; } @Injectable() @@ -60,23 +56,21 @@ export class AppProvider { public load() { return new Promise((resolve, reject) => { - this.config.load().then((config) => { - // storage -> config -> language -> unit -> app - // Everything ok - this.language.init(config); + this.config.load().then(() => { + this.language.load(); this.touchid.init(); this.getInfo().subscribe((info) => { this.info = info; - resolve(true); + resolve(); }); }).catch((err) => { - // Something may be wrong - reject(err); + this.logger.error(err); + reject(); }); }); } - getInfo() { + private getInfo() { return this.http.get(this.jsonPath) .map((res: Response) => res.json()); } diff --git a/src/providers/config/config.ts b/src/providers/config/config.ts index 1c75ee4a6..e584972f4 100644 --- a/src/providers/config/config.ts +++ b/src/providers/config/config.ts @@ -2,106 +2,193 @@ import { Injectable } from '@angular/core'; import { Logger } from '@nsalaun/ng-logger'; import { Events } from 'ionic-angular'; import { PersistenceProvider } from '../persistence/persistence'; -import { PlatformProvider } from '../platform/platform'; import * as _ from "lodash"; -@Injectable() -export class ConfigProvider { - private configCache: object; - private configDefault: object = { - // wallet limits - limits: { - totalCopayers: 6, - mPlusN: 100 - }, +interface Config { + limits: { + totalCopayers: number; + mPlusN: number; + }; - // wallet default config - wallet: { - requiredCopayers: 2, - totalCopayers: 3, - spendUnconfirmed: false, - reconnectDelay: 5000, - idleDurationMin: 4, + wallet: { + requiredCopayers: number; + totalCopayers: number; + spendUnconfirmed: boolean; + reconnectDelay: number; + idleDurationMin: number; settings: { - unitName: 'BTC', - unitToSatoshi: 100000000, - unitDecimals: 8, - unitCode: 'btc', - alternativeName: 'US Dollar', - alternativeIsoCode: 'USD' - } - }, + unitName: string; + unitToSatoshi: number; + unitDecimals: number; + unitCode: string; + alternativeName: string; + alternativeIsoCode: string; + defaultLanguage: string; + }; + }; - // Bitcore wallet service URL - bws: { - url: 'https://bws.bitpay.com/bws/api' - }, + bws: { + url: string; + }; - 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 - }, - - hideNextSteps: { - enabled: this.platform.isWP ? true : false - }, - - 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 - }, - - log: { - filter: 'debug' + 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; + }; + + hideNextSteps: { + enabled: boolean; + }; + + rates: { + url: string; + }; + + release: { + url: string; + }; + + pushNotificationsEnabled: boolean; + + confirmedTxsNotifications: { + enabled: boolean; + }; + + emailNotifications: { + enabled: boolean; + }; + + log: { + filter: string; + }; +}; + +const configDefault: Config = { + // wallet limits + limits: { + totalCopayers: 6, + mPlusN: 100 + }, + + // 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', + defaultLanguage: '' + } + }, + + // 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 + }, + + hideNextSteps: { + enabled: false + }, + + 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 + }, + + log: { + filter: 'debug' + } +}; + +@Injectable() +export class ConfigProvider { + private configCache: Config; + + constructor( private logger: Logger, private events: Events, - private platform: PlatformProvider, private persistence: PersistenceProvider ) { this.logger.debug('ConfigProvider initialized.'); @@ -109,16 +196,19 @@ export class ConfigProvider { public load() { return new Promise((resolve, reject) => { - this.persistence.getConfig().then((config: object) => { + this.persistence.getConfig().then((config: Config) => { if (!_.isEmpty(config)) this.configCache = _.clone(config); - else this.configCache = _.clone(this.configDefault); - resolve(this.configCache); + else this.configCache = _.clone(configDefault); + resolve(); + }).catch((err) => { + this.logger.error(err); + reject(); }); }); } public set(newOpts: object) { - let config = _.cloneDeep(this.configDefault); + let config = _.cloneDeep(configDefault); if (_.isString(newOpts)) { newOpts = JSON.parse(newOpts); @@ -137,7 +227,7 @@ export class ConfigProvider { } public getDefaults(): Object { - return this.configDefault; + return configDefault; } } diff --git a/src/providers/language/language.ts b/src/providers/language/language.ts index f273384a4..2e3f0a1c5 100644 --- a/src/providers/language/language.ts +++ b/src/providers/language/language.ts @@ -56,14 +56,13 @@ export class LanguageProvider { }); } - init(config: object) { - // Get from browser - let browserLang = this.translate.getBrowserLang(); - let validBrowserLang = this.getName(browserLang) ? true : false; - - let configLanguage = config['wallet']['settings']['defaultLanguage']; // TODO - if (configLanguage) this.current = configLanguage; + public load() { + let lang = this.config.get().wallet.settings.defaultLanguage; + if (!_.isEmpty(lang)) this.current = lang; else { + // Get from browser + let browserLang = this.translate.getBrowserLang(); + let validBrowserLang = this.getName(browserLang) ? true : false; if (validBrowserLang) this.current = browserLang; else this.current = this.getDefault(); } diff --git a/src/providers/tx-format/tx-format.ts b/src/providers/tx-format/tx-format.ts index 499dc6595..213e16a56 100644 --- a/src/providers/tx-format/tx-format.ts +++ b/src/providers/tx-format/tx-format.ts @@ -21,11 +21,10 @@ export class TxFormatProvider { private filter: Filter ) { console.log('Hello TxFormatProvider Provider'); - console.log("configProvider", this.config.get()); } formatAmount(satoshis: number, fullPrecision?: boolean) { - let settings = this.config.get()['wallet']['settings']; // TODO + let settings = this.config.get().wallet.settings; if (settings.unitCode == 'sat') return satoshis; @@ -64,7 +63,7 @@ export class TxFormatProvider { formatAlternativeStr(coin: string, satoshis: number) { return new Promise((resolve, reject) => { if (isNaN(satoshis)) resolve(); - let settings = this.config.get()['wallet']['settings']; // TODO + let settings = this.config.get().wallet.settings; var v1 = parseFloat((this.rate.toFiat(satoshis, settings.alternativeIsoCode, coin)).toFixed(2)); var v1FormatFiat = this.filter.formatFiatAmount(v1); diff --git a/src/theme/variables.scss b/src/theme/variables.scss index f32a3d898..1900ce3e6 100644 --- a/src/theme/variables.scss +++ b/src/theme/variables.scss @@ -19,7 +19,30 @@ $app-direction: ltr; // To view all the possible Ionic variables, see: // http://ionicframework.com/docs/theming/overriding-ionic-variables/ +// TODO: Custom variables (backward compatibilities). Will be REMOVED +$v-primary-color: #192c3a; +$v-secondary-color: #31465b; +$v-accent-color: #1abb9b; + +$v-dark-gray: #445 !default; +$v-mid-gray: #667 !default; +$v-light-gray: #9b9bab !default; +$v-title-gray: #c2c9d1 !default; +$v-subtle-gray: darken(#ffffff, 5%) !default; +$v-btn-active-color: #148e76; +$v-background-warning: #ffa500; +$v-background-success: #1abb9b; + +$v-onboarding-color: #ffffff !default; +$v-onboarding-bar-header-color: #ffffff !default; +$v-onboarding-bar-header-button-color: #ffffff !default; +$v-onboarding-gradient-top-color: $v-primary-color !default; +$v-onboarding-gradient-bottom-color: $v-secondary-color !default; +$v-onboarding-checkbox-on-border: $v-accent-color; + +$v-button-primary-bg: $v-accent-color !default; +$v-visible-radius: 6px !default; // App iOS Variables // --------------------------------------------------