copay-crown
Version:
A Secure Crown Wallet
179 lines (151 loc) • 6.22 kB
text/typescript
import { Component } from '@angular/core';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { Events, ModalController, Platform } from 'ionic-angular';
import { Subscription } from 'rxjs';
// providers
import { AmazonProvider } from '../providers/amazon/amazon';
import { AppProvider } from '../providers/app/app';
import { BitPayCardProvider } from '../providers/bitpay-card/bitpay-card';
import { CoinbaseProvider } from '../providers/coinbase/coinbase';
import { ConfigProvider } from '../providers/config/config';
import { EmailNotificationsProvider } from '../providers/email-notifications/email-notifications';
import { GlideraProvider } from '../providers/glidera/glidera';
import { Logger } from '../providers/logger/logger';
import { MercadoLibreProvider } from '../providers/mercado-libre/mercado-libre';
import { ProfileProvider } from '../providers/profile/profile';
import { ShapeshiftProvider } from '../providers/shapeshift/shapeshift';
import { TouchIdProvider } from '../providers/touchid/touchid';
// pages
import { FingerprintModalPage } from '../pages/fingerprint/fingerprint';
import { DisclaimerPage } from '../pages/onboarding/disclaimer/disclaimer';
import { OnboardingPage } from '../pages/onboarding/onboarding';
import { PinModalPage } from '../pages/pin/pin';
import { TabsPage } from '../pages/tabs/tabs';
// As the handleOpenURL handler kicks in before the App is started,
// declare the handler function at the top of app.component.ts (outside the class definition)
// to track the passed Url
(window as any).handleOpenURL = (url: string) => {
(window as any).handleOpenURL_LastURL = url;
};
export class CopayApp {
public rootPage: any;
private onResumeSubscription: Subscription;
private isModalOpen: boolean;
constructor(
private platform: Platform,
private statusBar: StatusBar,
private splashScreen: SplashScreen,
private events: Events,
private logger: Logger,
private appProvider: AppProvider,
private profile: ProfileProvider,
private configProvider: ConfigProvider,
private modalCtrl: ModalController,
private glideraProvider: GlideraProvider,
private coinbaseProvider: CoinbaseProvider,
private amazonProvider: AmazonProvider,
private bitPayCardProvider: BitPayCardProvider,
private mercadoLibreProvider: MercadoLibreProvider,
private shapeshiftProvider: ShapeshiftProvider,
private emailNotificationsProvider: EmailNotificationsProvider
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then((readySource) => {
this.appProvider.load().then(() => {
this.logger.info(
'Platform ready (' + readySource + '): ' +
this.appProvider.info.nameCase +
' - v' + this.appProvider.info.version +
' #' + this.appProvider.info.commitHash);
if (this.platform.is('cordova')) {
this.statusBar.show();
// Only overlay for iOS
if (this.platform.is('ios')) this.statusBar.overlaysWebView(true);
this.statusBar.styleLightContent();
this.splashScreen.hide();
// Subscribe Resume
this.onResumeSubscription = this.platform.resume.subscribe(() => {
// Update Wallet Status
this.events.publish('status:updated');
// Check PIN or Fingerprint
this.openLockModal();
});
}
this.openLockModal();
// Check Profile
this.profile.loadAndBindProfile().then((profile: any) => {
this.registerIntegrations();
this.emailNotificationsProvider.init(); // Update email subscription if necessary
if (profile) {
this.logger.info('Profile exists.');
this.rootPage = TabsPage;
}
else {
this.logger.info('No profile exists.');
this.profile.createProfile();
this.rootPage = OnboardingPage;
}
}).catch((err: Error) => {
this.logger.warn(err);
this.rootPage = err.message == 'ONBOARDINGNONCOMPLETED: Onboarding non completed' ? OnboardingPage : DisclaimerPage;
});
}).catch((err) => {
this.logger.error('Could not initialize the app');
});
});
}
ngOnDestroy() {
this.onResumeSubscription.unsubscribe();
}
private openLockModal(): void {
if (this.isModalOpen) return;
let config: any = this.configProvider.get();
let lockMethod = config.lock.method;
if (!lockMethod) return;
if (lockMethod == 'PIN') this.openPINModal('checkPin');
if (lockMethod == 'Fingerprint') this.openFingerprintModal();
}
private openPINModal(action): void {
this.isModalOpen = true;
let modal = this.modalCtrl.create(PinModalPage, { action }, { showBackdrop: false, enableBackdropDismiss: false });
modal.present();
modal.onDidDismiss(() => {
this.isModalOpen = false;
});
}
private openFingerprintModal(): void {
this.isModalOpen = true;
let modal = this.modalCtrl.create(FingerprintModalPage, {}, { showBackdrop: false, enableBackdropDismiss: false });
modal.present();
modal.onDidDismiss(() => {
this.isModalOpen = false;
});
}
private registerIntegrations(): void {
// Mercado Libre
if (this.appProvider.info._enabledExtensions.mercadolibre) this.mercadoLibreProvider.register();
// Amazon Gift Cards
if (this.appProvider.info._enabledExtensions.amazon) this.amazonProvider.register();
// ShapeShift
if (this.appProvider.info._enabledExtensions.shapeshift) this.shapeshiftProvider.register();
// Glidera
if (this.appProvider.info._enabledExtensions.glidera) {
this.glideraProvider.setCredentials();
this.glideraProvider.register();
}
// Coinbase
if (this.appProvider.info._enabledExtensions.coinbase) {
this.coinbaseProvider.setCredentials();
this.coinbaseProvider.register();
}
// BitPay Card
if (this.appProvider.info._enabledExtensions.debitcard) this.bitPayCardProvider.register();
}
}