mirror of https://github.com/BTCPrivate/copay.git
155 lines
5.1 KiB
TypeScript
155 lines
5.1 KiB
TypeScript
import { Component } from '@angular/core';
|
|
import { TranslateService } from '@ngx-translate/core';
|
|
import { ViewController } from 'ionic-angular';
|
|
import * as _ from 'lodash';
|
|
import { Logger } from '../../../providers/logger/logger';
|
|
|
|
// Providers
|
|
import { FeeProvider } from '../../../providers/fee/fee';
|
|
import { PopupProvider } from '../../../providers/popup/popup';
|
|
|
|
@Component({
|
|
selector: 'page-choose-fee-level',
|
|
templateUrl: 'choose-fee-level.html',
|
|
})
|
|
export class ChooseFeeLevelPage {
|
|
|
|
private FEE_MULTIPLIER: number = 10;
|
|
private FEE_MIN: number = 0;
|
|
public maxFeeRecommended: number;
|
|
public minFeeRecommended: number;
|
|
private minFeeAllowed: number;
|
|
public maxFeeAllowed: number;
|
|
|
|
public network: string;
|
|
public feeLevel: string;
|
|
public customFeePerKB: string;
|
|
public feePerSatByte: string;
|
|
public selectedFee: string;
|
|
public feeOpts: any[];
|
|
public loadingFee: boolean;
|
|
public feeLevels: any;
|
|
public coin: string;
|
|
public avgConfirmationTime: number;
|
|
public customSatPerByte: number;
|
|
public maxFee: number;
|
|
public minFee: number;
|
|
public showError: boolean;
|
|
public showMaxWarning: boolean;
|
|
public showMinWarning: boolean;
|
|
|
|
constructor(
|
|
private viewCtrl: ViewController,
|
|
private logger: Logger,
|
|
private popupProvider: PopupProvider,
|
|
private feeProvider: FeeProvider,
|
|
private translate: TranslateService
|
|
) {
|
|
// From parent controller
|
|
this.network = this.viewCtrl.data.network;
|
|
this.feeLevel = this.viewCtrl.data.feeLevel;
|
|
|
|
// IF usingCustomFee
|
|
this.customFeePerKB = this.viewCtrl.data.customFeePerKB ? this.viewCtrl.data.customFeePerKB : null;
|
|
this.feePerSatByte = this.viewCtrl.data.feePerSatByte ? this.viewCtrl.data.feePerSatByte : null;
|
|
|
|
if (_.isEmpty(this.feeLevel)) this.showErrorAndClose(null, this.translate.instant('Fee level is not defined'));
|
|
this.selectedFee = this.feeLevel;
|
|
|
|
this.feeOpts = Object.keys(this.feeProvider.feeOpts);
|
|
this.loadingFee = true;
|
|
this.feeProvider.getFeeLevels(this.coin).then((levels: any) => {
|
|
this.loadingFee = false;
|
|
if (_.isEmpty(levels)) {
|
|
this.showErrorAndClose(null, this.translate.instant('Could not get fee levels'));
|
|
return;
|
|
}
|
|
this.feeLevels = levels;
|
|
this.updateFeeRate();
|
|
}).catch((err: any) => {
|
|
this.loadingFee = false;
|
|
this.showErrorAndClose(null, err);
|
|
return;
|
|
});
|
|
}
|
|
|
|
public close() {
|
|
this.viewCtrl.dismiss({ newFeeLevel: "Hola mundo" });
|
|
}
|
|
|
|
private showErrorAndClose(title: string, msg: string): void {
|
|
title = title ? title : this.translate.instant('Error');
|
|
this.logger.error(msg);
|
|
this.popupProvider.ionicAlert(title, msg).then(() => {
|
|
this.viewCtrl.dismiss();
|
|
});
|
|
}
|
|
|
|
public updateFeeRate() {
|
|
let value: any = _.find(this.feeLevels.levels[this.network], (feeLevel: any) => {
|
|
return feeLevel.level == this.feeLevel;
|
|
});
|
|
|
|
// If no custom fee
|
|
if (value) {
|
|
this.customFeePerKB = null;
|
|
this.feePerSatByte = (value.feePerKb / 1000).toFixed();
|
|
this.avgConfirmationTime = value.nbBlocks * 10;
|
|
} else {
|
|
this.avgConfirmationTime = null;
|
|
this.customSatPerByte = Number(this.feePerSatByte);
|
|
this.customFeePerKB = (+this.feePerSatByte * 1000).toFixed();
|
|
}
|
|
|
|
// Warnings
|
|
this.setFeesRecommended();
|
|
this.checkFees(this.feePerSatByte);
|
|
}
|
|
|
|
public setFeesRecommended(): void {
|
|
this.maxFeeRecommended = this.getMaxRecommended();
|
|
this.minFeeRecommended = this.getMinRecommended();
|
|
this.minFeeAllowed = this.FEE_MIN;
|
|
this.maxFeeAllowed = this.maxFeeRecommended * this.FEE_MULTIPLIER;
|
|
this.maxFee = this.maxFeeRecommended > this.maxFeeAllowed ? this.maxFeeRecommended : this.maxFeeAllowed;
|
|
this.minFee = this.minFeeRecommended < this.minFeeAllowed ? this.minFeeRecommended : this.minFeeAllowed;
|
|
}
|
|
|
|
private getMinRecommended(): number {
|
|
let value: any = _.find(this.feeLevels.levels[this.network], (feeLevel: any) => {
|
|
return feeLevel.level == 'superEconomy';
|
|
});
|
|
return parseInt((value.feePerKb / 1000).toFixed(), 10);
|
|
}
|
|
|
|
private getMaxRecommended(): number {
|
|
let value: any = _.find(this.feeLevels.levels[this.network], (feeLevel: any) => {
|
|
return feeLevel.level == 'urgent';
|
|
});
|
|
return parseInt((value.feePerKb / 1000).toFixed(), 10);
|
|
}
|
|
|
|
public checkFees(feePerSatByte: string): void {
|
|
let fee = Number(feePerSatByte);
|
|
this.showError = fee <= this.minFeeAllowed ? true : false;
|
|
this.showMinWarning =
|
|
fee > this.minFeeAllowed && fee < this.minFeeRecommended ? true : false;
|
|
this.showMaxWarning =
|
|
fee < this.maxFeeAllowed && fee > this.maxFeeRecommended ? true : false;
|
|
}
|
|
|
|
public ok(): void {
|
|
this.customFeePerKB = this.customFeePerKB ? (this.customSatPerByte * 1000).toFixed() : null;
|
|
this.viewCtrl.dismiss({ newFeeLevel: this.feeLevel, customFeePerKB: this.customFeePerKB });
|
|
}
|
|
|
|
public changeSelectedFee(newFeeLevelValue: string): void {
|
|
if (this.feeLevel != newFeeLevelValue) {
|
|
this.logger.debug('New fee level: ' + newFeeLevelValue);
|
|
this.feeLevel = newFeeLevelValue;
|
|
this.updateFeeRate();
|
|
}
|
|
}
|
|
|
|
}
|