import wallet

This commit is contained in:
JDonadio 2017-10-10 17:51:17 -03:00
parent c89460daa6
commit b49c672103
No known key found for this signature in database
GPG Key ID: EC1F4E04B2BFA730
5 changed files with 225 additions and 1 deletions

View File

@ -26,6 +26,7 @@ import { CopayApp } from './app.component';
/* Pages */
import { AddPage } from '../pages/add/add';
import { CreateWalletPage } from '../pages/add/create-wallet/create-wallet';
import { ImportWalletPage } from '../pages/add/import-wallet/import-wallet';
import { BackupRequestPage } from '../pages/onboarding/backup-request/backup-request';
import { DisclaimerPage } from '../pages/onboarding/disclaimer/disclaimer';
import { EmailPage } from '../pages/onboarding/email/email';
@ -77,6 +78,7 @@ export function createTranslateLoader(http: Http) {
let pages: any = [
AddPage,
CreateWalletPage,
ImportWalletPage,
AboutPage,
AdvancedPage,
AltCurrencyPage,

View File

@ -1,6 +1,7 @@
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { CreateWalletPage } from "./create-wallet/create-wallet";
import { ImportWalletPage } from "./import-wallet/import-wallet";
@Component({
selector: 'page-add',
@ -22,6 +23,6 @@ export class AddPage {
}
goToImportWallet() {
// this.navCtrl.push();
this.navCtrl.push(ImportWalletPage);
}
}

View File

@ -0,0 +1,88 @@
<ion-header>
<ion-navbar>
<ion-title>Import wallet</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<div class="tabs">
<div class="tab" [ngClass]="{'selected': selectedTab == 'words'}" (click)="selectTab('words')"><span>Recovery phrase</span></div>
<div class="tab" [ngClass]="{'selected': selectedTab == 'file'}" (click)="selectTab('file')"><span>File/Text</span></div>
<div class="tab" [ngClass]="{'selected': selectedTab == 'hw'}" (click)="selectTab('hw')" *ngIf="appName == 'copay'"><span>Hardware wallet</span></div>
</div>
<form [formGroup]="importForm" (ngSubmit)="import()">
<ion-item *ngIf="selectedTab == 'words'">
<ion-label stacked>Type the recovery phrase (usually 12 words)</ion-label>
<ion-textarea [(ngModel)]="formData.words" formControlName="words"></ion-textarea>
</ion-item>
<div *ngIf="selectedTab == 'file'">
<ion-item>
<ion-label stacked>Choose a backup file from your computer</ion-label>
<ion-input type="file" [(ngModel)]="formData.file" formControlName="file"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>Password</ion-label>
<ion-input type="password" [(ngModel)]="formData.filePassword" formControlName="filePassword"></ion-input>
</ion-item>
</div>
<div *ngIf="selectedTab == 'hw'">
<ion-item>
<ion-label stacked>Wallet type</ion-label>
<ion-select [(ngModel)]="formData.selectedSeed.id" formControlName="selectedSeed" (ionChange)="seedOptionsChange(formData.selectedSeed.id)">
<ion-option *ngFor="let opt of seedOptions" [value]="opt.id">{{opt.label}}</ion-option>
</ion-select>
</ion-item>
<ion-item>
<ion-label stacked>Account number</ion-label>
<ion-input type="number" [(ngModel)]="formData.account" formControlName="account"></ion-input>
</ion-item>
<ion-item *ngIf="formData.selectedSeed.id == 'trezor'">
<ion-label stacked>Shared wallet</ion-label>
<ion-toggle [(ngModel)]="formData.isShared" formControlName="isShared"></ion-toggle>
</ion-item>
</div>
<ion-item-divider color="light"></ion-item-divider>
<ion-item (click)="showAdvOpts = !showAdvOpts">
<ion-label *ngIf="!showAdvOpts">Show advanced options</ion-label>
<ion-label *ngIf="showAdvOpts">Hide advanced options</ion-label>
</ion-item>
<div *ngIf="showAdvOpts">
<div *ngIf="selectedTab == 'words'">
<ion-item>
<ion-label stacked>Password</ion-label>
<ion-input type="password" [(ngModel)]="formData.mnemonicPassword" formControlName="mnemonicPassword"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>Derivation path</ion-label>
<ion-input type="text" [(ngModel)]="formData.derivationPath" formControlName="derivationPath"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>From hardware wallet</ion-label>
<ion-toggle [(ngModel)]="formData.fromHW" formControlName="fromHW"></ion-toggle>
</ion-item>
<ion-item>
<ion-label stacked>Testnet</ion-label>
<ion-toggle [(ngModel)]="formData.testnet" formControlName="testnet" (ionChange)="setDerivationPath()"></ion-toggle>
</ion-item>
</div>
<ion-item>
<ion-label stacked>Wallet service URL</ion-label>
<ion-input type="text" [(ngModel)]="formData.bwsURL" formControlName="bwsURL"></ion-input>
</ion-item>
</div>
<button ion-button block type="submit" [disabled]="!importForm.valid">Import wallet</button>
</form>
</ion-content>

View File

@ -0,0 +1,14 @@
.tabs {
display: flex;
text-align: center;
padding-top: 13px;
padding-bottom: 13px;
}
.tab {
width: 100%;
}
.selected {
border-bottom: 2px solid;
}

View File

@ -0,0 +1,119 @@
import { Component, OnInit } from '@angular/core';
import { NavController } from 'ionic-angular';
import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { AppProvider } from '../../../providers/app/app';
import * as _ from 'lodash';
@Component({
selector: 'page-import-wallet',
templateUrl: 'import-wallet.html'
})
export class ImportWalletPage implements OnInit{
public formData: any;
public showAdvOpts: boolean;
public selectedTab: string;
public seedOptions: any;
private appName: string;
private derivationPathByDefault: string;
private derivationPathForTestnet: string;
private importForm: FormGroup;
constructor(
public navCtrl: NavController,
private app: AppProvider,
private fb: FormBuilder
) {
this.selectedTab = 'words';
this.derivationPathByDefault = "m/44'/0'/0'";
this.derivationPathForTestnet = "m/44'/1'/0'";
this.showAdvOpts = false;
this.formData = {
words: null,
text: null,
filePassword: null,
selectedSeed: null,
isShared: null,
account: 1,
mnemonicPassword: null,
derivationPath: this.derivationPathByDefault,
fromHW: false,
testnet: false,
bwsURL: 'https://bws.bitpay.com/bws/api',
};
this.appName = this.app.info.name;
this.updateSeedSourceSelect();
}
ngOnInit() {
this.importForm = this.fb.group({
words: ['', Validators.required],
file: [''],
filePassword: [''],
selectedSeed: [''],
isShared: [''],
account: [''],
mnemonicPassword: [''],
derivationPath: [''],
fromHW: [''],
testnet: [''],
bwsURL: [''],
});
}
updateSeedSourceSelect() {
if (this.appName === 'bitpay') return;
this.seedOptions = [{
id: 'trezor',
label: 'Trezor hardware wallet',
supportsTestnet: false
}, {
id: 'ledger',
label: 'Ledger hardware wallet',
supportsTestnet: false
}];
this.formData.selectedSeed = {
id: this.seedOptions[0].id
};
}
selectTab(tab: string) {
this.selectedTab = tab;
switch (tab) {
case 'words':
this.importForm.get('words').setValidators([Validators.required]);
this.importForm.get('file').clearValidators();
this.importForm.get('filePassword').clearValidators();
break;
case 'file':
this.importForm.get('file').setValidators([Validators.required]);
this.importForm.get('filePassword').setValidators([Validators.required]);
this.importForm.get('words').clearValidators();
break;
default:
this.importForm.get('words').clearValidators();
this.importForm.get('file').clearValidators();
this.importForm.get('filePassword').clearValidators();
break;
}
this.importForm.get('words').updateValueAndValidity();
this.importForm.get('file').updateValueAndValidity();
this.importForm.get('filePassword').updateValueAndValidity();
}
seedOptionsChange(id: string) {
if (id === 'trezor') this.formData.isShared = null;
}
setDerivationPath() {
this.formData.derivationPath = this.formData.testnet ? this.derivationPathForTestnet : this.derivationPathByDefault;
}
import() {
console.log(this.formData);
}
}