diff --git a/src/app/app.component.ts b/src/app/app.component.ts index ca1ca3f18..286c51495 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -15,29 +15,28 @@ export class CopayApp { rootPage: any = TabsPage; constructor( - platform: Platform, - statusBar: StatusBar, - splashScreen: SplashScreen, - log: Logger, - app: AppProvider + private platform: Platform, + private statusBar: StatusBar, + private splashScreen: SplashScreen, + private logger: Logger, + private app: AppProvider ) { - platform.ready().then(() => { - app.getName().subscribe((name) => { - log.info('Name: ' + name); - }); - app.getVersion().subscribe((version) => { - log.info('Version: ' + version); - }); - app.getCommitHash().subscribe((commit) => { - log.info('Commit Hash: #' + commit); - }); - log.info('Platform: ' + platform.platforms()); - log.info('Language: ' + platform.lang()); - if (platform.is('cordova')) { - statusBar.styleDefault(); - splashScreen.hide(); - } + this.initializeApp(); + } + + initializeApp() { + this.platform.ready().then((readySource) => { + this.logger.info( + 'Platform ready (' + readySource + '): ' + + this.app.info.nameCase + + ' - v' + this.app.info.version + + ' #' + this.app.info.commitHash); + + if (this.platform.is('cordova')) { + this.statusBar.styleLightContent(); + this.splashScreen.hide(); + } }); } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1b05566d1..b31c20b45 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -36,9 +36,10 @@ import { AppProvider } from '../providers/app/app'; import { PlatformProvider } from '../providers/platform/platform'; import { ConfigProvider } from '../providers/config/config'; import { LanguageProvider } from '../providers/language/language'; +import { UnitProvider } from '../providers/unit/unit'; export function createTranslateLoader(http: Http) { - return new TranslatePoHttpLoader(http, './assets/i18n/', '.po'); + return new TranslatePoHttpLoader(http, 'assets/i18n', '.po'); } @NgModule({ @@ -89,8 +90,8 @@ export function createTranslateLoader(http: Http) { }, { provide: APP_INITIALIZER, - useFactory: (language: LanguageProvider) => () => language.load(), - deps: [LanguageProvider], + useFactory: (app: AppProvider) => () => app.load(), + deps: [AppProvider], multi: true }, { @@ -103,7 +104,8 @@ export function createTranslateLoader(http: Http) { AppProvider, PlatformProvider, ConfigProvider, - LanguageProvider + LanguageProvider, + UnitProvider ] }) export class AppModule { } diff --git a/src/pages/about/about.ts b/src/pages/about/about.ts index 690b22be6..1e4350dc7 100644 --- a/src/pages/about/about.ts +++ b/src/pages/about/about.ts @@ -24,12 +24,8 @@ export class AboutPage { ionViewDidLoad() { this.log.log('ionViewDidLoad AboutPage'); - this.app.getCommitHash().subscribe((data) => { - this.commitHash = data; - }); - this.app.getVersion().subscribe((data) => { - this.version = data; - }); + this.commitHash = this.app.info.commitHash; + this.version = this.app.info.version; } openTermsOfUse() { diff --git a/src/pages/setting/setting.html b/src/pages/setting/setting.html index d48c36de9..e878ac38e 100644 --- a/src/pages/setting/setting.html +++ b/src/pages/setting/setting.html @@ -10,11 +10,23 @@ -   Address book + + + Help & support + + + + Send feedback + + + + Share {{ appName }} + + Preferences @@ -25,12 +37,62 @@ Language - - English - Spanish + + {{ lang.name }} -   + + + + Bitcoin unit + + + {{ unit.shortName }} + + + + + + Alternative currency + + + USD + ARS + + + + + + Bitcoin network fee policy + + + Normal + Urgent + + + + + + Lock + + + Disabled + Lock by PIN + Lock by fingerprint + + + + Wallets & integrations + + + Wallet 1 + + + + Wallet 2 + + + More About {{appName}} diff --git a/src/pages/setting/setting.ts b/src/pages/setting/setting.ts index 223add837..5fab0f15f 100644 --- a/src/pages/setting/setting.ts +++ b/src/pages/setting/setting.ts @@ -2,7 +2,8 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { AppProvider } from '../../providers/app/app'; -import { TranslateService } from '@ngx-translate/core'; +import { LanguageProvider } from '../../providers/language/language'; +import { UnitProvider } from '../../providers/unit/unit'; import { AboutPage } from '../about/about'; @@ -11,25 +12,42 @@ import { AboutPage } from '../about/about'; templateUrl: 'setting.html', }) export class SettingPage { - language: string; appName: string; + currentLanguage: string; + currentUnitCode: string; + unitList: Array; + languages: Array; + bitcoinUnit: Array constructor( public navCtrl: NavController, public navParams: NavParams, - public app: AppProvider, - public i18n: TranslateService, + private app: AppProvider, + private language: LanguageProvider, + private unit: UnitProvider ) { - app.getName().subscribe((data) => { - this.appName = data; - this.language = i18n.currentLang; - }); + this.appName = this.app.info.nameCase; + + this.currentUnitCode = this.unit.getCode(); + this.unitList = this.unit.getList(); + + this.currentLanguage = this.language.getCurrent(); + this.languages = this.language.getAvailables(); } ionViewDidLoad() { console.log('ionViewDidLoad SettingPage'); } + setLanguage(lang: string) { + this.currentLanguage = lang; + this.language.set(lang); + } + + setUnit(code: string) { + this.unit.setUnit(code); + } + openAboutPage() { this.navCtrl.push(AboutPage); } diff --git a/src/providers/app/app.ts b/src/providers/app/app.ts index 1a57de8d0..b75f07bbe 100644 --- a/src/providers/app/app.ts +++ b/src/providers/app/app.ts @@ -1,31 +1,83 @@ import { Injectable } from '@angular/core'; import { Http, Response } from '@angular/http'; +import { Logger } from '@nsalaun/ng-logger'; import 'rxjs/add/operator/map'; +import { LanguageProvider } from '../../providers/language/language'; +import { UnitProvider } from '../../providers/unit/unit'; +import { ConfigProvider } from '../../providers/config/config'; + +interface App { + WindowsStoreDisplayName: string; + WindowsStoreIdentityName: string; + androidVersion: string; + appDescription: string; + appUri: string; + bundleName: string; + commitHash: string; + description: string; + disclaimerUrl: string; + gitHubRepoBugs: string; + gitHubRepoName: string; + gitHubRepoUrl: string; + name: string; + nameCase: string; + nameCaseNoSpace: string; + nameNoSpace: string; + packageDescription: string; + packageName: string; + packageNameId: string; + purposeLine: string; + pushSenderId: string; + statusBarColor: string; + url: string; + userVisibleName: string; + version: string; + winAppName: string; + windowsAppId: string; + _enabledExtensions: { + amazon: boolean; + coinbase: boolean; + glidera: boolean; + } + _extraCSS: string; +} + @Injectable() export class AppProvider { - private jsonPath: string = '../assets/appConfig.json'; + public info: App; + private jsonPath: string = 'assets/appConfig.json'; - constructor(public http: Http) {} - - getCommitHash() { - return this.http.get(this.jsonPath) - .map((res:Response) => res.json().commitHash); + constructor( + public http: Http, + private logger: Logger, + private language: LanguageProvider, + private unit: UnitProvider, + private config: ConfigProvider + ) { + this.logger.info('AppProvider initialized.'); } - getName() { - return this.http.get(this.jsonPath) - .map((res:Response) => res.json().nameCase); + public load() { + return new Promise((resolve, reject) => { + this.config.load().then((config) => { + // storage -> config -> language -> unit -> app + // Everything ok + this.language.init(config); + this.unit.init(config); + this.getInfo().subscribe((info) => { + this.info = info; + resolve(true); + }); + }).catch((err) => { + // Something may be wrong + reject(err); + }); + }); } - getDescription() { + getInfo() { return this.http.get(this.jsonPath) - .map((res:Response) => res.json().description); + .map((res:Response) => res.json()); } - - getVersion() { - return this.http.get(this.jsonPath) - .map((res:Response) => res.json().version); - } - } diff --git a/src/providers/language/language.ts b/src/providers/language/language.ts index 7e17e773b..339087399 100644 --- a/src/providers/language/language.ts +++ b/src/providers/language/language.ts @@ -8,7 +8,7 @@ import * as _ from "lodash"; @Injectable() export class LanguageProvider { - public availables: Array = [ + private languages: Array = [ { name: 'English', isoCode: 'en' @@ -43,7 +43,7 @@ export class LanguageProvider { isoCode: 'pt', } ]; - public current: string; + private current: string; constructor( private logger: Logger, @@ -51,49 +51,57 @@ export class LanguageProvider { private config: ConfigProvider ) { this.logger.info('LanguageProvider initialized.'); + this.translate.onLangChange.subscribe((event) => { + this.logger.info('Setting language changed to: ' + event.lang); + }); } - load() { - return new Promise((resolve, reject) => { - // Get from browser - let browserLang = this.translate.getBrowserLang(); - let validBrowserLang = this.getName(browserLang) ? true : false; + init(config: object) { + // 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); - }); - }); + let configLanguage = config['wallet']['settings']['defaultLanguage']; // TODO + if (configLanguage) this.current = configLanguage; + else { + if (validBrowserLang) this.current = browserLang; + else this.current = this.getDefault(); + } + this.translate.setDefaultLang(this.current); } set(lang: string) { this.current = lang; this.translate.use(lang); - this.config.set({language: lang}); + this.config.set({wallet: { settings: { defaultLanguage: lang } } }); } getName(lang: string) { - return _.result(_.find(this.availables, { + return _.result(_.find(this.languages, { 'isoCode': lang }), 'name'); } - getDefaultLanguage() { - return this.availables[0]['isoCode']; + getDefault() { + return this.languages[0]['isoCode']; } - getCurrentLanguage() { + getCurrent() { return this.current; } - getLanguages() { - return this.availables; + getCurrentName() { + return this.getName(this.current); + } + + getCurrentInfo() { + return _.find(this.languages, { + 'isoCode': this.current + }); + } + + getAvailables() { + return this.languages; } } diff --git a/src/providers/unit/unit.ts b/src/providers/unit/unit.ts new file mode 100644 index 000000000..b315e76f5 --- /dev/null +++ b/src/providers/unit/unit.ts @@ -0,0 +1,64 @@ +import { Injectable } from '@angular/core'; +import { Logger } from '@nsalaun/ng-logger'; + +import { ConfigProvider } from '../../providers/config/config'; + +import * as _ from 'lodash'; + +interface Unit { + name: string; + shortName: string; + value: number; + decimals: number; + code: string; +} + +@Injectable() +export class UnitProvider { + public info: Unit; + private unitList: Array = [{ + name: 'bits (1,000,000 bits = 1BTC)', + shortName: 'bits', + value: 100, + decimals: 2, + code: 'bit', + }, { + name: 'BTC', + shortName: 'BTC', + value: 100000000, + decimals: 8, + code: 'btc', + }]; + + constructor( + private config: ConfigProvider, + private logger: Logger + ) { + this.logger.info('UnitProvider initialized.'); + } + + private getItem(code: string) { + return _.find(this.unitList, { + 'code': code + }); + } + + init(config: object) { + let code = config['wallet']['settings']['unitCode']; // TODO + this.info = this.getItem(code); + } + + getList() { + return this.unitList; + } + + getCode() { + return this.info.code; + } + + setUnit(code: string) { + this.info = this.getItem(code); + this.config.set({ wallet: { settings: this.info } }); + } + +}