diff --git a/src/pages/add/copayers/copayers.ts b/src/pages/add/copayers/copayers.ts index 9a5770823..9022ec0a8 100644 --- a/src/pages/add/copayers/copayers.ts +++ b/src/pages/add/copayers/copayers.ts @@ -60,10 +60,6 @@ export class CopayersPage { }); } - ionViewWillLeave() { - this.events.unsubscribe('bwsEvent'); - } - private updateWallet(): void { this.logger.debug('Updating wallet:' + this.wallet.name) this.walletProvider.getStatus(this.wallet, {}).then((status: any) => { diff --git a/src/pages/add/create-wallet/create-wallet.ts b/src/pages/add/create-wallet/create-wallet.ts index 6af80b099..f18edd71e 100644 --- a/src/pages/add/create-wallet/create-wallet.ts +++ b/src/pages/add/create-wallet/create-wallet.ts @@ -198,7 +198,7 @@ export class CreateWalletPage implements OnInit { this.profileProvider.createWallet(opts).then((wallet: any) => { this.onGoingProcessProvider.set('creatingWallet', false); - this.events.publish('Local/WalletAction', wallet.credentials.walletId); + this.events.publish('status:updated'); this.walletProvider.updateRemotePreferences(wallet); this.pushNotificationsProvider.updateSubscription(wallet); diff --git a/src/pages/add/import-wallet/import-wallet.ts b/src/pages/add/import-wallet/import-wallet.ts index 84d9f11b6..215645977 100644 --- a/src/pages/add/import-wallet/import-wallet.ts +++ b/src/pages/add/import-wallet/import-wallet.ts @@ -204,7 +204,7 @@ export class ImportWalletPage { private finish(wallet: any): void { this.walletProvider.updateRemotePreferences(wallet).then(() => { this.profileProvider.setBackupFlag(wallet.credentials.walletId); - this.events.publish('Local/WalletAction', wallet.credentials.walletId); + this.events.publish('status:updated'); if (this.fromOnboarding) { this.profileProvider.setDisclaimerAccepted().catch((err: any) => { this.logger.error(err); diff --git a/src/pages/add/join-wallet/join-wallet.ts b/src/pages/add/join-wallet/join-wallet.ts index cd9dd14d5..6c2fa76d2 100644 --- a/src/pages/add/join-wallet/join-wallet.ts +++ b/src/pages/add/join-wallet/join-wallet.ts @@ -148,7 +148,7 @@ export class JoinWalletPage { this.profileProvider.joinWallet(opts).then((wallet: any) => { this.onGoingProcessProvider.set('joiningWallet', false); - this.events.publish('Local/WalletAction', wallet.credentials.walletId); + this.events.publish('status:updated'); this.walletProvider.updateRemotePreferences(wallet); if (!wallet.isComplete()) { diff --git a/src/pages/home/home.html b/src/pages/home/home.html index df01c8052..87a973e57 100644 --- a/src/pages/home/home.html +++ b/src/pages/home/home.html @@ -65,7 +65,7 @@
Payment Proposals
- {{txpsN}} + {{txpsN}} diff --git a/src/pages/home/home.ts b/src/pages/home/home.ts index 1ba93bd3f..a913dc39a 100644 --- a/src/pages/home/home.ts +++ b/src/pages/home/home.ts @@ -70,6 +70,7 @@ export class HomePage { private isNW: boolean; private isWindowsPhoneApp: boolean; + private updatingWalletId: object; constructor( private navCtrl: NavController, @@ -94,19 +95,17 @@ export class HomePage { private bitPayCardProvider: BitPayCardProvider, private translate: TranslateService ) { + this.updatingWalletId = {}; this.cachedBalanceUpdateOn = ''; this.isNW = this.platformProvider.isNW; this.isWindowsPhoneApp = this.platformProvider.isWP; this.showReorderBtc = false; this.showReorderBch = false; - this.setWallets(); } ionViewWillEnter() { this.config = this.configProvider.get(); - this.setWallets(); - this.recentTransactionsEnabled = this.config.recentTransactions.enabled; if (this.recentTransactionsEnabled) this.getNotifications(); @@ -120,15 +119,19 @@ export class HomePage { return homeIntegrations.show == true; }); + // BWS Events: Update Status per Wallet + // NewBlock, NewCopayer, NewAddress, NewTxProposal, TxProposalAcceptedBy, TxProposalRejectedBy, txProposalFinallyRejected, + // txProposalFinallyAccepted, TxProposalRemoved, NewIncomingTx, NewOutgoingTx this.events.subscribe('bwsEvent', (walletId: string) => { this.update(walletId); }); - this.events.subscribe('Local/TxAction', (walletId: string) => { - this.update(walletId); - }); - this.events.subscribe('Local/WalletAction', (walletId: string) => { - this.update(walletId); + + // Create, Join, Import and Delete -> Get Wallets -> Update Status for All Wallets + this.events.subscribe('status:updated', () => { + this.setWallets(); }); + + // Hide stars to rate this.events.subscribe('feedback:hide', () => { this.showRateCard = false; }); @@ -156,21 +159,32 @@ export class HomePage { ionViewDidLoad() { this.logger.info('ionViewDidLoad HomePage'); - this.updateAllWallets(); + this.setWallets(); } - private update(walletId: string): void { - this.logger.debug('Got action for wallet ' + walletId); - let wallet = this.profileProvider.getWallet(walletId); - this.updateWallet(wallet); + private startUpdatingWalletId(walletId: string) { + this.updatingWalletId[walletId] = true; + } + + private stopUpdatingWalletId(walletId: string) { + setTimeout(() => { + this.updatingWalletId[walletId] = false; + }, 10000); + } + + private update(walletId: string) { if (this.recentTransactionsEnabled) this.getNotifications(); + this.updateWallet(walletId); } - private setWallets(): void { + private setWallets = _.debounce(() => { this.wallets = this.profileProvider.getWallets(); this.walletsBtc = this.profileProvider.getWallets({ coin: 'btc' }); this.walletsBch = this.profileProvider.getWallets({ coin: 'bch' }); - } + this.updateAllWallets(); + }, 10000, { + 'leading': true + }); public checkHomeTip(): void { this.persistenceProvider.getHomeTipAccepted().then((value: string) => { @@ -217,24 +231,34 @@ export class HomePage { this.persistenceProvider.setFeedbackInfo(feedbackInfo); } - private updateWallet(wallet: any): void { - this.logger.debug('Updating wallet:' + wallet.name) + private updateWallet(walletId: string): void { + if (this.updatingWalletId[walletId]) return; + this.startUpdatingWalletId(walletId); + let wallet = this.profileProvider.getWallet(walletId); this.walletProvider.getStatus(wallet, {}).then((status: any) => { wallet.status = status; + wallet.error = null; + this.profileProvider.setLastKnownBalance(wallet.id, wallet.status.availableBalanceStr); + + //this.setWallets(); this.updateTxps(); + this.stopUpdatingWalletId(walletId); }).catch((err: any) => { this.logger.error(err); + this.stopUpdatingWalletId(walletId); }); } - private updateTxps(): void { + private updateTxps = _.debounce(() => { this.profileProvider.getTxps({ limit: 3 }).then((data: any) => { this.txps = data.txps; this.txpsN = data.n; }).catch((err: any) => { this.logger.error(err); }); - } + }, 5000, { + 'leading': true + }); private getNotifications = _.debounce(() => { this.profileProvider.getNotifications({ limit: 3 }).then((data: any) => { @@ -243,9 +267,9 @@ export class HomePage { }).catch((err: any) => { this.logger.error(err); }); - }, 2000, { - 'leading': true - }); + }, 5000, { + 'leading': true + }); private updateAllWallets(): void { let wallets: Array = []; diff --git a/src/pages/integrations/shapeshift/shapeshift.ts b/src/pages/integrations/shapeshift/shapeshift.ts index ca9f0aa4e..bf2f9a7a3 100644 --- a/src/pages/integrations/shapeshift/shapeshift.ts +++ b/src/pages/integrations/shapeshift/shapeshift.ts @@ -43,10 +43,6 @@ export class ShapeshiftPage { }); } - ionViewWillLeave() { - this.events.unsubscribe('bwsEvent'); - } - public openExternalLink(url: string): void { this.externalLinkProvider.open(url); } diff --git a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts index 48d09e336..593613850 100644 --- a/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts +++ b/src/pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; -import { NavController, NavParams } from 'ionic-angular'; +import { NavController, NavParams, Events } from 'ionic-angular'; import { Logger } from '../../../../../providers/logger/logger'; //providers @@ -26,6 +26,7 @@ export class WalletDeletePage { private onGoingProcessProvider: OnGoingProcessProvider, private pushNotificationsProvider: PushNotificationsProvider, private logger: Logger, + private events: Events, private translate: TranslateService ) { @@ -51,6 +52,7 @@ export class WalletDeletePage { public deleteWallet(): void { this.onGoingProcessProvider.set('deletingWallet', true); this.profileProvider.deleteWalletClient(this.wallet).then(() => { + this.events.publish('status:updated'); this.onGoingProcessProvider.set('deletingWallet', false); this.pushNotificationsProvider.unsubscribe(this.wallet); this.navCtrl.popToRoot({ animate: false }); @@ -59,4 +61,4 @@ export class WalletDeletePage { this.popupProvider.ionicAlert(this.translate.instant('Error'), err.message || err); }); }; -} \ No newline at end of file +} diff --git a/src/pages/tx-details/tx-details.ts b/src/pages/tx-details/tx-details.ts index 518e003ec..185ff06aa 100644 --- a/src/pages/tx-details/tx-details.ts +++ b/src/pages/tx-details/tx-details.ts @@ -86,10 +86,6 @@ export class TxDetailsPage { }); } - ionViewWillLeave() { - this.events.unsubscribe('bwsEvent'); - } - public readMore(): void { let url = 'https://github.com/bitpay/copay/wiki/COPAY---FAQ#amount-too-low-to-spend'; let optIn = true; diff --git a/src/pages/txp-details/txp-details.ts b/src/pages/txp-details/txp-details.ts index 5be2b5605..198795315 100644 --- a/src/pages/txp-details/txp-details.ts +++ b/src/pages/txp-details/txp-details.ts @@ -91,9 +91,6 @@ export class TxpDetailsPage { this.tx.canBeRemoved = (Date.now() / 1000 - (this.tx.ts || this.tx.createdOn)) > this.GLIDERA_LOCK_TIME; } } - this.events.subscribe('accepted', () => { - this.sign(); - }); this.events.subscribe('bwsEvent', (walletId: string, type: string, n: number) => { _.each([ @@ -215,7 +212,6 @@ export class TxpDetailsPage { public sign(): void { this.loading = true; this.walletProvider.publishAndSign(this.wallet, this.tx).then((txp: any) => { - this.events.publish('UpdateTx'); this.openSuccessModal(); }).catch((err: any) => { this.setError(err, ('Could not send payment')); @@ -248,7 +244,6 @@ export class TxpDetailsPage { }).catch((err: any) => { this.onGoingProcessProvider.set('removeTx', false); if (err && !(err.message && err.message.match(/Unexpected/))) { - this.events.publish('UpdateTx'); this.setError(err, this.translate.instant('Could not delete payment proposal')); } }); @@ -308,7 +303,6 @@ export class TxpDetailsPage { }; public close(): void { - this.events.unsubscribe('bwsEvent'); this.loading = false; this.viewCtrl.dismiss(); } diff --git a/src/pages/wallet-details/wallet-details.ts b/src/pages/wallet-details/wallet-details.ts index e1bb143c3..be6fae244 100644 --- a/src/pages/wallet-details/wallet-details.ts +++ b/src/pages/wallet-details/wallet-details.ts @@ -87,7 +87,6 @@ export class WalletDetailsPage { } ionViewWillLeave() { - this.events.unsubscribe('bwsEvent'); this.events.unsubscribe('Local/TxAction'); } diff --git a/src/providers/profile/profile.ts b/src/providers/profile/profile.ts index c88015979..b4347e679 100644 --- a/src/providers/profile/profile.ts +++ b/src/providers/profile/profile.ts @@ -162,8 +162,7 @@ export class ProfileProvider { wallet.on('walletCompleted', () => { this.logger.debug('Wallet completed'); this.updateCredentials(JSON.parse(wallet.export())) - // TODO: never used - //this.events.publish('wallet:completed', walletId); + this.events.publish('status:updated'); }); wallet.initialize({ @@ -707,7 +706,6 @@ export class ProfileProvider { return reject(err); }); }).catch((err: any) => { - this.events.publish('Local/DeviceError', err); return reject(err); }); }); diff --git a/src/providers/wallet/wallet.ts b/src/providers/wallet/wallet.ts index bd74fa538..d4dd3462e 100644 --- a/src/providers/wallet/wallet.ts +++ b/src/providers/wallet/wallet.ts @@ -376,8 +376,10 @@ export class WalletProvider { return setTimeout(() => { this.createAddress(wallet); }, 5000); - } else if (err instanceof this.errors.MAIN_ADDRESS_GAP_REACHED || (err.message && err.message == 'MAIN_ADDRESS_GAP_REACHED')) { - this.logger.warn(err); + } else if ( + err instanceof this.errors.MAIN_ADDRESS_GAP_REACHED || (err.message && err.message == 'MAIN_ADDRESS_GAP_REACHED') + ) { + this.logger.warn(this.bwcErrorProvider.msg(err, 'Server Error')); prefix = null; wallet.getMainAddresses({ reverse: true, @@ -386,10 +388,11 @@ export class WalletProvider { if (err) return reject(err); return resolve(addr[0].address); }); - }; - this.bwcErrorProvider.cb(err, prefix).then((msg) => { - return reject(msg); - }); + } else { + this.bwcErrorProvider.cb(err, prefix).then((msg) => { + return reject(msg); + }); + } } else return resolve(addr.address); }); @@ -534,7 +537,6 @@ export class WalletProvider { }); }).catch((err) => { - this.logger.warn(this.bwcErrorProvider.msg(err, 'Server Error')); //TODO if (err instanceof this.errors.CONNECTION_ERROR || (err.message && err.message.match(/5../))) { this.logger.info('Retrying history download in 5 secs...'); return reject(setTimeout(() => {