diff --git a/package.json b/package.json index b9b80d7aa..a3177646d 100644 --- a/package.json +++ b/package.json @@ -119,6 +119,7 @@ "rxjs": "^5.5.2", "simple-plist": "^0.2.1", "sw-toolbox": "^3.6.0", + "ts-md5": "^1.2.2", "zone.js": "^0.8.18" }, "devDependencies": { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7079bf6d3..87ced2fd3 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -83,6 +83,7 @@ import { ShapeshiftShiftPage } from '../pages/integrations/shapeshift/shapeshift /*Includes */ import { FeedbackCardPage } from '../pages/includes/feedback-card/feedback-card'; +import { GravatarPage } from '../pages/includes/gravatar/gravatar'; import { TxpPage } from '../pages/includes/txp/txp'; import { WalletInfoPage } from '../pages/includes/wallet-info/wallet-info'; import { WalletItemPage } from '../pages/includes/wallet-item/wallet-item'; @@ -246,6 +247,7 @@ let pages: any = [ CollectEmailPage, FeeWarningPage, GlideraPage, + GravatarPage, FingerprintModalPage, HomePage, LanguagePage, diff --git a/src/pages/includes/gravatar/gravatar.html b/src/pages/includes/gravatar/gravatar.html new file mode 100644 index 000000000..77837d447 --- /dev/null +++ b/src/pages/includes/gravatar/gravatar.html @@ -0,0 +1 @@ +{{ name }} \ No newline at end of file diff --git a/src/pages/includes/gravatar/gravatar.scss b/src/pages/includes/gravatar/gravatar.scss new file mode 100644 index 000000000..7ff84eb43 --- /dev/null +++ b/src/pages/includes/gravatar/gravatar.scss @@ -0,0 +1,3 @@ +page-gravatar { + +} diff --git a/src/pages/includes/gravatar/gravatar.ts b/src/pages/includes/gravatar/gravatar.ts new file mode 100644 index 000000000..f281db976 --- /dev/null +++ b/src/pages/includes/gravatar/gravatar.ts @@ -0,0 +1,31 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { NavController, NavParams } from 'ionic-angular'; +import { Md5 } from 'ts-md5/dist/md5'; +import { Logger } from '@nsalaun/ng-logger'; + +@Component({ + selector: 'gravatar', + templateUrl: 'gravatar.html', +}) +export class GravatarPage { + + private emailHash: any; + + @Input() email: string; + @Input() name: string; + @Input() height: number; + @Input() width: number; + + constructor( + private logger: Logger + ) { + } + + ngOnInit() { + this.logger.info('ionViewDidLoad GravatarPage'); + if (typeof this.email === "string") { + this.emailHash = Md5.hashStr(this.email.toLowerCase() || ''); + } + } + +} diff --git a/src/pages/send/amount/amount.html b/src/pages/send/amount/amount.html index 3916405f0..d819e3331 100644 --- a/src/pages/send/amount/amount.html +++ b/src/pages/send/amount/amount.html @@ -27,8 +27,7 @@ - - + diff --git a/src/pages/send/confirm/confirm.html b/src/pages/send/confirm/confirm.html index 8828b57ce..b64b9cd66 100644 --- a/src/pages/send/confirm/confirm.html +++ b/src/pages/send/confirm/confirm.html @@ -75,10 +75,7 @@
- - - - + {{tx.name}} {{tx.toAddress}}
diff --git a/src/pages/send/send.html b/src/pages/send/send.html index 71a273f2e..b43f96f9b 100644 --- a/src/pages/send/send.html +++ b/src/pages/send/send.html @@ -15,14 +15,14 @@ - + Transfer to Contact @@ -44,10 +44,14 @@ @@ -65,10 +69,14 @@ diff --git a/src/pages/settings/addressbook/addressbook.html b/src/pages/settings/addressbook/addressbook.html index 728c01362..c40140da0 100644 --- a/src/pages/settings/addressbook/addressbook.html +++ b/src/pages/settings/addressbook/addressbook.html @@ -15,7 +15,7 @@
- +
No contacts yet
Get started by adding your first one.
@@ -29,8 +29,12 @@
-
diff --git a/src/pages/settings/addressbook/addressbook.scss b/src/pages/settings/addressbook/addressbook.scss index c8c8c2068..1d02d907a 100644 --- a/src/pages/settings/addressbook/addressbook.scss +++ b/src/pages/settings/addressbook/addressbook.scss @@ -33,5 +33,14 @@ page-addressbook { max-width: 300px; } } + .contact { + ion-label { + display: flex; + align-items: center; + gravatar { + margin-right: 1.5rem; + } + } + } } diff --git a/src/pages/settings/addressbook/addressbook.ts b/src/pages/settings/addressbook/addressbook.ts index 09bec71d4..f82201d9a 100644 --- a/src/pages/settings/addressbook/addressbook.ts +++ b/src/pages/settings/addressbook/addressbook.ts @@ -34,20 +34,20 @@ export class AddressbookPage { } private initAddressbook(): void { - this.addressbookProvider.list().then((ab) => { - this.isEmptyList = _.isEmpty(ab); + this.addressbookProvider.list().then((addressBook: any) => { + this.isEmptyList = _.isEmpty(addressBook); let contacts: Array = []; - _.each(ab, (v, k) => { + _.each(addressBook, (contact: any, k: string) => { contacts.push({ - name: _.isObject(v) ? v.name : v, + name: _.isObject(contact) ? contact.name : contact, address: k, - email: _.isObject(v) ? v.email : null + email: _.isObject(contact) ? contact.email : null }); }); this.addressbook = _.clone(contacts); this.filteredAddressbook = _.clone(this.addressbook); - }).catch((err) => { + }).catch((err: any) => { this.logger.error(err); let alertError = this.alertCtrl.create({ title: err, @@ -68,14 +68,14 @@ export class AddressbookPage { this.navCtrl.push(AddressbookAddPage); }; - public viewEntry(ab: any): void { - this.navCtrl.push(AddressbookViewPage, { address: ab.address }); + public viewEntry(contact: any): void { + this.navCtrl.push(AddressbookViewPage, { contact: contact }); } - public getItems(ev: any): void { + public getItems(event: any): void { // set val to the value of the searchbar - let val = ev.target.value; + let val = event.target.value; // if the value is an empty string don't filter the items if (val && val.trim() != '') { diff --git a/src/pages/settings/addressbook/view/view.html b/src/pages/settings/addressbook/view/view.html index 9208339dc..464f21b5e 100644 --- a/src/pages/settings/addressbook/view/view.html +++ b/src/pages/settings/addressbook/view/view.html @@ -1,23 +1,36 @@ - - - {{ contact.name }} + + {{ name }} - - - - - - - {{ contact.name }} - - - {{ contact.address }} - - - - - - + +
+ +
+ + + {{'Name' | translate}} + + {{ name }} + + + + {{'Email' | translate}} + + {{ email }} + + + + {{'Address' | translate}} + + {{ address }} + + + + + + + + +
\ No newline at end of file diff --git a/src/pages/settings/addressbook/view/view.scss b/src/pages/settings/addressbook/view/view.scss index 27003aac0..3cb9ef18b 100644 --- a/src/pages/settings/addressbook/view/view.scss +++ b/src/pages/settings/addressbook/view/view.scss @@ -1,3 +1,36 @@ page-addressbook-view { - + .toolbar { + background-color: #192c3a; + &-content { + margin-right: 70px; + } + &-title { + text-align: center; + } + .back-button, &-title { + color: white; + } + .back-button:hover { + color: white; + } + } + .contact-view-header { + position: relative; + height: 70px; + border-color: #192c3a; + background-color: #192c3a; + padding-top: 20px; + margin-bottom: 50px; + text-align: center; + .gravatar { + border-radius: 3px; + display: inline-block; + } + } + .btn-send { + color: color($colors, primary); + } + .btn-remove { + color: color($global-colors, assertive); + } } diff --git a/src/pages/settings/addressbook/view/view.ts b/src/pages/settings/addressbook/view/view.ts index cb9d40dad..d9467971d 100644 --- a/src/pages/settings/addressbook/view/view.ts +++ b/src/pages/settings/addressbook/view/view.ts @@ -1,6 +1,15 @@ import { Component } from '@angular/core'; import { NavController, NavParams, AlertController } from 'ionic-angular'; +import { importType } from '@angular/compiler/src/output/output_ast'; + +// Pages +import { AmountPage } from '../../../../pages/send/amount/amount'; + +// Providers import { AddressBookProvider } from '../../../../providers/address-book/address-book'; +import { AddressProvider } from '../../../../providers/address/address'; +import { BwcProvider } from '../../../../providers/bwc/bwc'; +import { PopupProvider } from '../../../../providers/popup/popup'; @Component({ selector: 'page-addressbook-view', @@ -8,55 +17,62 @@ import { AddressBookProvider } from '../../../../providers/address-book/address- }) export class AddressbookViewPage { - private address: string; + public contact: any; + public address: string; + public name: string; + public email: string; + + private bitcoreCash: any; + private coin: string; - public contact: Object = { - name: '', - address: '', - email: '' - }; constructor( - public navCtrl: NavController, - public navParams: NavParams, - public alertCtrl: AlertController, - public ab: AddressBookProvider + private addressBookProvider: AddressBookProvider, + private addressProvider: AddressProvider, + private alertCtrl: AlertController, + private bwcProvider: BwcProvider, + private navCtrl: NavController, + private navParams: NavParams, + private popupProvider: PopupProvider ) { - this.address = this.navParams.get('address'); + this.bitcoreCash = this.bwcProvider.getBitcoreCash(); + this.address = this.navParams.data.contact.address; + this.name = this.navParams.data.contact.name; + this.email = this.navParams.data.contact.email; + + var cashAddress = this.bitcoreCash.Address.isValid(this.address, 'livenet'); + if (cashAddress) { + this.coin = 'bch'; + } else { + this.coin = 'btc'; + } } ionViewDidLoad() { - this.ab.get(this.address).then((entry) => { - this.contact = entry; - }).catch((err) => { - let alertError = this.alertCtrl.create({ - title: err, - buttons: [ - { - text: 'Go back', - handler: () => { - this.navCtrl.pop(); - } - } - ] - }); - alertError.present(); + } + + public sendTo(): void { + this.navCtrl.push(AmountPage, { + toAddress: this.address, + name: this.name, + email: this.email, + coin: this.coin, + recipientType: 'contact', + network: this.addressProvider.validateAddress(this.address).network, }); } - public remove(): void { - this.ab.remove(this.address).then(() => { - this.navCtrl.pop(); - }).catch((err) => { - let alertError = this.alertCtrl.create({ - title: err, - buttons: [ - { - text: 'OK' - } - ] + public remove(addr: string): void { + var title = 'Warning!'; // Todo: gettextCatalog + var message = 'Are you sure you want to delete this contact?'; // Todo: gettextCatalog + this.popupProvider.ionicConfirm(title, message, null, null).then((res: any) => { + if (!res) return; + this.addressBookProvider.remove(addr).then((ab) => { + this.navCtrl.pop(); + }).catch((err: any) => { + this.popupProvider.ionicAlert('Error', err); // Todo: gettextCatalog + return; }); - alertError.present(); }); } diff --git a/src/providers/address/address.ts b/src/providers/address/address.ts index 62bcbf065..0bf84ed00 100644 --- a/src/providers/address/address.ts +++ b/src/providers/address/address.ts @@ -1,4 +1,6 @@ import { Injectable } from '@angular/core'; + +// Providers import { BwcProvider } from '../../providers/bwc/bwc'; @Injectable() diff --git a/src/theme/global.scss b/src/theme/global.scss index 2709ebece..d7e1cba42 100644 --- a/src/theme/global.scss +++ b/src/theme/global.scss @@ -122,6 +122,12 @@ $global-colors: ( .text-bold { font-weight: 700; } + +.gravatar { + min-width: 3rem; + min-height: 3rem; +} + /* * Wallet selector */