From f6fe635189f1baa59a7cdc0603814d67999e1ab2 Mon Sep 17 00:00:00 2001 From: Gabriel Masclef Date: Wed, 20 Sep 2017 15:10:40 -0400 Subject: [PATCH] Feat: rate provider and alt currency implemented --- src/app/app.module.ts | 12 +- .../settings/alt-currency/alt-currency.html | 22 ++++ .../settings/alt-currency/alt-currency.scss | 3 + .../settings/alt-currency/alt-currency.ts | 49 ++++++++ src/pages/settings/settings.html | 6 +- src/pages/settings/settings.ts | 14 ++- src/providers/rate/rate.ts | 114 ++++++++++++++++++ 7 files changed, 210 insertions(+), 10 deletions(-) create mode 100644 src/pages/settings/alt-currency/alt-currency.html create mode 100644 src/pages/settings/alt-currency/alt-currency.scss create mode 100644 src/pages/settings/alt-currency/alt-currency.ts create mode 100644 src/providers/rate/rate.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 73546e8a3..4951cfd79 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -37,6 +37,8 @@ import { SettingsPage } from '../pages/settings/settings'; /* Settings */ import { AboutPage } from '../pages/settings/about/about'; import { TermsOfUsePage } from '../pages/settings/about/terms-of-use/terms-of-use'; +import { AltCurrencyPage } from '../pages/settings/alt-currency/alt-currency'; + /* Send */ import { AmountPage } from '../pages/send/amount/amount'; import { ConfirmPage } from '../pages/send/confirm/confirm'; @@ -54,6 +56,7 @@ import { LanguageProvider } from '../providers/language/language'; import { ScanProvider } from '../providers/scan/scan'; import { ProfileProvider } from '../providers/profile/profile'; import { BwcProvider } from '../providers/bwc/bwc'; +import { RateProvider } from '../providers/rate/rate'; export function createTranslateLoader(http: Http) { return new TranslatePoHttpLoader(http, 'assets/i18n', '.po'); @@ -77,7 +80,8 @@ export function createTranslateLoader(http: Http) { TabsPage, AmountPage, ConfirmPage, - CustomAmountPage + CustomAmountPage, + AltCurrencyPage ], imports: [ BrowserModule, @@ -112,7 +116,8 @@ export function createTranslateLoader(http: Http) { TabsPage, AmountPage, ConfirmPage, - CustomAmountPage + CustomAmountPage, + AltCurrencyPage ], providers: [ StatusBar, @@ -144,7 +149,8 @@ export function createTranslateLoader(http: Http) { QRScanner, ScanProvider, ProfileProvider, - BwcProvider + BwcProvider, + RateProvider ] }) export class AppModule { } diff --git a/src/pages/settings/alt-currency/alt-currency.html b/src/pages/settings/alt-currency/alt-currency.html new file mode 100644 index 000000000..b7967ed50 --- /dev/null +++ b/src/pages/settings/alt-currency/alt-currency.html @@ -0,0 +1,22 @@ + + + + + + + Alternative currency + + + + + + + + + + + diff --git a/src/pages/settings/alt-currency/alt-currency.scss b/src/pages/settings/alt-currency/alt-currency.scss new file mode 100644 index 000000000..d8fcac35e --- /dev/null +++ b/src/pages/settings/alt-currency/alt-currency.scss @@ -0,0 +1,3 @@ +page-alt-currency { + +} diff --git a/src/pages/settings/alt-currency/alt-currency.ts b/src/pages/settings/alt-currency/alt-currency.ts new file mode 100644 index 000000000..813af83d7 --- /dev/null +++ b/src/pages/settings/alt-currency/alt-currency.ts @@ -0,0 +1,49 @@ +import { Component } from '@angular/core'; +import { NavController, NavParams } from 'ionic-angular'; +import { RateProvider } from '../../../providers/rate/rate'; +import * as _ from 'lodash'; + +@Component({ + selector: 'page-alt-currency', + templateUrl: 'alt-currency.html', +}) +export class AltCurrencyPage { + + public completeAlternativeList: Array; + public searchedAltCurrency: string; + public altCurrencyList: Array; + public loading: any; + + constructor(public navCtrl: NavController, public navParams: NavParams, private rate: RateProvider) { + this.completeAlternativeList = []; + this.altCurrencyList = []; + this.rate.updateRates().then((data) => { + this.completeAlternativeList = this.rate.listAlternatives(true); + this.altCurrencyList = this.completeAlternativeList; + }) + .catch((error) => { + console.log("Error: ", error); + }); + } + + ionViewDidLoad() { + console.log('ionViewDidLoad AltCurrencyPage'); + } + + goBack() { + this.navCtrl.pop(); + } + + altSelected(alt: any) { + console.log("Alt selected: ", alt); + } + + findCurrency(searchedAltCurrency: string) { + this.altCurrencyList = _.filter(this.completeAlternativeList, (item) => { + var val = item.name + var val2 = item.isoCode; + return _.includes(val.toLowerCase(), searchedAltCurrency.toLowerCase()) || _.includes(val2.toLowerCase(), searchedAltCurrency.toLowerCase()); + }) + } + +} diff --git a/src/pages/settings/settings.html b/src/pages/settings/settings.html index 744d31107..bb8ee6b39 100644 --- a/src/pages/settings/settings.html +++ b/src/pages/settings/settings.html @@ -41,15 +41,11 @@ {{ lang.name }} - + Alternative currency - - USD - ARS - diff --git a/src/pages/settings/settings.ts b/src/pages/settings/settings.ts index 59380ff99..2ed750564 100644 --- a/src/pages/settings/settings.ts +++ b/src/pages/settings/settings.ts @@ -1,14 +1,17 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; - +import { ModalController } from 'ionic-angular'; import { AppProvider } from '../../providers/app/app'; import { LanguageProvider } from '../../providers/language/language'; +import { RateProvider } from '../../providers/rate/rate'; +import { AltCurrencyPage } from './alt-currency/alt-currency'; import { AboutPage } from './about/about'; @Component({ selector: 'page-settings', templateUrl: 'settings.html', + providers: [RateProvider] }) export class SettingsPage { appName: string; @@ -16,10 +19,12 @@ export class SettingsPage { languages: Array; constructor( + public modalCtrl: ModalController, public navCtrl: NavController, public navParams: NavParams, private app: AppProvider, - private language: LanguageProvider + private language: LanguageProvider, + private rate: RateProvider ) { this.appName = this.app.info.nameCase; @@ -31,6 +36,11 @@ export class SettingsPage { console.log('ionViewDidLoad SettingsPage'); } + altCurrencyModal() { + let modal = this.modalCtrl.create(AltCurrencyPage); + modal.present(); + } + setLanguage(lang: string) { this.currentLanguage = lang; this.language.set(lang); diff --git a/src/providers/rate/rate.ts b/src/providers/rate/rate.ts new file mode 100644 index 000000000..8d27ad240 --- /dev/null +++ b/src/providers/rate/rate.ts @@ -0,0 +1,114 @@ +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/toPromise'; +import * as _ from 'lodash'; + +@Injectable() +export class RateProvider { + + private _rates: Object; + private _alternatives: Array; + private _ratesBCH: Object; + private SAT_TO_BTC: any; + private BTC_TO_SAT: any; + + private rateServiceUrl = 'https://bitpay.com/api/rates'; + private bchRateServiceUrl = 'https://api.kraken.com/0/public/Ticker?pair=BCHUSD,BCHEUR'; + + constructor(public http: Http) { + console.log('Hello RateProvider Provider'); + this._rates = {}; + this._alternatives = []; + this._ratesBCH = {}; + this.SAT_TO_BTC = 1 / 1e8; + this.BTC_TO_SAT = 1e8; + } + + updateRates(): Promise { + return new Promise ((resolve, reject) => { + let self = this; + this.getBTC().then((dataBTC) => { + + _.each(dataBTC, (currency) => { + self._rates[currency.code] = currency.rate; + self._alternatives.push({ + name: currency.name, + isoCode: currency.code, + rate: currency.rate + }); + }); + + this.getBCH().then((dataBCH) => { + + _.each(dataBCH.result, (data, paircode) => { + var code = paircode.substr(3,3); + var rate =data.c[0]; + self._ratesBCH[code] = rate; + }); + + resolve(); + }) + .catch((errorBCH) => { + console.log("Error: ", errorBCH); + reject(errorBCH); + }); + }) + .catch((errorBTC) => { + console.log("Error: ", errorBTC); + reject(errorBTC); + }); + }); + } + + getBTC(): Promise { + return this.http.get(this.rateServiceUrl) + .map((response) => response.json()) + .toPromise() + .catch((error) => console.log("Error", error)); + } + + getBCH(): Promise { + return this.http.get(this.bchRateServiceUrl) + .map((response) => response.json()) + .toPromise() + .catch((error) => console.log("Error", error)); + } + + getRate(code, chain) { + if (chain == 'bch') + return this._ratesBCH[code]; + else + return this._rates[code]; + }; + + getAlternatives() { + return this._alternatives; + }; + + toFiat(satoshis, code, chain) { + return satoshis * this.SAT_TO_BTC * this.getRate(code, chain); + }; + + fromFiat(amount, code, chain) { + return amount / this.getRate(code, chain) * this.BTC_TO_SAT; + }; + + listAlternatives(sort: boolean) { + var self = this; + + var alternatives = _.map(this.getAlternatives(), (item) => { + return { + name: item.name, + isoCode: item.isoCode + } + }); + if (sort) { + alternatives.sort( (a, b) => { + return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1; + }); + } + return _.uniqBy(alternatives, 'isoCode'); + }; + +}