copay-crown
Version:
A Secure Crown Wallet
202 lines (177 loc) • 6.69 kB
text/typescript
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ModalController, NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger';
// providers
import { CoinbaseProvider } from '../../../providers/coinbase/coinbase';
import { ExternalLinkProvider } from '../../../providers/external-link/external-link';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process';
import { PlatformProvider } from '../../../providers/platform/platform';
import { PopupProvider } from '../../../providers/popup/popup';
// pages
import { AmountPage } from '../../send/amount/amount';
import { CoinbaseTxDetailsPage } from './coinbase-tx-details/coinbase-tx-details';
import * as _ from 'lodash';
export class CoinbasePage {
public tx: any;
public currency: string;
public accessToken: string;
public accountId: string;
public loading: boolean;
public buyPrice: string;
public sellPrice: string;
public pendingTransactions: object = { data: {} };
public code: string;
public showOauthForm: boolean;
public oauthCodeForm: FormGroup;
private isNW: boolean = false; // TODO: desktop
private isCordova: boolean;
constructor(
private coinbaseProvider: CoinbaseProvider,
private logger: Logger,
private popupProvider: PopupProvider,
private navCtrl: NavController,
private externalLinkProvider: ExternalLinkProvider,
private platformProvider: PlatformProvider,
private onGoingProcessProvider: OnGoingProcessProvider,
private modalCtrl: ModalController,
private navParams: NavParams,
private formBuilder: FormBuilder
) {
this.oauthCodeForm = this.formBuilder.group({
code: ['', Validators.compose([Validators.minLength(1), Validators.required])]
});
// TODO: desktop
// this.isNW = this.platformProvider.isNW;
this.isCordova = this.platformProvider.isCordova;
this.showOauthForm = false;
}
ionViewWillEnter() {
if (this.navParams.data.code) {
this.coinbaseProvider.getStoredToken((at: string) => {
if (!at) this.submitOauthCode(this.navParams.data.code);
});
} else {
this.init();
}
}
private init(): void {
this.currency = this.coinbaseProvider.getAvailableCurrency();
this.loading = true;
this.coinbaseProvider.getStoredToken((at: string) => {
this.accessToken = at;
// Update Access Token if necessary
this.coinbaseProvider.init((err: any, data: any) => {
if (err || _.isEmpty(data)) {
this.loading = false;
if (err) {
this.logger.error(err);
let errorId = err.errors ? err.errors[0].id : null;
err = err.errors ? err.errors[0].message : (err.error_description ? err.error_description : (err.error || 'Unknown error'));
this.popupProvider.ionicAlert('Error connecting to Coinbase', err).then(() => {
if (errorId == 'revoked_token') {
this.coinbaseProvider.logout();
}
this.navCtrl.pop();
});
}
return;
}
// Show rates
this.coinbaseProvider.buyPrice(data.accessToken, this.currency, (err, b: any) => {
this.buyPrice = b.data || null;
this.coinbaseProvider.sellPrice(data.accessToken, this.currency, (err, s: any) => {
this.sellPrice = s.data || null;
this.loading = false;
});
});
// Updating accessToken and accountId
this.accessToken = data.accessToken;
this.accountId = data.accountId;
this.updateTransactions();
});
});
}
public updateTransactions(): void {
this.logger.debug('Getting transactions...');
this.coinbaseProvider.getPendingTransactions(this.pendingTransactions);
}
public openAuthenticateWindow(): void {
let oauthUrl = this.getAuthenticateUrl();
if (!this.isNW) {
this.externalLinkProvider.open(oauthUrl);
} else {
/* TODO: desktop
let gui = require('nw.gui');
gui.Window.open(oauthUrl, {
focus: true,
position: 'center'
}, (new_win: any) => {
new_win.on('loaded', () => {
let title = new_win.window.document.title;
if (title.indexOf('Coinbase') == -1) {
this.code = title;
this.submitOauthCode(this.code);
new_win.close();
}
});
});
*/
}
}
public submitOauthCode(code: string): void {
this.onGoingProcessProvider.set('connectingCoinbase');
this.coinbaseProvider.getToken(code, (err: string, accessToken: string) => {
this.onGoingProcessProvider.clear();
if (err) {
this.popupProvider.ionicAlert('Error connecting to Coinbase', err);
return;
}
this.accessToken = accessToken;
this.init();
});
}
public getAuthenticateUrl(): string {
this.showOauthForm = this.isCordova || this.isNW ? false : true;
return this.coinbaseProvider.getOauthCodeUrl();
}
public openSignupWindow(): void {
let url = this.coinbaseProvider.getSignupUrl();
let optIn = true;
let title = 'Sign Up for Coinbase';
let message = 'This will open Coinbase.com, where you can create an account.';
let okText = 'Go to Coinbase';
let cancelText = 'Back';
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
}
public openSupportWindow(): void {
let url = this.coinbaseProvider.getSupportUrl();
let optIn = true;
let title = 'Coinbase Support';
let message = 'You can email support@coinbase.com for direct support, or you can view their help center.';
let okText = 'Open Help Center';
let cancelText = 'Go Back';
this.externalLinkProvider.open(url, optIn, title, message, okText, cancelText);
}
public toggleOauthForm(): void {
this.showOauthForm = !this.showOauthForm;
}
public openTxModal(tx: any): any {
this.tx = tx;
let modal = this.modalCtrl.create(CoinbaseTxDetailsPage, { tx: this.tx });
modal.present();
modal.onDidDismiss((data) => {
if (data.updateRequired) this.updateTransactions();
})
}
public goToBuyCoinbasePage(): void {
this.navCtrl.push(AmountPage, { nextPage: 'BuyCoinbasePage', currency: this.currency, coin: 'btc', fixedUnit: true });
}
public goToSellCoinbasePage(): void {
this.navCtrl.push(AmountPage, { nextPage: 'SellCoinbasePage', currency: this.currency, coin: 'btc', fixedUnit: true })
}
}