Feat: rate provider and alt currency implemented

This commit is contained in:
Gabriel Masclef 2017-09-20 15:10:40 -04:00
parent d68da20300
commit f6fe635189
7 changed files with 210 additions and 10 deletions

View File

@ -37,6 +37,8 @@ import { SettingsPage } from '../pages/settings/settings';
/* Settings */ /* Settings */
import { AboutPage } from '../pages/settings/about/about'; import { AboutPage } from '../pages/settings/about/about';
import { TermsOfUsePage } from '../pages/settings/about/terms-of-use/terms-of-use'; import { TermsOfUsePage } from '../pages/settings/about/terms-of-use/terms-of-use';
import { AltCurrencyPage } from '../pages/settings/alt-currency/alt-currency';
/* Send */ /* Send */
import { AmountPage } from '../pages/send/amount/amount'; import { AmountPage } from '../pages/send/amount/amount';
import { ConfirmPage } from '../pages/send/confirm/confirm'; import { ConfirmPage } from '../pages/send/confirm/confirm';
@ -54,6 +56,7 @@ import { LanguageProvider } from '../providers/language/language';
import { ScanProvider } from '../providers/scan/scan'; import { ScanProvider } from '../providers/scan/scan';
import { ProfileProvider } from '../providers/profile/profile'; import { ProfileProvider } from '../providers/profile/profile';
import { BwcProvider } from '../providers/bwc/bwc'; import { BwcProvider } from '../providers/bwc/bwc';
import { RateProvider } from '../providers/rate/rate';
export function createTranslateLoader(http: Http) { export function createTranslateLoader(http: Http) {
return new TranslatePoHttpLoader(http, 'assets/i18n', '.po'); return new TranslatePoHttpLoader(http, 'assets/i18n', '.po');
@ -77,7 +80,8 @@ export function createTranslateLoader(http: Http) {
TabsPage, TabsPage,
AmountPage, AmountPage,
ConfirmPage, ConfirmPage,
CustomAmountPage CustomAmountPage,
AltCurrencyPage
], ],
imports: [ imports: [
BrowserModule, BrowserModule,
@ -112,7 +116,8 @@ export function createTranslateLoader(http: Http) {
TabsPage, TabsPage,
AmountPage, AmountPage,
ConfirmPage, ConfirmPage,
CustomAmountPage CustomAmountPage,
AltCurrencyPage
], ],
providers: [ providers: [
StatusBar, StatusBar,
@ -144,7 +149,8 @@ export function createTranslateLoader(http: Http) {
QRScanner, QRScanner,
ScanProvider, ScanProvider,
ProfileProvider, ProfileProvider,
BwcProvider BwcProvider,
RateProvider
] ]
}) })
export class AppModule { } export class AppModule { }

View File

@ -0,0 +1,22 @@
<ion-header>
<ion-navbar>
<ion-buttons start>
<button (click)="goBack()" ion-button icon-only>
<ion-icon name="arrow-back"></ion-icon>
</button>
</ion-buttons>
<ion-title>Alternative currency</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
<ion-input type="search" placeholder="Search your currency" [(ngModel)]="searchedAltCurrency" (ngModelChange)="findCurrency(searchedAltCurrency)"></ion-input>
<ion-list>
<button ion-item *ngFor="let alt of altCurrencyList" (click)="altSelected(alt)">
{{ alt.name }} <span item-end>{{alt.isoCode}}</span>
</button>
</ion-list>
</ion-content>

View File

@ -0,0 +1,3 @@
page-alt-currency {
}

View File

@ -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<any>;
public searchedAltCurrency: string;
public altCurrencyList: Array<any>;
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());
})
}
}

View File

@ -41,15 +41,11 @@
<ion-option *ngFor="let lang of languages" [value]="lang.isoCode">{{ lang.name }}</ion-option> <ion-option *ngFor="let lang of languages" [value]="lang.isoCode">{{ lang.name }}</ion-option>
</ion-select> </ion-select>
</ion-item> </ion-item>
<ion-item> <ion-item (click)="altCurrencyModal()">
<ion-icon name="cash" item-start></ion-icon> <ion-icon name="cash" item-start></ion-icon>
<ion-label> <ion-label>
Alternative currency Alternative currency
</ion-label> </ion-label>
<ion-select>
<ion-option>USD</ion-option>
<ion-option>ARS</ion-option>
</ion-select>
</ion-item> </ion-item>
<ion-item> <ion-item>
<ion-icon name="git-merge" item-start></ion-icon> <ion-icon name="git-merge" item-start></ion-icon>

View File

@ -1,14 +1,17 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { ModalController } from 'ionic-angular';
import { AppProvider } from '../../providers/app/app'; import { AppProvider } from '../../providers/app/app';
import { LanguageProvider } from '../../providers/language/language'; import { LanguageProvider } from '../../providers/language/language';
import { RateProvider } from '../../providers/rate/rate';
import { AltCurrencyPage } from './alt-currency/alt-currency';
import { AboutPage } from './about/about'; import { AboutPage } from './about/about';
@Component({ @Component({
selector: 'page-settings', selector: 'page-settings',
templateUrl: 'settings.html', templateUrl: 'settings.html',
providers: [RateProvider]
}) })
export class SettingsPage { export class SettingsPage {
appName: string; appName: string;
@ -16,10 +19,12 @@ export class SettingsPage {
languages: Array<any>; languages: Array<any>;
constructor( constructor(
public modalCtrl: ModalController,
public navCtrl: NavController, public navCtrl: NavController,
public navParams: NavParams, public navParams: NavParams,
private app: AppProvider, private app: AppProvider,
private language: LanguageProvider private language: LanguageProvider,
private rate: RateProvider
) { ) {
this.appName = this.app.info.nameCase; this.appName = this.app.info.nameCase;
@ -31,6 +36,11 @@ export class SettingsPage {
console.log('ionViewDidLoad SettingsPage'); console.log('ionViewDidLoad SettingsPage');
} }
altCurrencyModal() {
let modal = this.modalCtrl.create(AltCurrencyPage);
modal.present();
}
setLanguage(lang: string) { setLanguage(lang: string) {
this.currentLanguage = lang; this.currentLanguage = lang;
this.language.set(lang); this.language.set(lang);

114
src/providers/rate/rate.ts Normal file
View File

@ -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<any>;
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<any> {
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<any> {
return this.http.get(this.rateServiceUrl)
.map((response) => response.json())
.toPromise()
.catch((error) => console.log("Error", error));
}
getBCH(): Promise<any> {
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');
};
}