diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 6cd19b183..ca1ca3f18 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -5,7 +5,6 @@ import { SplashScreen } from '@ionic-native/splash-screen'; import { Logger } from '@nsalaun/ng-logger'; import { AppProvider } from '../providers/app/app'; -import { TranslateService } from '@ngx-translate/core'; import { TabsPage } from '../pages/tabs/tabs'; @@ -20,8 +19,7 @@ export class CopayApp { statusBar: StatusBar, splashScreen: SplashScreen, log: Logger, - app: AppProvider, - translate: TranslateService + app: AppProvider ) { platform.ready().then(() => { app.getName().subscribe((name) => { @@ -40,8 +38,6 @@ export class CopayApp { splashScreen.hide(); } - translate.setDefaultLang('en'); - translate.use(platform.lang()); }); } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 6197c834e..1b05566d1 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -34,6 +34,8 @@ import { WalletProvider } from '../providers/wallet/wallet'; import { PersistenceProvider, persistenceProviderFactory } from '../providers/persistence/persistence'; import { AppProvider } from '../providers/app/app'; import { PlatformProvider } from '../providers/platform/platform'; +import { ConfigProvider } from '../providers/config/config'; +import { LanguageProvider } from '../providers/language/language'; export function createTranslateLoader(http: Http) { return new TranslatePoHttpLoader(http, './assets/i18n/', '.po'); @@ -85,6 +87,12 @@ export function createTranslateLoader(http: Http) { provide: ErrorHandler, useClass: IonicErrorHandler }, + { + provide: APP_INITIALIZER, + useFactory: (language: LanguageProvider) => () => language.load(), + deps: [LanguageProvider], + multi: true + }, { provide: PersistenceProvider, useFactory: persistenceProviderFactory, @@ -93,7 +101,9 @@ export function createTranslateLoader(http: Http) { }, WalletProvider, AppProvider, - PlatformProvider + PlatformProvider, + ConfigProvider, + LanguageProvider ] }) export class AppModule { } diff --git a/src/providers/config/config.ts b/src/providers/config/config.ts new file mode 100644 index 000000000..56f19af04 --- /dev/null +++ b/src/providers/config/config.ts @@ -0,0 +1,132 @@ +import { Injectable } from '@angular/core'; +import { Logger } from '@nsalaun/ng-logger'; +import { Events } from 'ionic-angular'; +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 + }, + + // 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' + } + }, + + // 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: 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' + } + }; + + constructor( + private logger: Logger, + private events: Events, + private platform: PlatformProvider + ) { + this.logger.debug('ConfigProvider initialized.'); + } + + public load() { + return new Promise((resolve, reject) => { + this.configCache = _.clone(this.configDefault); + resolve(this.configCache); + }); + } + + set(newOpts: object) { + let config = _.cloneDeep(this.configDefault); + + if (_.isString(newOpts)) { + newOpts = JSON.parse(newOpts); + } + + _.merge(config, this.configCache, newOpts); + this.configCache = config; + + this.events.publish('config:updated', this.configCache); + } + + get() { + return this.configCache; + } + +} diff --git a/src/providers/language/language.ts b/src/providers/language/language.ts new file mode 100644 index 000000000..7e17e773b --- /dev/null +++ b/src/providers/language/language.ts @@ -0,0 +1,99 @@ +import { Injectable } from '@angular/core'; +import { Logger } from '@nsalaun/ng-logger'; +import { TranslateService } from '@ngx-translate/core'; + +import { ConfigProvider } from '../config/config'; + +import * as _ from "lodash"; + +@Injectable() +export class LanguageProvider { + public availables: Array = [ + { + name: 'English', + isoCode: 'en' + }, { + name: 'Español', + isoCode: 'es' + }, { + name: 'Français', + isoCode: 'fr', + }, { + name: 'Italiano', + isoCode: 'it', + }, { + name: 'Polski', + isoCode: 'pl', + }, { + name: 'Deutsch', + isoCode: 'de', + }, { + name: '日本語', + isoCode: 'ja', + useIdeograms: true, + }, { + name: '中文(简体)', + isoCode: 'zh', + useIdeograms: true, + }, { + name: 'Pусский', + isoCode: 'ru', + }, { + name: 'Português', + isoCode: 'pt', + } + ]; + public current: string; + + constructor( + private logger: Logger, + private translate: TranslateService, + private config: ConfigProvider + ) { + this.logger.info('LanguageProvider initialized.'); + } + + load() { + return new Promise((resolve, reject) => { + // Get from browser + let browserLang = this.translate.getBrowserLang(); + let validBrowserLang = this.getName(browserLang) ? true : false; + + this.config.load().then((config) => { + let configLanguage = config['wallet']['settings']['defaultLanguage']; + if (configLanguage) this.current = configLanguage; + else { + if (validBrowserLang) this.current = browserLang; + else this.current = this.getDefaultLanguage(); // default + } + this.translate.setDefaultLang(this.current); + resolve(true); + }); + }); + } + + set(lang: string) { + this.current = lang; + this.translate.use(lang); + this.config.set({language: lang}); + } + + getName(lang: string) { + return _.result(_.find(this.availables, { + 'isoCode': lang + }), 'name'); + } + + getDefaultLanguage() { + return this.availables[0]['isoCode']; + } + + getCurrentLanguage() { + return this.current; + } + + getLanguages() { + return this.availables; + } + +}