merged in master

This commit is contained in:
Darren Nelsen 2018-02-20 14:43:55 -05:00
commit de4f70c709
294 changed files with 7459 additions and 8209 deletions

View File

@ -12,7 +12,7 @@
"main": "app/main.ts", "main": "app/main.ts",
"polyfills": "polyfills.ts", "polyfills": "polyfills.ts",
"test": "test.ts", "test": "test.ts",
"tsconfig": "../tsconfig.json", "tsconfig": "./tsconfig.json",
"testTsconfig": "tsconfig.spec.json", "testTsconfig": "tsconfig.spec.json",
"prefix": "app", "prefix": "app",
"scripts": [], "scripts": [],
@ -25,7 +25,7 @@
], ],
"e2e": { "e2e": {
"protractor": { "protractor": {
"config": "./protractor.conf.js" "config": "test/protractor.conf.js"
} }
}, },
"lint": [ "lint": [
@ -34,13 +34,13 @@
"exclude": "**/node_modules/**" "exclude": "**/node_modules/**"
}, },
{ {
"project": "e2e/tsconfig.e2e.json", "project": "test/e2e/tsconfig.e2e.json",
"exclude": "**/node_modules/**" "exclude": "**/node_modules/**"
} }
], ],
"test": { "test": {
"karma": { "karma": {
"config": "./karma.conf.js" "config": "test/karma.conf.js"
}, },
"codeCoverage": { "codeCoverage": {
"exclude": [ "exclude": [

62
.circleci/config.yml Normal file
View File

@ -0,0 +1,62 @@
# Javascript Node CircleCI 2.0 configuration file
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
version: 2
jobs:
copay:
docker:
- image: circleci/node:9-browsers
working_directory: ~/copay
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "package.json" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: npm install
- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}
- run: npm run apply:copay
- run: npm run test:ci
- run: npm run e2e
- run: npm run test:visual
- run: npx codecov
- store_artifacts:
path: ./test
- store_test_results:
path: ./test
bitpay:
docker:
- image: circleci/node:9-browsers
working_directory: ~/copay
steps:
- checkout
- restore_cache:
keys:
- v1-dependencies-{{ checksum "package.json" }}
- v1-dependencies-
- run: npm install
- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}
- run: npm run apply:bitpay
- run: npm run test:ci
- run: npm run e2e
- run: npm run test:visual
- run: npx codecov
- store_artifacts:
path: ./test
- store_test_results:
path: ./test
workflows:
version: 2
build_and_test:
jobs:
- copay
- bitpay

View File

@ -1 +0,0 @@
repo_token: LccCN5zLEHlHnI86wSoX97JAF4ZluucAh

View File

@ -1,30 +0,0 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# http://editorconfig.org
## Plugins
# Atom (https://github.com/sindresorhus/atom-editorconfig)
# Vim (https://github.com/editorconfig/editorconfig-vim)
# Sublime (https://github.com/sindresorhus/editorconfig-sublime)
;
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
[**.html]
max_char = 78
brace_style = expand

7
.gitignore vendored
View File

@ -31,6 +31,12 @@ src/assets/i18n/crowdin_api_key.txt
src/index.html src/index.html
src/manifest.json src/manifest.json
test/visual/latest
test/visual/diffs
test/visual/report.html
test/visual/report.json
junitresults.xml
.sourcemaps/ .sourcemaps/
.idea/ .idea/
.sass-cache/ .sass-cache/
@ -42,7 +48,6 @@ node_modules/
tmp/ tmp/
temp/ temp/
hooks/ hooks/
junitresults.xml
platforms/ platforms/
plugins/ plugins/
plugins/android.json plugins/android.json

View File

@ -1 +1,7 @@
package.json package.json
package-lock.json
.sourcemaps/
coverage/
platforms/
plugins/
www/

View File

@ -1,22 +0,0 @@
sudo: false
dist: trusty
language: node_js
node_js:
- node
addons:
chrome: stable
env:
- DISTRIBUTION=copay
- DISTRIBUTION=bitpay
install:
- npm install -g @angular/cli
script:
- npm run apply:$DISTRIBUTION
- npm run test-ci
- npm run e2e

View File

@ -1,6 +1,7 @@
<img src="https://raw.githubusercontent.com/bitpay/copay/master/resources/copay/android/icon/drawable-xxxhdpi-icon.png" alt="Copay" width="79"> <img src="https://raw.githubusercontent.com/bitpay/copay/master/resources/copay/android/icon/drawable-xxxhdpi-icon.png" alt="Copay" width="79">
[![Build Status](https://secure.travis-ci.org/bitpay/copay.svg)](http://travis-ci.org/bitpay/copay) [![CircleCI](https://img.shields.io/circleci/project/github/bitpay/copay.svg)](https://circleci.com/gh/bitpay/copay/)
[![Codecov](https://img.shields.io/codecov/c/github/bitpay/copay.svg)](https://codecov.io/gh/bitpay/copay/)
[![Crowdin](https://d322cqt584bo4o.cloudfront.net/copay/localized.png)](https://crowdin.com/project/copay) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/copay/localized.png)](https://crowdin.com/project/copay)
Copay is a secure bitcoin wallet platform for both desktop and mobile devices. Copay uses [Bitcore Wallet Service](https://github.com/bitpay/bitcore-wallet-service) (BWS) for peer synchronization and network interfacing. Copay is a secure bitcoin wallet platform for both desktop and mobile devices. Copay uses [Bitcore Wallet Service](https://github.com/bitpay/bitcore-wallet-service) (BWS) for peer synchronization and network interfacing.

View File

@ -23,8 +23,8 @@
"windowsAppId": "2d1002d7-ee34-4f60-bd29-0c871ba0c195", "windowsAppId": "2d1002d7-ee34-4f60-bd29-0c871ba0c195",
"pushSenderId": "1036948132229", "pushSenderId": "1036948132229",
"description": "Secure Bitcoin Wallet", "description": "Secure Bitcoin Wallet",
"version": "4.0.5", "version": "4.0.6",
"androidVersion": "40000005", "androidVersion": "40000006",
"_extraCSS": null, "_extraCSS": null,
"_enabledExtensions": { "_enabledExtensions": {
"coinbase": true, "coinbase": true,

View File

@ -41,7 +41,7 @@
<engine name="ios" spec="4.5.4" /> <engine name="ios" spec="4.5.4" />
<!-- Plugins --> <!-- Plugins -->
<plugin name="cordova-clipboard" spec="^1.1.0" /> <plugin name="cordova-clipboard" spec="^1.1.1" />
<plugin name="cordova-plugin-android-fingerprint-auth" spec="^1.4.2" /> <plugin name="cordova-plugin-android-fingerprint-auth" spec="^1.4.2" />
<plugin name="cordova-plugin-device" spec="^2.0.1" /> <plugin name="cordova-plugin-device" spec="^2.0.1" />
<plugin name="cordova-plugin-globalization" spec="^1.0.9" /> <plugin name="cordova-plugin-globalization" spec="^1.0.9" />

View File

@ -23,8 +23,8 @@
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c", "windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
"pushSenderId": "1036948132229", "pushSenderId": "1036948132229",
"description": "A Secure Bitcoin Wallet", "description": "A Secure Bitcoin Wallet",
"version": "4.0.5", "version": "4.0.6",
"androidVersion": "40000005", "androidVersion": "40000006",
"_extraCSS": null, "_extraCSS": null,
"_enabledExtensions": { "_enabledExtensions": {
"coinbase": true, "coinbase": true,

View File

@ -1,16 +0,0 @@
import { browser } from 'protractor';
import { existsSync, mkdirSync, writeFile } from 'fs';
export async function takeScreenshot(name: string) {
const dir = 'screenshots';
if (!existsSync(dir)) {
mkdirSync(dir);
}
const config = await browser.getProcessedConfig();
const deviceName = config['capabilities']['name'];
const pngData = await browser.takeScreenshot();
const path = `${dir}/${deviceName}_${name}`;
writeFile(path, pngData, { encoding: 'base64' }, () => {
console.log(`File written: ${path}`);
});
}

7198
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
"name": "copay", "name": "copay",
"description": "A Secure Bitcoin Wallet", "description": "A Secure Bitcoin Wallet",
"author": "BitPay", "author": "BitPay",
"version": "4.0.5", "version": "4.0.6",
"main": "electron/main.js", "main": "electron/main.js",
"keywords": [ "keywords": [
"bitcoin", "bitcoin",
@ -22,9 +22,9 @@
"url": "https://github.com/bitpay/copay/issues" "url": "https://github.com/bitpay/copay/issues"
}, },
"scripts": { "scripts": {
"postinstall": "sed -i -e \"s/.*require(...\\/...);//g\" node_modules/asn1.js-rfc5280/index.js && npm run e2e-update", "postinstall": "sed -i -e \"s/.*require(...\\/...);//g\" node_modules/asn1.js-rfc5280/index.js && npm run e2e:update",
"start": "ionic serve --no-open", "start": "ionic serve --no-open",
"clean": "trash platforms && trash plugins && trash config.xml", "clean": "rm -rf platforms && rm -rf plugins && rm -f config.xml",
"prepare:copay": "npm run clean && npm run apply:copay && cordova prepare && npm run fix:fcm", "prepare:copay": "npm run clean && npm run apply:copay && cordova prepare && npm run fix:fcm",
"prepare:bitpay": "npm run clean && npm run apply:bitpay && cordova prepare && npm run fix:fcm", "prepare:bitpay": "npm run clean && npm run apply:bitpay && cordova prepare && npm run fix:fcm",
"clean-all": "git clean -dfx", "clean-all": "git clean -dfx",
@ -32,12 +32,18 @@
"lint": "ionic-app-scripts lint", "lint": "ionic-app-scripts lint",
"ionic:build": "ionic-app-scripts build", "ionic:build": "ionic-app-scripts build",
"ionic:serve": "ionic-app-scripts serve", "ionic:serve": "ionic-app-scripts serve",
"test": "ng test --browsers=Chrome", "watch": "ng test --browsers=Chrome",
"test-coverage": "ng test --code-coverage", "test": "test:lint && npm run test:ci && npm run e2e:capture-latest && npm run test:visual",
"test-ci": "ng test --watch=false --code-coverage --no-progress", "test:coverage": "ng test --code-coverage",
"e2e": "npm run ionic:build && npm run e2e-test", "test:ci": "ng test --watch=false --code-coverage --no-progress",
"e2e-test": "protractor", "test:lint": "tslint --project . --format codeFrame && tslint '{test,electron,src}/**/*.ts' --format codeFrame && prettier --list-different '{*,**/*}.{js,ts,md,json,scss}'",
"e2e-update": "webdriver-manager update --gecko false", "test:visual": "cd test/visual && reg-cli latest approved diffs --report report.html --json report.json --enableAntialias --thresholdRate 0.005",
"fix:tslint": "tslint --fix --project . && tslint --fix '{test,electron,src}/**/*.ts'",
"fix:prettier": "prettier --write '{*,**/*}.{js,ts,md,json,scss}'",
"e2e": "npm run ionic:build && npm run e2e:test",
"e2e:test": "protractor",
"e2e:capture-latest": "npm run apply:copay && npm run e2e && npm run apply:bitpay && npm run e2e",
"e2e:update": "webdriver-manager update --gecko false",
"extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot", "extract": "ngx-translate-extract --input ./src --output ./src/assets/i18n/app.pot --clean --sort --format pot",
"start:ios": "npm run build:ios && npm run open:ios", "start:ios": "npm run build:ios && npm run open:ios",
"start:android": "npm run run:android", "start:android": "npm run run:android",
@ -86,20 +92,19 @@
"ajv": "^5.5.2", "ajv": "^5.5.2",
"angular2-moment": "^1.7.1", "angular2-moment": "^1.7.1",
"autoprefixer": "^7.2.4", "autoprefixer": "^7.2.4",
"bitauth": "github:bitpay/bitauth#copay", "bitauth": "git+https://github.com/bitpay/bitauth.git#copay",
"bitcore-wallet-client": "^6.5.0", "bitcore-wallet-client": "^6.5.0",
"buffer-compare": "^1.1.1", "buffer-compare": "^1.1.1",
"cordova": "^8.0.0",
"cordova-android": "7.0.0", "cordova-android": "7.0.0",
"cordova-clipboard": "^1.1.1", "cordova-clipboard": "^1.1.1",
"cordova-custom-config": "^5.0.2", "cordova-custom-config": "^5.0.2",
"cordova-ios": "4.5.4", "cordova-ios": "4.5.4",
"cordova-plugin-android-fingerprint-auth": "^1.4.2", "cordova-plugin-android-fingerprint-auth": "^1.4.2",
"cordova-plugin-compat": "^1.2.0", "cordova-plugin-compat": "^1.2.0",
"cordova-plugin-customurlscheme": "github:cmgustavo/Custom-URL-scheme#v4.0", "cordova-plugin-customurlscheme": "https://github.com/cmgustavo/Custom-URL-scheme.git#v4.0",
"cordova-plugin-device": "^2.0.1", "cordova-plugin-device": "^2.0.1",
"cordova-plugin-dialogs": "^2.0.1", "cordova-plugin-dialogs": "^2.0.1",
"cordova-plugin-fcm": "github:cmgustavo/cordova-plugin-fcm#v4.0", "cordova-plugin-fcm": "https://github.com/cmgustavo/cordova-plugin-fcm.git#v4.0",
"cordova-plugin-file": "^6.0.1", "cordova-plugin-file": "^6.0.1",
"cordova-plugin-globalization": "^1.0.9", "cordova-plugin-globalization": "^1.0.9",
"cordova-plugin-inappbrowser": "^2.0.2", "cordova-plugin-inappbrowser": "^2.0.2",
@ -154,23 +159,27 @@
"karma-coverage-istanbul-reporter": "^1.4.1", "karma-coverage-istanbul-reporter": "^1.4.1",
"karma-jasmine": "^1.1.1", "karma-jasmine": "^1.1.1",
"karma-jasmine-html-reporter": "^0.2.2", "karma-jasmine-html-reporter": "^0.2.2",
"karma-junit-reporter": "^1.2.0",
"karma-mocha-reporter": "^2.2.5", "karma-mocha-reporter": "^2.2.5",
"karma-phantomjs-launcher": "^1.0.4", "karma-phantomjs-launcher": "^1.0.4",
"karma-remap-istanbul": "^0.6.0", "karma-remap-istanbul": "^0.6.0",
"karma-sourcemap-loader": "^0.3.7", "karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "^2.0.9", "karma-webpack": "^2.0.9",
"mkdirp": "^0.5.1",
"null-loader": "^0.1.1", "null-loader": "^0.1.1",
"path": "^0.12.7", "path": "^0.12.7",
"plist": "^2.1.0", "plist": "^2.1.0",
"prettier": "^1.10.2",
"protractor": "^5.3.0", "protractor": "^5.3.0",
"reg-cli": "^0.11.0",
"serve-static": "^1.13.2", "serve-static": "^1.13.2",
"shelljs": "^0.3.0", "shelljs": "^0.3.0",
"trash-cli": "^1.4.0", "trash-cli": "^1.4.0",
"ts-loader": "^3.2.0", "ts-loader": "^3.2.0",
"ts-node": "^4.1.0", "ts-node": "^4.1.0",
"tslint": "^5.8.0", "tslint": "^5.8.0",
"tslint-eslint-rules": "^4.1.1", "tslint-config-prettier": "^1.7.0",
"typescript": "^2.4.2" "typescript": "^2.6.2"
}, },
"cordova": { "cordova": {
"plugins": { "plugins": {
@ -210,5 +219,8 @@
"android", "android",
"ios" "ios"
] ]
},
"prettier": {
"singleQuote": true
} }
} }

View File

@ -2,13 +2,15 @@ const flags = [
'--headless', '--headless',
// Sandbox causes Chrome to crash on Travis // Sandbox causes Chrome to crash on Travis
// https://github.com/travis-ci/travis-ci/issues/8836#issuecomment-359018652 // https://github.com/travis-ci/travis-ci/issues/8836#issuecomment-359018652
'--no-sandbox' '--no-sandbox',
'--disable-gpu'
]; ];
exports.config = { exports.config = {
allScriptsTimeout: 11000, allScriptsTimeout: 11000,
jasmineNodeOpts: {defaultTimeoutInterval: 1000 * 30} jasmineNodeOpts: { defaultTimeoutInterval: 1000 * 60 * 10 },
specs: ['./e2e/**/*.e2e-spec.ts'], maxSessions: 4,
specs: ['test/e2e/**/*.e2e-spec.ts'],
// Available deviceNames for mobileEmulation: https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/Source/devtools/front_end/emulated_devices/module.json // Available deviceNames for mobileEmulation: https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/Source/devtools/front_end/emulated_devices/module.json
multiCapabilities: [ multiCapabilities: [
{ {
@ -23,18 +25,6 @@ exports.config = {
] ]
} }
}, },
{
name: '800x600',
browserName: 'chrome',
chromeOptions: {
args: [
'--high-dpi-support=1',
'--force-device-scale-factor=2',
'--window-size=800,600',
...flags
]
}
},
{ {
name: '1920x1080', name: '1920x1080',
browserName: 'chrome', browserName: 'chrome',
@ -87,16 +77,6 @@ exports.config = {
args: [...flags] args: [...flags]
} }
}, },
{
name: 'Nexus6P',
browserName: 'chrome',
chromeOptions: {
mobileEmulation: {
deviceName: 'Nexus 6P'
},
args: [...flags]
}
},
{ {
name: 'Nexus5X', name: 'Nexus5X',
browserName: 'chrome', browserName: 'chrome',
@ -124,7 +104,7 @@ exports.config = {
}, },
onPrepare() { onPrepare() {
require('ts-node').register({ require('ts-node').register({
project: 'e2e/tsconfig.e2e.json' project: 'test/e2e/tsconfig.e2e.json'
}); });
var jasmineReporters = require('jasmine-reporters'); var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter( jasmine.getEnv().addReporter(
@ -136,8 +116,8 @@ exports.config = {
); );
jasmine.getEnv().addReporter( jasmine.getEnv().addReporter(
new jasmineReporters.JUnitXmlReporter({ new jasmineReporters.JUnitXmlReporter({
savePath: process.env.JUNIT_REPORT_PATH, savePath: process.env.JUNIT_REPORT_PATH || './test/',
outputFile: process.env.JUNIT_REPORT_NAME, outputFile: process.env.JUNIT_REPORT_NAME || 'junitresults.xml',
consolidateAll: true consolidateAll: true
}) })
); );

View File

@ -1,28 +1,28 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { Platform, ModalController } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen'; 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'; import { Subscription } from 'rxjs';
//providers // providers
import { Logger } from '../providers/logger/logger';
import { AppProvider } from '../providers/app/app';
import { ProfileProvider } from '../providers/profile/profile';
import { ConfigProvider } from '../providers/config/config';
import { TouchIdProvider } from '../providers/touchid/touchid';
import { GlideraProvider } from '../providers/glidera/glidera';
import { CoinbaseProvider } from '../providers/coinbase/coinbase';
import { AmazonProvider } from '../providers/amazon/amazon'; import { AmazonProvider } from '../providers/amazon/amazon';
import { AppProvider } from '../providers/app/app';
import { BitPayCardProvider } from '../providers/bitpay-card/bitpay-card'; import { BitPayCardProvider } from '../providers/bitpay-card/bitpay-card';
import { CoinbaseProvider } from '../providers/coinbase/coinbase';
import { ConfigProvider } from '../providers/config/config';
import { GlideraProvider } from '../providers/glidera/glidera';
import { Logger } from '../providers/logger/logger';
import { MercadoLibreProvider } from '../providers/mercado-libre/mercado-libre'; import { MercadoLibreProvider } from '../providers/mercado-libre/mercado-libre';
import { ProfileProvider } from '../providers/profile/profile';
import { ShapeshiftProvider } from '../providers/shapeshift/shapeshift'; import { ShapeshiftProvider } from '../providers/shapeshift/shapeshift';
import { TouchIdProvider } from '../providers/touchid/touchid';
//pages // pages
import { TabsPage } from '../pages/tabs/tabs';
import { OnboardingPage } from '../pages/onboarding/onboarding';
import { PinModalPage } from '../pages/pin/pin';
import { FingerprintModalPage } from '../pages/fingerprint/fingerprint'; import { FingerprintModalPage } from '../pages/fingerprint/fingerprint';
import { DisclaimerPage } from '../pages/onboarding/disclaimer/disclaimer'; 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';
@Component({ @Component({
templateUrl: 'app.html', templateUrl: 'app.html',
@ -38,6 +38,7 @@ export class CopayApp {
private platform: Platform, private platform: Platform,
private statusBar: StatusBar, private statusBar: StatusBar,
private splashScreen: SplashScreen, private splashScreen: SplashScreen,
private events: Events,
private logger: Logger, private logger: Logger,
private app: AppProvider, private app: AppProvider,
private profile: ProfileProvider, private profile: ProfileProvider,
@ -70,11 +71,18 @@ export class CopayApp {
this.statusBar.styleLightContent(); this.statusBar.styleLightContent();
this.splashScreen.hide(); this.splashScreen.hide();
}
//Check PIN or Fingerprint // Subscribe Resume
this.onResumeSubscription = this.platform.resume.subscribe(() => { this.onResumeSubscription = this.platform.resume.subscribe(() => {
this.openLockModal();
}); // Update Wallet Status
this.events.publish('status:updated');
// Check PIN or Fingerprint
this.openLockModal();
});
}
this.openLockModal(); this.openLockModal();
// Check Profile // Check Profile
this.profile.loadAndBindProfile().then((profile: any) => { this.profile.loadAndBindProfile().then((profile: any) => {

View File

@ -1,98 +1,102 @@
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { DecimalPipe } from '@angular/common'; import { DecimalPipe } from '@angular/common';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { ErrorHandler, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { File } from '@ionic-native/file'; import { File } from '@ionic-native/file';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
/* Native modules */ /* Native modules */
import { AndroidFingerprintAuth } from '@ionic-native/android-fingerprint-auth'; import { AndroidFingerprintAuth } from '@ionic-native/android-fingerprint-auth';
import { Clipboard } from '@ionic-native/clipboard'; import { Clipboard } from '@ionic-native/clipboard';
import { FCM } from '@ionic-native/fcm';
import { QRScanner } from '@ionic-native/qr-scanner'; import { QRScanner } from '@ionic-native/qr-scanner';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { SocialSharing } from '@ionic-native/social-sharing'; import { SocialSharing } from '@ionic-native/social-sharing';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { Toast } from '@ionic-native/toast'; import { Toast } from '@ionic-native/toast';
import { TouchID } from '@ionic-native/touch-id'; import { TouchID } from '@ionic-native/touch-id';
import { FCM } from '@ionic-native/fcm';
/* Modules */ /* Modules */
import { MomentModule } from 'angular2-moment';
import { NgLoggerModule, Level } from '@nsalaun/ng-logger';
import { NgxQRCodeModule } from 'ngx-qrcode2';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader'; import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { Level, NgLoggerModule } from '@nsalaun/ng-logger';
import { MomentModule } from 'angular2-moment';
import { NgxQRCodeModule } from 'ngx-qrcode2';
/* Copay App */ /* Copay App */
import { CopayApp } from './app.component'; import { CopayApp } from './app.component';
/* Pages */ /* Pages */
import { TabsPage } from '../pages/tabs/tabs';
import { AddPage } from '../pages/add/add'; import { AddPage } from '../pages/add/add';
import { BitcoinCashPage } from '../pages/settings/bitcoin-cash/bitcoin-cash';
import { BackupRequestPage } from '../pages/onboarding/backup-request/backup-request';
import { BackupWarningPage } from '../pages/backup/backup-warning/backup-warning';
import { BackupGamePage } from '../pages/backup/backup-game/backup-game';
import { CreateWalletPage } from '../pages/add/create-wallet/create-wallet';
import { CopayersPage } from '../pages/add/copayers/copayers'; import { CopayersPage } from '../pages/add/copayers/copayers';
import { DisclaimerPage } from '../pages/onboarding/disclaimer/disclaimer'; import { CreateWalletPage } from '../pages/add/create-wallet/create-wallet';
import { CollectEmailPage } from '../pages/onboarding/collect-email/collect-email';
import { FeeWarningPage } from '../pages/send/fee-warning/fee-warning';
import { IncomingDataMenuPage } from '../pages/incoming-data-menu/incoming-data-menu';
import { ImportWalletPage } from '../pages/add/import-wallet/import-wallet'; import { ImportWalletPage } from '../pages/add/import-wallet/import-wallet';
import { JoinWalletPage } from '../pages/add/join-wallet/join-wallet'; import { JoinWalletPage } from '../pages/add/join-wallet/join-wallet';
import { BackupGamePage } from '../pages/backup/backup-game/backup-game';
import { BackupWarningPage } from '../pages/backup/backup-warning/backup-warning';
import { FeedbackCompletePage } from '../pages/feedback/feedback-complete/feedback-complete';
import { FeedbackPage } from '../pages/feedback/feedback/feedback';
import { SendFeedbackPage } from '../pages/feedback/send-feedback/send-feedback';
import { FinishModalPage } from '../pages/finish/finish';
import { IncomingDataMenuPage } from '../pages/incoming-data-menu/incoming-data-menu';
import { BackupRequestPage } from '../pages/onboarding/backup-request/backup-request';
import { CollectEmailPage } from '../pages/onboarding/collect-email/collect-email';
import { DisclaimerPage } from '../pages/onboarding/disclaimer/disclaimer';
import { OnboardingPage } from '../pages/onboarding/onboarding'; import { OnboardingPage } from '../pages/onboarding/onboarding';
import { TourPage } from '../pages/onboarding/tour/tour';
import { PaperWalletPage } from '../pages/paper-wallet/paper-wallet'; import { PaperWalletPage } from '../pages/paper-wallet/paper-wallet';
import { PayProPage } from '../pages/paypro/paypro'; import { PayProPage } from '../pages/paypro/paypro';
import { FeedbackPage } from '../pages/feedback/feedback/feedback'; import { FeeWarningPage } from '../pages/send/fee-warning/fee-warning';
import { FeedbackCompletePage } from '../pages/feedback/feedback-complete/feedback-complete'; import { BitcoinCashPage } from '../pages/settings/bitcoin-cash/bitcoin-cash';
import { TourPage } from '../pages/onboarding/tour/tour'; import { TabsPage } from '../pages/tabs/tabs';
import { WalletDetailsPage } from '../pages/wallet-details/wallet-details';
import { TxDetailsPage } from '../pages/tx-details/tx-details'; import { TxDetailsPage } from '../pages/tx-details/tx-details';
import { TxpDetailsPage } from '../pages/txp-details/txp-details'; import { TxpDetailsPage } from '../pages/txp-details/txp-details';
import { SendFeedbackPage } from '../pages/feedback/send-feedback/send-feedback'; import { WalletBalancePage } from '../pages/wallet-details/wallet-balance/wallet-balance';
import { SuccessModalPage } from '../pages/success/success'; import { WalletDetailsPage } from '../pages/wallet-details/wallet-details';
// Integrations: Amazon // Integrations: Amazon
import { AmazonCardDetailsPage } from '../pages/integrations/amazon/amazon-card-details/amazon-card-details';
import { AmazonPage } from '../pages/integrations/amazon/amazon'; import { AmazonPage } from '../pages/integrations/amazon/amazon';
import { AmazonCardDetailsPage } from '../pages/integrations/amazon/amazon-card-details/amazon-card-details';
import { BuyAmazonPage } from '../pages/integrations/amazon/buy-amazon/buy-amazon'; import { BuyAmazonPage } from '../pages/integrations/amazon/buy-amazon/buy-amazon';
// Integrations: Coinbase // Integrations: Coinbase
import { BuyCoinbasePage } from '../pages/integrations/coinbase/buy-coinbase/buy-coinbase'; import { BuyCoinbasePage } from '../pages/integrations/coinbase/buy-coinbase/buy-coinbase';
import { CoinbasePage } from '../pages/integrations/coinbase/coinbase'; import { CoinbasePage } from '../pages/integrations/coinbase/coinbase';
import { CoinbaseSettingsPage } from '../pages/integrations/coinbase/coinbase-settings/coinbase-settings';
import { CoinbaseTxDetailsPage } from '../pages/integrations/coinbase/coinbase-tx-details/coinbase-tx-details'; import { CoinbaseTxDetailsPage } from '../pages/integrations/coinbase/coinbase-tx-details/coinbase-tx-details';
import { SellCoinbasePage } from '../pages/integrations/coinbase/sell-coinbase/sell-coinbase'; import { SellCoinbasePage } from '../pages/integrations/coinbase/sell-coinbase/sell-coinbase';
import { CoinbaseSettingsPage } from '../pages/integrations/coinbase/coinbase-settings/coinbase-settings';
// Integrations: Glidera // Integrations: Glidera
import { BuyGlideraPage } from '../pages/integrations/glidera/buy-glidera/buy-glidera'; import { BuyGlideraPage } from '../pages/integrations/glidera/buy-glidera/buy-glidera';
import { GlideraPage } from '../pages/integrations/glidera/glidera'; import { GlideraPage } from '../pages/integrations/glidera/glidera';
import { GlideraSettingsPage } from '../pages/integrations/glidera/glidera-settings/glidera-settings';
import { GlideraTxDetailsPage } from '../pages/integrations/glidera/glidera-tx-details/glidera-tx-details'; import { GlideraTxDetailsPage } from '../pages/integrations/glidera/glidera-tx-details/glidera-tx-details';
import { SellGlideraPage } from '../pages/integrations/glidera/sell-glidera/sell-glidera'; import { SellGlideraPage } from '../pages/integrations/glidera/sell-glidera/sell-glidera';
import { GlideraSettingsPage } from '../pages/integrations/glidera/glidera-settings/glidera-settings';
// Integrations: Mercado Libre // Integrations: Mercado Libre
import { BuyMercadoLibrePage } from '../pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre'; import { BuyMercadoLibrePage } from '../pages/integrations/mercado-libre/buy-mercado-libre/buy-mercado-libre';
import { MercadoLibreCardDetailsPage } from '../pages/integrations/mercado-libre/mercado-libre-card-details/mercado-libre-card-details';
import { MercadoLibrePage } from '../pages/integrations/mercado-libre/mercado-libre'; import { MercadoLibrePage } from '../pages/integrations/mercado-libre/mercado-libre';
import { MercadoLibreCardDetailsPage } from '../pages/integrations/mercado-libre/mercado-libre-card-details/mercado-libre-card-details';
// Integrations: ShapeShift // Integrations: ShapeShift
import { ShapeshiftPage } from '../pages/integrations/shapeshift/shapeshift';
import { ShapeshiftConfirmPage } from '../pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm'; import { ShapeshiftConfirmPage } from '../pages/integrations/shapeshift/shapeshift-confirm/shapeshift-confirm';
import { ShapeshiftDetailsPage } from '../pages/integrations/shapeshift/shapeshift-details/shapeshift-details'; import { ShapeshiftDetailsPage } from '../pages/integrations/shapeshift/shapeshift-details/shapeshift-details';
import { ShapeshiftPage } from '../pages/integrations/shapeshift/shapeshift';
import { ShapeshiftShiftPage } from '../pages/integrations/shapeshift/shapeshift-shift/shapeshift-shift'; import { ShapeshiftShiftPage } from '../pages/integrations/shapeshift/shapeshift-shift/shapeshift-shift';
// Integrations: BitPayCard // Integrations: BitPayCard
import { BitPayCardIntroPage } from '../pages/integrations/bitpay-card/bitpay-card-intro/bitpay-card-intro';
import { BitPayCardPage } from '../pages/integrations/bitpay-card/bitpay-card'; import { BitPayCardPage } from '../pages/integrations/bitpay-card/bitpay-card';
import { BitPayCardIntroPage } from '../pages/integrations/bitpay-card/bitpay-card-intro/bitpay-card-intro';
import { BitPayCardTopUpPage } from '../pages/integrations/bitpay-card/bitpay-card-topup/bitpay-card-topup';
import { BitPaySettingsPage } from '../pages/integrations/bitpay-card/bitpay-settings/bitpay-settings';
/*Includes */ /*Includes */
import { CardItemPage } from '../pages/includes/card-item/card-item';
import { FeedbackCardPage } from '../pages/includes/feedback-card/feedback-card'; import { FeedbackCardPage } from '../pages/includes/feedback-card/feedback-card';
import { GravatarPage } from '../pages/includes/gravatar/gravatar'; import { GravatarPage } from '../pages/includes/gravatar/gravatar';
import { TxpPage } from '../pages/includes/txp/txp'; import { TxpPage } from '../pages/includes/txp/txp';
import { WalletItemPage } from '../pages/includes/wallet-item/wallet-item';
import { WalletActivityPage } from '../pages/includes/wallet-activity/wallet-activity'; import { WalletActivityPage } from '../pages/includes/wallet-activity/wallet-activity';
import { WalletItemPage } from '../pages/includes/wallet-item/wallet-item';
import { WalletSelectorPage } from '../pages/includes/wallet-selector/wallet-selector'; import { WalletSelectorPage } from '../pages/includes/wallet-selector/wallet-selector';
/* Tabs */ /* Tabs */
@ -107,70 +111,73 @@ import { ActivityPage } from '../pages/home/activity/activity';
import { ProposalsPage } from '../pages/home/proposals/proposals'; import { ProposalsPage } from '../pages/home/proposals/proposals';
/* Settings */ /* Settings */
import { FingerprintModalPage } from '../pages/fingerprint/fingerprint';
import { PinModalPage } from '../pages/pin/pin';
import { AboutPage } from '../pages/settings/about/about'; import { AboutPage } from '../pages/settings/about/about';
import { AddressbookPage } from '../pages/settings/addressbook/addressbook'; import { SessionLogPage } from '../pages/settings/about/session-log/session-log';
import { TermsOfUsePage } from '../pages/settings/about/terms-of-use/terms-of-use';
import { AddressbookAddPage } from '../pages/settings/addressbook/add/add'; import { AddressbookAddPage } from '../pages/settings/addressbook/add/add';
import { AddressbookPage } from '../pages/settings/addressbook/addressbook';
import { AddressbookViewPage } from '../pages/settings/addressbook/view/view'; import { AddressbookViewPage } from '../pages/settings/addressbook/view/view';
import { AdvancedPage } from '../pages/settings/advanced/advanced'; import { AdvancedPage } from '../pages/settings/advanced/advanced';
import { AltCurrencyPage } from '../pages/settings/alt-currency/alt-currency'; import { AltCurrencyPage } from '../pages/settings/alt-currency/alt-currency';
import { FingerprintModalPage } from '../pages/fingerprint/fingerprint'; import { EnabledServicesPage } from '../pages/settings/enabled-services/enabled-services';
import { FeePolicyPage } from '../pages/settings/fee-policy/fee-policy';
import { LanguagePage } from '../pages/settings/language/language'; import { LanguagePage } from '../pages/settings/language/language';
import { LockPage } from '../pages/settings/lock/lock'; import { LockPage } from '../pages/settings/lock/lock';
import { PinModalPage } from '../pages/pin/pin';
import { TermsOfUsePage } from '../pages/settings/about/terms-of-use/terms-of-use';
import { NotificationsPage } from '../pages/settings/notifications/notifications'; import { NotificationsPage } from '../pages/settings/notifications/notifications';
import { FeePolicyPage } from '../pages/settings/fee-policy/fee-policy';
import { SessionLogPage } from '../pages/settings/about/session-log/session-log';
/* Wallet Settings */ /* Wallet Settings */
import { WalletSettingsPage } from '../pages/settings/wallet-settings/wallet-settings';
import { WalletNamePage } from '../pages/settings/wallet-settings/wallet-name/wallet-name';
import { WalletColorPage } from '../pages/settings/wallet-settings/wallet-color/wallet-color'; import { WalletColorPage } from '../pages/settings/wallet-settings/wallet-color/wallet-color';
import { WalletNamePage } from '../pages/settings/wallet-settings/wallet-name/wallet-name';
import { WalletSettingsPage } from '../pages/settings/wallet-settings/wallet-settings';
/* Wallet Advanced Settings */ /* Wallet Advanced Settings */
import { WalletSettingsAdvancedPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-settings-advanced';
import { WalletInformationPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-information/wallet-information';
import { WalletAddressesPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/wallet-addresses';
import { WalletExportPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-export/wallet-export';
import { WalletServiceUrlPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-service-url/wallet-service-url';
import { WalletTransactionHistoryPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-transaction-history/wallet-transaction-history';
import { WalletDeletePage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete';
import { WalletExtendedPrivateKeyPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-information/wallet-extended-private-key/wallet-extended-private-key';
import { AllAddressesPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/all-addresses/all-addresses'; import { AllAddressesPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/all-addresses/all-addresses';
import { WalletAddressesPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-addresses/wallet-addresses';
import { WalletDeletePage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-delete/wallet-delete';
import { WalletExportPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-export/wallet-export';
import { WalletExtendedPrivateKeyPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-information/wallet-extended-private-key/wallet-extended-private-key';
import { WalletInformationPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-information/wallet-information';
import { WalletServiceUrlPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-service-url/wallet-service-url';
import { WalletSettingsAdvancedPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-settings-advanced';
import { WalletTransactionHistoryPage } from '../pages/settings/wallet-settings/wallet-settings-advanced/wallet-transaction-history/wallet-transaction-history';
/* Send */ /* Send */
import { AmountPage } from '../pages/send/amount/amount'; import { AmountPage } from '../pages/send/amount/amount';
import { ConfirmPage } from '../pages/send/confirm/confirm';
import { ChooseFeeLevelPage } from '../pages/send/choose-fee-level/choose-fee-level'; import { ChooseFeeLevelPage } from '../pages/send/choose-fee-level/choose-fee-level';
import { ConfirmPage } from '../pages/send/confirm/confirm';
/* Receive */ /* Receive */
import { CustomAmountPage } from '../pages/receive/custom-amount/custom-amount'; import { CustomAmountPage } from '../pages/receive/custom-amount/custom-amount';
/* Pipes */ /* Pipes */
import { SatToUnitPipe } from '../pipes/satToUnit';
import { SatToFiatPipe } from '../pipes/satToFiat';
import { FiatToUnitPipe } from '../pipes/fiatToUnit'; import { FiatToUnitPipe } from '../pipes/fiatToUnit';
import { KeysPipe } from '../pipes/keys'; import { KeysPipe } from '../pipes/keys';
import { OrderByPipe } from '../pipes/order-by'; import { OrderByPipe } from '../pipes/order-by';
import { SatToFiatPipe } from '../pipes/satToFiat';
import { SatToUnitPipe } from '../pipes/satToUnit';
/* Providers */ /* Providers */
import { AddressProvider } from '../providers/address/address';
import { AddressBookProvider } from '../providers/address-book/address-book'; import { AddressBookProvider } from '../providers/address-book/address-book';
import { AppProvider } from '../providers/app/app'; import { AddressProvider } from '../providers/address/address';
import { AppIdentityProvider } from '../providers/app-identity/app-identity';
import { AmazonProvider } from '../providers/amazon/amazon'; import { AmazonProvider } from '../providers/amazon/amazon';
import { AppIdentityProvider } from '../providers/app-identity/app-identity';
import { AppProvider } from '../providers/app/app';
import { BackupProvider } from '../providers/backup/backup'; import { BackupProvider } from '../providers/backup/backup';
import { BitPayAccountProvider } from '../providers/bitpay-account/bitpay-account'; import { BitPayAccountProvider } from '../providers/bitpay-account/bitpay-account';
import { BitPayProvider } from '../providers/bitpay/bitpay';
import { BitPayCardProvider } from '../providers/bitpay-card/bitpay-card'; import { BitPayCardProvider } from '../providers/bitpay-card/bitpay-card';
import { BwcProvider } from '../providers/bwc/bwc'; import { BitPayProvider } from '../providers/bitpay/bitpay';
import { BwcErrorProvider } from '../providers/bwc-error/bwc-error'; import { BwcErrorProvider } from '../providers/bwc-error/bwc-error';
import { ConfigProvider } from '../providers/config/config'; import { BwcProvider } from '../providers/bwc/bwc';
import { CoinbaseProvider } from '../providers/coinbase/coinbase'; import { CoinbaseProvider } from '../providers/coinbase/coinbase';
import { ConfigProvider } from '../providers/config/config';
import { DerivationPathHelperProvider } from '../providers/derivation-path-helper/derivation-path-helper'; import { DerivationPathHelperProvider } from '../providers/derivation-path-helper/derivation-path-helper';
import { EmailNotificationsProvider } from '../providers/email-notifications/email-notifications';
import { ExternalLinkProvider } from '../providers/external-link/external-link'; import { ExternalLinkProvider } from '../providers/external-link/external-link';
import { FeedbackProvider } from '../providers/feedback/feedback';
import { FeeProvider } from '../providers/fee/fee'; import { FeeProvider } from '../providers/fee/fee';
import { FeedbackProvider } from '../providers/feedback/feedback';
import { FilterProvider } from '../providers/filter/filter';
import { GlideraProvider } from '../providers/glidera/glidera'; import { GlideraProvider } from '../providers/glidera/glidera';
import { HomeIntegrationsProvider } from '../providers/home-integrations/home-integrations'; import { HomeIntegrationsProvider } from '../providers/home-integrations/home-integrations';
import { IncomingDataProvider } from '../providers/incoming-data/incoming-data'; import { IncomingDataProvider } from '../providers/incoming-data/incoming-data';
@ -187,15 +194,13 @@ import { ProfileProvider } from '../providers/profile/profile';
import { PushNotificationsProvider } from '../providers/push-notifications/push-notifications'; import { PushNotificationsProvider } from '../providers/push-notifications/push-notifications';
import { RateProvider } from '../providers/rate/rate'; import { RateProvider } from '../providers/rate/rate';
import { ReleaseProvider } from '../providers/release/release'; import { ReleaseProvider } from '../providers/release/release';
import { ShapeshiftProvider } from '../providers/shapeshift/shapeshift';
import { ScanProvider } from '../providers/scan/scan'; import { ScanProvider } from '../providers/scan/scan';
import { ShapeshiftProvider } from '../providers/shapeshift/shapeshift';
import { TimeProvider } from '../providers/time/time'; import { TimeProvider } from '../providers/time/time';
import { TouchIdProvider } from '../providers/touchid/touchid'; import { TouchIdProvider } from '../providers/touchid/touchid';
import { TxConfirmNotificationProvider } from '../providers/tx-confirm-notification/tx-confirm-notification'; import { TxConfirmNotificationProvider } from '../providers/tx-confirm-notification/tx-confirm-notification';
import { TxFormatProvider } from '../providers/tx-format/tx-format'; import { TxFormatProvider } from '../providers/tx-format/tx-format';
import { FilterProvider } from '../providers/filter/filter';
import { WalletProvider } from '../providers/wallet/wallet'; import { WalletProvider } from '../providers/wallet/wallet';
import { EmailNotificationsProvider } from '../providers/email-notifications/email-notifications';
/* Directives */ /* Directives */
import { CopyToClipboard } from '../directives/copy-to-clipboard/copy-to-clipboard'; import { CopyToClipboard } from '../directives/copy-to-clipboard/copy-to-clipboard';
@ -225,6 +230,8 @@ export function createTranslateLoader(http: HttpClient) {
BitcoinCashPage, BitcoinCashPage,
BitPayCardIntroPage, BitPayCardIntroPage,
BitPayCardPage, BitPayCardPage,
BitPaySettingsPage,
BitPayCardTopUpPage,
BuyAmazonPage, BuyAmazonPage,
BuyCoinbasePage, BuyCoinbasePage,
BuyGlideraPage, BuyGlideraPage,
@ -234,6 +241,7 @@ export function createTranslateLoader(http: HttpClient) {
CoinbasePage, CoinbasePage,
CoinbaseTxDetailsPage, CoinbaseTxDetailsPage,
CopayersPage, CopayersPage,
EnabledServicesPage,
FeedbackCardPage, FeedbackCardPage,
FeedbackPage, FeedbackPage,
FeedbackCompletePage, FeedbackCompletePage,
@ -279,7 +287,7 @@ export function createTranslateLoader(http: HttpClient) {
FeePolicyPage, FeePolicyPage,
SessionLogPage, SessionLogPage,
SendFeedbackPage, SendFeedbackPage,
SuccessModalPage, FinishModalPage,
TourPage, TourPage,
TabsPage, TabsPage,
TxpDetailsPage, TxpDetailsPage,
@ -297,9 +305,11 @@ export function createTranslateLoader(http: HttpClient) {
WalletDeletePage, WalletDeletePage,
WalletExtendedPrivateKeyPage, WalletExtendedPrivateKeyPage,
WalletDetailsPage, WalletDetailsPage,
WalletBalancePage,
WalletItemPage, WalletItemPage,
WalletActivityPage, WalletActivityPage,
WalletSelectorPage, WalletSelectorPage,
CardItemPage,
/* Directives */ /* Directives */
CopyToClipboard, CopyToClipboard,
LongPress, LongPress,
@ -348,6 +358,8 @@ export function createTranslateLoader(http: HttpClient) {
BitcoinCashPage, BitcoinCashPage,
BitPayCardIntroPage, BitPayCardIntroPage,
BitPayCardPage, BitPayCardPage,
BitPaySettingsPage,
BitPayCardTopUpPage,
BuyAmazonPage, BuyAmazonPage,
BuyCoinbasePage, BuyCoinbasePage,
BuyGlideraPage, BuyGlideraPage,
@ -357,6 +369,7 @@ export function createTranslateLoader(http: HttpClient) {
CoinbasePage, CoinbasePage,
CoinbaseTxDetailsPage, CoinbaseTxDetailsPage,
CopayersPage, CopayersPage,
EnabledServicesPage,
FeedbackCardPage, FeedbackCardPage,
FeedbackPage, FeedbackPage,
FeedbackCompletePage, FeedbackCompletePage,
@ -402,7 +415,7 @@ export function createTranslateLoader(http: HttpClient) {
FeePolicyPage, FeePolicyPage,
SessionLogPage, SessionLogPage,
SendFeedbackPage, SendFeedbackPage,
SuccessModalPage, FinishModalPage,
TourPage, TourPage,
TabsPage, TabsPage,
TxpDetailsPage, TxpDetailsPage,
@ -420,9 +433,11 @@ export function createTranslateLoader(http: HttpClient) {
WalletDeletePage, WalletDeletePage,
WalletExtendedPrivateKeyPage, WalletExtendedPrivateKeyPage,
WalletDetailsPage, WalletDetailsPage,
WalletBalancePage,
WalletItemPage, WalletItemPage,
WalletActivityPage, WalletActivityPage,
WalletSelectorPage WalletSelectorPage,
CardItemPage
], ],
providers: [ providers: [
AddressProvider, AddressProvider,

View File

@ -18,7 +18,7 @@
// -------------------------------------------------- // --------------------------------------------------
ion-alert.alert-top{ ion-alert.alert-top{
align-items: center; align-items: center;
} }
.bottom-absolute { .bottom-absolute {
@ -45,6 +45,19 @@ ion-alert.alert-top{
} }
} }
// Item font size
.item-title {
// font-size: 1.4rem;
}
.item-subtitle {
font-weight: 300;
font-size: 12.5px;
ion-icon {
vertical-align: text-bottom;
margin-left: 5px;
}
}
// This style prevents the names of the tabs from disappear // This style prevents the names of the tabs from disappear
.tabbar .tab-button .tab-button-text { .tabbar .tab-button .tab-button-text {
display: block; display: block;
@ -59,6 +72,17 @@ ion-alert.alert-top{
background-repeat: no-repeat; background-repeat: no-repeat;
background-clip: padding-box; background-clip: padding-box;
background-size: 103%; background-size: 103%;
padding: 4px;
}
.icon-card {
border-radius: $icon-border-radius;
width: 35px;
height: 35px;
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.2);
background-repeat: no-repeat;
background-clip: padding-box;
background-size: 103%;
} }
.big-icon-svg { .big-icon-svg {

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="QR_Icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 22 22" style="enable-background:new 0 0 22 22;" xml:space="preserve">
<style type="text/css">
.st0{fill:#343434;}
</style>
<path class="st0" d="M9.7,9.7H0V0h9.7V9.7z M1.2,8.5h7.3V1.2H1.2V8.5z"/>
<path class="st0" d="M22,9.7h-9.7V0H22V9.7z M13.5,8.5h7.3V1.2h-7.3V8.5z"/>
<path class="st0" d="M9.7,22H0v-9.7h9.7V22z M1.2,20.8h7.3v-7.3H1.2V20.8z"/>
<polygon class="st0" points="22,17.6 20.8,17.6 20.8,13.5 18.2,13.5 18.2,16.3 13.2,16.3 13.2,12.9 14.4,12.9 14.4,15.1 17,15.1
17,12.3 22,12.3 "/>
<polygon class="st0" points="21.4,22 13.2,22 13.2,19.5 14.4,19.5 14.4,20.8 21.4,20.8 "/>
<rect x="3.8" y="3.8" class="st0" width="2.2" height="2.2"/>
<rect x="16" y="3.8" class="st0" width="2.2" height="2.2"/>
<rect x="3.8" y="16" class="st0" width="2.2" height="2.2"/>
</svg>

After

Width:  |  Height:  |  Size: 950 B

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve">
<title>Group 2</title>
<desc>Created with Sketch.</desc>
<g id="Group-2" transform="translate(8.000000, 8.000000)">
<g id="Group" transform="translate(8.000000, 7.500000)">
<path id="Shape" fill="none" stroke="#7A8C9E" d="M-14.5,1c0-8.733,6.724-15.881,14.94-15.881c5.828,0,10.904,3.491,13.298,8.733"
/>
<path id="Shape_1_" fill="none" stroke="#7A8C9E" d="M15.5,1c0,8.732-6.73,15.881-14.94,15.881c-5.828,0-10.903-3.49-13.298-8.732
"/>
<polyline id="Shape_2_" fill="none" stroke="#7A8C9E" points="15.5,-14.881 14.248,-6.06 4.917,-7.258 "/>
<polyline id="Shape_3_" fill="none" stroke="#7A8C9E" points="-14.5,16.881 -13.254,8.061 -3.911,9.258 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
<path fill="#9B9BAB" d="M50,0C22.41,0,0,22.409,0,50s22.41,50,50,50c27.59,0,50-22.409,50-50S77.59,0,50,0z M50,4
c25.429,0,46,20.571,46,46S75.429,96,50,96S4,75.429,4,50S24.571,4,50,4z M47.562,25.812c-0.43,0-0.688,0.257-0.688,0.688v5.25
c0,0.43,0.255,0.75,0.688,0.75h4.875c0.428,0,0.688-0.32,0.688-0.75V26.5c0-0.43-0.258-0.688-0.688-0.688H47.562z M47.438,40.25
C47.176,40.351,47,40.615,47,40.938v32.938c0,0.43,0.257,0.688,0.688,0.688h4.625c0.43,0,0.688-0.256,0.688-0.688V40.938
c0-0.43-0.256-0.688-0.688-0.688h-4.625C47.581,40.25,47.525,40.216,47.438,40.25z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="14px" height="19px" viewBox="0 0 14 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.3 (12072) - http://www.bohemiancoding.com/sketch -->
<title>lock</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="WALLET-2-of-3" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Home-with-funds-Copy-2" sketch:type="MSArtboardGroup" transform="translate(-443.500000, -486.000000)" fill="#7A8C9E">
<path d="M456.185388,493.514086 C456.549207,493.514086 456.857852,493.642315 457.111332,493.898778 C457.364812,494.15524 457.491551,494.465376 457.491551,494.829195 L457.491551,503.337148 C457.491551,503.695002 457.364812,504.002156 457.111332,504.258619 C456.857852,504.515081 456.549207,504.643311 456.185388,504.643311 L445.056163,504.643311 C444.692344,504.643311 444.383699,504.515081 444.130219,504.258619 C443.876738,504.002156 443.75,503.695002 443.75,503.337148 L443.75,494.829195 C443.75,494.465376 443.876738,494.15524 444.130219,493.898778 C444.383699,493.642315 444.692344,493.514086 445.056163,493.514086 L446.371272,493.514086 L446.371272,490.90176 C446.371272,489.726804 446.785781,488.723335 447.614811,487.891322 C448.443841,487.05931 449.445819,486.643311 450.620775,486.643311 C451.795732,486.643311 452.79771,487.05931 453.62674,487.891322 C454.45577,488.723335 454.870278,489.726804 454.870278,490.90176 L454.870278,493.514086 L456.185388,493.514086 Z M447.024354,490.90176 L447.024354,493.514086 L454.217197,493.514086 L454.217197,490.90176 C454.217197,489.911695 453.865312,489.064785 453.161531,488.361004 C452.45775,487.657224 451.61084,487.305338 450.620775,487.305338 C449.630711,487.305338 448.783801,487.657224 448.08002,488.361004 C447.376239,489.064785 447.024354,489.911695 447.024354,490.90176 L447.024354,490.90176 Z M456.838469,503.337148 L456.838469,494.829195 C456.838469,494.644304 456.774355,494.489236 456.646123,494.363986 C456.517892,494.238737 456.364315,494.176114 456.185388,494.176114 L445.056163,494.176114 C444.877236,494.176114 444.723659,494.238737 444.595427,494.363986 C444.467196,494.489236 444.403082,494.644304 444.403082,494.829195 L444.403082,503.337148 C444.403082,503.516075 444.467196,503.669652 444.595427,503.797883 C444.723659,503.926114 444.877236,503.990229 445.056163,503.990229 L456.185388,503.990229 C456.364315,503.990229 456.517892,503.926114 456.646123,503.797883 C456.774355,503.669652 456.838469,503.516075 456.838469,503.337148 L456.838469,503.337148 Z M450.620775,497.441521 C450.895131,497.441521 451.127733,497.536948 451.318588,497.727804 C451.509444,497.918659 451.604871,498.151261 451.604871,498.425617 C451.604871,498.634365 451.543738,498.823727 451.421471,498.993708 C451.299204,499.163689 451.142645,499.281481 450.951789,499.347088 L450.951789,500.384861 C450.951789,500.480289 450.918986,500.559314 450.85338,500.621939 C450.787773,500.684563 450.710239,500.715875 450.620775,500.715875 C450.531312,500.715875 450.453778,500.684563 450.388171,500.621939 C450.322564,500.559314 450.289761,500.480289 450.289761,500.384861 L450.289761,499.347088 C450.098906,499.281481 449.942347,499.163689 449.82008,498.993708 C449.697813,498.823727 449.63668,498.634365 449.63668,498.425617 C449.63668,498.151261 449.732106,497.918659 449.922962,497.727804 C450.113818,497.536948 450.34642,497.441521 450.620775,497.441521 L450.620775,497.441521 Z" id="lock" sketch:type="MSShapeGroup"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" id="svg602" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="400px" height="500px" viewBox="0 0 400 500" enable-background="new 0 0 400 500" xml:space="preserve">
<g id="XMLID_1_">
<g>
<path fill="#9B9BAB" d="M383,353l12,3c-8.49,45.05-18.39,92.31-22,138L3.77,495.91l0.55-14.26l190.41-226.54L6.41,20.35L6,5h356
l10,121h-13c-0.99-12.58-3.73-25.02-7.67-37C328.26,18.92,245.31,33,187,33l-90.96,0.36l156.25,195.32L79,438h170
c30.3,0,64.83,2.32,91-16.04C363.87,405.21,371.82,378.23,383,353z"/>
</g>
<g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 859 B

View File

@ -0,0 +1 @@
<svg width="46" height="49" viewBox="0 0 46 49" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>airplane</title><path d="M31.9 46.15V42.8a.833.833 0 0 0-.253-.596l-4.796-4.797V27.264l15.628 6.242h.023a.635.635 0 0 0 .298.069c.46 0 .85-.39.85-.85v-3.35c0-.298-.161-.528-.368-.688L26.851 17.189V5.026A5.024 5.024 0 0 0 21.825 0a5.024 5.024 0 0 0-5.026 5.026v12.163L.367 28.687c-.206.16-.367.39-.367.688v3.35c0 .46.39.85.85.85a.635.635 0 0 0 .297-.07h.023L16.8 27.265v10.143l-4.797 4.797a.833.833 0 0 0-.252.596v3.35c0 .483.39.85.85.85a.774.774 0 0 0 .39-.115l8.835-4.796 8.835 4.796a.774.774 0 0 0 .39.115c.46 0 .85-.367.85-.85z" transform="translate(1 1)" stroke="#444444" stroke-width=".8" fill-rule="nonzero" fill="none"></path></g></svg>

After

Width:  |  Height:  |  Size: 775 B

View File

@ -0,0 +1 @@
<svg width="45" height="43" viewBox="0 0 45 43" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>art</title><g transform="translate(-140 -203) translate(140 203) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 20C0 12.6 3.7 6 9.3 2 11.4.6 14.6.3 16 2c1.9 2.5-1.5 6 0 8 3.9 4.8 12.2-4.7 22 0 7 3.5 6 12.7 5.2 16-2.6 9.2-11.1 16-21.2 16C9.8 42 0 32.2 0 20z"></path><circle cx="32" cy="20" r="4"></circle><circle cx="8" cy="20" r="2"></circle><circle cx="13" cy="30" r="2"></circle><circle cx="24" cy="34" r="2"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 615 B

View File

@ -0,0 +1 @@
<svg width="45" height="31" viewBox="0 0 45 31" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>bicycle</title><g transform="translate(-140 -272) translate(140 272) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><circle cx="35" cy="21" r="9"></circle><circle cx="9" cy="21" r="9"></circle><path d="M16 2H8"></path><path d="M36 22L32 0"></path><path d="M33.5 8L12 8 8 22"></path><path d="M28 0h10c1.7 0 3 1.3 3 3s-1.3 3-3 3"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 518 B

View File

@ -0,0 +1 @@
<svg width="41" height="41" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>bitcoin-topup</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-1113 -1082) translate(1113 1082) translate(.5 .5)"><path d="M40 20c0 11-9 20-20 20S0 31 0 20 9 0 20 0c7.9 0 14.8 4.6 18 11.3"></path><path d="M39 4L38 11.2 32 10.4"></path></g><path d="M5.714 0v3.467" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M8 0v3.467" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M5.714 21.956v3.466" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M8 21.956v3.466" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M0 21.956h3.429" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M0 3.467h3.429" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M3.429 11.556v-8.09h6.634c2.353 0 4.223 1.792 4.223 4.045s-1.87 4.045-4.223 4.045" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path><path d="M3.429 21.956v-10.4h7.5c2.5 0 4.5 2.31 4.5 5.2 0 2.888-2 5.2-4.5 5.2h-7.5z" transform="translate(-1113 -1082) translate(1113 1082) translate(8 6) translate(4 2) translate(.286 .289)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1 @@
<svg width="39" height="37" viewBox="0 0 39 37" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>boat</title><g transform="translate(-143 -328) translate(143 328) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M32 36L2 36 0 30 38 30z"></path><path d="M2 24L20 24 20 0z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 372 B

View File

@ -0,0 +1 @@
<svg width="45" height="37" viewBox="0 0 45 37" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>books</title><g transform="translate(-140 -391) translate(140 391) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M7 6h6"></path><path d="M21 18h-6"></path><path d="M7 30h6"></path><path d="M28 0v12"></path><path d="M36 12v12"></path><path d="M28 24v12"></path><path d="M18 6h2"></path><path d="M26 18h2"></path><path d="M18 30h2"></path><path d="M0 0H36V12H0z"></path><path d="M8 12H44V24H8z"></path><path d="M0 24H36V36H0z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 625 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>bowling</title><g transform="translate(-140 -453) translate(140 453) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><circle cx="22" cy="22" r="22"></circle><circle cx="22" cy="10" r="2"></circle><circle cx="16" cy="20" r="2"></circle><circle cx="28" cy="20" r="2"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 456 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>bug</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M28 9.4V6c0-3.3-2.7-6-6-6s-6 2.7-6 6v3.4" transform="translate(-140 -523) translate(140 523) translate(.5 .5)"></path><path d="M8 22H6c-3.3 0-6-2.7-6-6v-2" transform="translate(-140 -523) translate(140 523) translate(.5 .5)"></path><path d="M8 30H6c-3.3 0-6 2.7-6 6v2" transform="translate(-140 -523) translate(140 523) translate(.5 .5)"></path><path d="M36 22h2c3.3 0 6-2.7 6-6v-2" transform="translate(-140 -523) translate(140 523) translate(.5 .5)"></path><path d="M36 30h2c3.3 0 6 2.7 6 6v2" transform="translate(-140 -523) translate(140 523) translate(.5 .5)"></path><path d="M36 30c0 7.7-6.3 14-14 14S8 37.7 8 30v-8c0-7.7 6.3-14 14-14s14 6.3 14 14v8z" transform="translate(-140 -523) translate(140 523) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 969 B

View File

@ -0,0 +1 @@
<svg width="45" height="33" viewBox="0 0 45 33" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>bus</title><g transform="translate(-140 -602) translate(140 602) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M32 6L32 14 38 14"></path><path d="M30.1 26H13.9"></path><path d="M4.1 26H0V4c0-2.2 1.8-4 4-4h36c2.2 0 4 1.8 4 4v22h-4.1"></path><circle cx="9" cy="27" r="5"></circle><circle cx="35" cy="27" r="5"></circle><path d="M6 6H26V14H6z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 541 B

View File

@ -0,0 +1 @@
<svg width="46" height="35" viewBox="0 0 46 35" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>camera</title><g stroke="#444444" stroke-width=".9" fill="none" fill-rule="evenodd"><path d="M40.863 4.705h-6.295C31.432 4.705 29.863 0 26.705 0h-9.41c-3.158 0-4.727 4.705-7.863 4.705H3.137C1.397 4.705 0 6.123 0 7.863v22A3.14 3.14 0 0 0 3.137 33h37.726A3.154 3.154 0 0 0 44 29.863v-22c0-1.74-1.418-3.158-3.137-3.158z" transform="translate(1 1)"></path><path d="M22 7.863c-5.2 0-9.432 4.211-9.432 9.41 0 5.221 4.233 9.432 9.432 9.432 5.2 0 9.432-4.21 9.432-9.432 0-5.199-4.233-9.41-9.432-9.41z" transform="translate(1 1)"></path><path d="M34.568 8.637c-.859 0-1.568.709-1.568 1.568 0 .88.709 1.568 1.568 1.568a1.55 1.55 0 0 0 1.569-1.568c0-.86-.688-1.568-1.569-1.568z" transform="translate(1 1)"></path><path d="M22 11c-3.48 0-6.295 2.814-6.295 6.273A6.29 6.29 0 0 0 22 23.568a6.29 6.29 0 0 0 6.295-6.295C28.295 13.814 25.48 11 22 11z" transform="translate(1 1)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 1015 B

View File

@ -0,0 +1 @@
<svg width="46" height="39" viewBox="0 0 46 39" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>car</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M39.21 14.654l-1.291-8.683A7 7 0 0 0 30.995 0H12.571a7 7 0 0 0-6.924 5.97l-1.29 8.684" transform="translate(1 1)"></path><path d="M10.892 29.308v2.97a4.357 4.357 0 1 1-8.713 0v-2.97" stroke-linecap="square" transform="translate(1 1)"></path><path d="M40.821 29.308v2.97a4.357 4.357 0 0 1-8.713 0v-2.97" stroke-linecap="square" transform="translate(1 1)"></path><path d="M43.566 29.308H0v-7.265a8 8 0 0 1 2.851-6.123l1.506-1.266H39.21l1.505 1.266a8 8 0 0 1 2.851 6.123v7.265z" stroke-linecap="square" transform="translate(1 1)"></path><path d="M8.713 21h4.357" stroke-linecap="square" transform="translate(1 1)"></path><path d="M30.496 21h4.357" stroke-linecap="square" transform="translate(1 1)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 938 B

View File

@ -0,0 +1 @@
<svg width="33" height="45" viewBox="0 0 33 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>clean</title><g transform="translate(-146 -781) translate(146 781) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M16 44v-4"></path><path d="M22 44v-4"></path><path d="M10 44v-4"></path><path d="M12 18h8"></path><path d="M12 26L0 44 32 44 20 26"></path><path d="M20 26h-8V4c0-2.2 1.8-4 4-4s4 1.8 4 4v22z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 504 B

View File

@ -0,0 +1 @@
<svg width="49" height="49" viewBox="0 0 49 49" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>clock</title><g transform="translate(1 1)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="square"><circle cx="23.336" cy="23.336" r="23.336"></circle><path d="M23.3361681 10.6073491L23.3361681 23.3361681 36.064987 23.3361681"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 414 B

View File

@ -0,0 +1 @@
<svg width="35" height="42" viewBox="0 0 35 42" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>cocktail</title><g transform="translate(-1) translate(.54 .473)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M20.516 11.596c0-3.925 3.211-7.136 7.136-7.136 3.925 0 7.136 3.211 7.136 7.136 0 3.925-3.21 7.136-7.136 7.136"></path><path d="M22.3 40.14H8.028c-3.033 0-5.352-2.319-5.352-5.352V11.596h24.976v23.192c0 3.033-2.319 5.352-5.352 5.352z" stroke-linecap="square"></path><path stroke-linecap="square" d="M0.892008285 0.892008285L8.02807457 0.892008285 15.1641408 33.0043065"></path><path d="M2.676 25.868h24.976" stroke-linecap="square"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 723 B

View File

@ -0,0 +1 @@
<svg width="29" height="41" viewBox="0 0 29 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>coins</title><g transform="translate(-148 -999) translate(148 999) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M12.5 32.3c-1.3.4-2.8.7-4.5.7-4.4 0-8-1.8-8-4 0-1 .7-1.8 1.8-2.5"></path><path d="M12.5 27.3c-1.3.4-2.8.7-4.5.7-4.4 0-8-1.8-8-4 0-.9.6-1.8 1.7-2.5"></path><path d="M12.5 22.3c-1.3.4-2.8.7-4.5.7-4.4 0-8-1.8-8-4 0-1 .7-1.8 1.8-2.5"></path><path d="M12.5 17.3c-1.3.4-2.8.7-4.5.7-4.4 0-8-1.8-8-4 0-.9.7-1.8 1.8-2.5"></path><path d="M14.2 11.5c.6.3 1 .7 1.3 1.2"></path><path d="M14.3 6.5C15.4 7.2 16 8 16 9c0 2.2-3.6 4-8 4s-8-1.8-8-4c0-1 .7-1.8 1.8-2.5"></path><ellipse cx="8" cy="4" rx="8" ry="4"></ellipse><path d="M26.2 33.5c1.1.7 1.8 1.5 1.8 2.5 0 2.2-3.6 4-8 4s-8-1.8-8-4c0-.9.7-1.8 1.8-2.5"></path><path d="M26.2 28.5c1.1.7 1.8 1.5 1.8 2.5 0 2.2-3.6 4-8 4s-8-1.8-8-4c0-1 .7-1.8 1.8-2.5"></path><path d="M26.2 23.4c1.1.7 1.8 1.6 1.8 2.6 0 2.2-3.6 4-8 4s-8-1.8-8-4c0-.9.7-1.8 1.7-2.5"></path><path d="M26.2 18.5c1.1.7 1.8 1.5 1.8 2.5 0 2.2-3.6 4-8 4s-8-1.8-8-4c0-1 .7-1.8 1.8-2.5"></path><ellipse cx="20" cy="16" rx="8" ry="4"></ellipse></g></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>computer</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M28 36v8" transform="translate(-140 -1066) translate(140 1066) translate(.5 .5)"></path><path d="M16 44v-8" transform="translate(-140 -1066) translate(140 1066) translate(.5 .5)"></path><path d="M10 44h24" transform="translate(-140 -1066) translate(140 1066) translate(.5 .5)"></path><path d="M20 6h4" transform="translate(-140 -1066) translate(140 1066) translate(.5 .5)"></path><path d="M40 36H4c-2.2 0-4-1.8-4-4V4c0-2.2 1.8-4 4-4h36c2.2 0 4 1.8 4 4v28c0 2.2-1.8 4-4 4z" transform="translate(-140 -1066) translate(140 1066) translate(.5 .5)"></path><path d="M0 28h44" transform="translate(-140 -1066) translate(140 1066) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 888 B

View File

@ -0,0 +1 @@
<svg width="46" height="34" viewBox="0 0 46 34" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>default</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 8h44" transform="translate(-139 -1136) translate(140 1137)"></path><path d="M0 16h44" transform="translate(-139 -1136) translate(140 1137)"></path><path d="M41 32H3c-1.7 0-3-1.3-3-3V3c0-1.7 1.3-3 3-3h38c1.7 0 3 1.3 3 3v26c0 1.7-1.3 3-3 3z" transform="translate(-139 -1136) translate(140 1137)"></path><path d="M8 24h10" transform="translate(-139 -1136) translate(140 1137)"></path><path d="M33 24h3" transform="translate(-139 -1136) translate(140 1137)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 703 B

View File

@ -0,0 +1 @@
<svg width="41" height="39" viewBox="0 0 41 39" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>diamond-ring</title><g transform="translate(-142 -1198) translate(142 1198) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 12h40"></path><path d="M20 38L28 12 20 0"></path><path d="M20 0L12 12 20 38"></path><path d="M8 0l4 12"></path><path d="M32 0l-4 12"></path><path d="M40 12L20 38 0 12 8 0 32 0z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 503 B

View File

@ -0,0 +1 @@
<svg width="41" height="41" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>dollar-topup</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-269 -20) translate(269 20) translate(.5 .5)"><path d="M40 20c0 11-9 20-20 20S0 31 0 20 9 0 20 0c7.9 0 14.8 4.6 18 11.3"></path><path d="M39 4L38 11.2 32 10.4"></path></g><path d="M0 17c0 2.8 2.2 5 5 5h2c2.8 0 5-2.2 5-5 0-7-12-3-12-10 0-2.8 2.2-5 5-5h2c2.8 0 5 2.2 5 5" transform="translate(-269 -20) translate(269 20) translate(14.5 8.5)"></path><path d="M6 0v24" transform="translate(-269 -20) translate(269 20) translate(14.5 8.5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 701 B

View File

@ -0,0 +1 @@
<svg width="41" height="41" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>euro-topup</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-319 -20) translate(319 20) translate(.5 .5)"><path d="M40 20c0 11-9 20-20 20S0 31 0 20 9 0 20 0c7.9 0 14.8 4.6 18 11.3"></path><path d="M39 4L38 11.2 32 10.4"></path></g><path d="M18 18c-1.7 1.3-3.7 2-6 2-5.5 0-10-4.5-10-10S6.5 0 12 0c2.3 0 4.3.7 6 2" transform="translate(-319 -20) translate(319 20) translate(10 10) translate(.5 .5)"></path><path d="M0 6h12" transform="translate(-319 -20) translate(319 20) translate(10 10) translate(.5 .5)"></path><path d="M0 12h12" transform="translate(-319 -20) translate(319 20) translate(10 10) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 820 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>film</title><g transform="translate(-139 -1265) translate(139 1265) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 0v44"></path><path d="M44 0v44"></path><path d="M8 0H36V44H8z"></path><path d="M0 22h44"></path><path d="M0 14h8"></path><path d="M0 6h8"></path><path d="M36 14h8"></path><path d="M36 6h8"></path><path d="M36 38h8"></path><path d="M36 30h8"></path><path d="M0 38h8"></path><path d="M0 30h8"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 608 B

View File

@ -0,0 +1 @@
<svg width="49" height="47" viewBox="0 0 49 47" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>food</title><g transform="translate(0 1)" stroke="#444444" stroke-width=".8" fill="none" fill-rule="evenodd"><path d="M22.859 43.827a5.277 5.277 0 0 0 3.747 1.55H39.68c2.971 0 5.349-2.426 5.349-5.46"></path><path d="M25.499 21.277a9.04 9.04 0 0 1 5.003-1.511h5.282c5.085 0 9.245 4.246 9.245 9.435"></path><path d="M34.4634922 33.2454215L24 33.2454215 24.5142857 29.2014654 47.6698414 29.2014654 47.6698414 33.2454215 42.3873017 33.2454215 38.4253969 35.9413922z"></path><path d="M44.368 33.245c1.85 0 3.302 1.483 3.302 3.37 0 1.888-1.453 3.37-3.302 3.37H22.914"></path><path d="M2.857 21.143c3.197-.254 6.689.508 10.475 2.286 3.785 1.777 7.76 1.61 11.925-.5" stroke-linecap="round" stroke-linejoin="round"></path><path stroke-linecap="round" stroke-linejoin="round" d="M22.465772 45.3169908L26.9665364 8.93581196 1.08714116 8.93581196 5.58790555 45.3169908z"></path><path stroke-linecap="round" stroke-linejoin="round" d="M10.8571429 41.7142857L19.6079497 0.0593043995 32.610158 0.0593043995"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>football</title><g transform="translate(-140 -1335) translate(140 1335) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M22 32H0v10c12.167 0 12-15.667 12-22"></path><circle cx="30" cy="36" r="2"></circle><path d="M30 44a8 8 0 0 0 8-8v-2c0-4 6-6.25 6-10v-4C42.988 8.788 33.475 0 22 0S1.113 8.788.101 20H18a4 4 0 0 1 4 4v12a8 8 0 0 0 8 8z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 536 B

View File

@ -0,0 +1 @@
<svg width="45" height="41" viewBox="0 0 45 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>furniture</title><g transform="translate(-140 -1475) translate(140 1475) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 36h44"></path><path d="M22 36V0"></path><path d="M0 12h44"></path><path d="M0 24h44"></path><path d="M0 40L0 0 44 0 44 40"></path><path d="M9 6h4"></path><path d="M31 6h4"></path><path d="M9 18h4"></path><path d="M31 18h4"></path><path d="M9 30h4"></path><path d="M31 30h4"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 596 B

View File

@ -0,0 +1 @@
<svg width="45" height="39" viewBox="0 0 45 39" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>game</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M32 38H12C5.4 38 0 32.6 0 26s5.4-12 12-12h20c6.6 0 12 5.4 12 12s-5.4 12-12 12z" transform="translate(-140 -1531) translate(140 1531) translate(.5 .5)"></path><path d="M12 22v8" transform="translate(-140 -1531) translate(140 1531) translate(.5 .5)"></path><path d="M8 26h8" transform="translate(-140 -1531) translate(140 1531) translate(.5 .5)"></path><path d="M30 24l2-2" transform="translate(-140 -1531) translate(140 1531) translate(.5 .5)"></path><path d="M34 30l2-2" transform="translate(-140 -1531) translate(140 1531) translate(.5 .5)"></path><path d="M22 6V0" transform="translate(-140 -1531) translate(140 1531) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 881 B

View File

@ -0,0 +1 @@
<svg width="48" height="44" viewBox="0 0 48 44" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>gas</title><g transform="translate(-33 1) translate(34)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"><path d="M43.398 11.546c0-3.318-1.26-5.906-3.981-7.963"></path><path d="M33.046 24.287v5.574a5.574 5.574 0 1 0 11.148 0V19.51"></path><path d="M9.157 5.972H27.472V19.509H9.157z"></path><path d="M9.157 24.287h6.37"></path><path d="M40.213 11.546H45.787V19.509H40.213z"></path><path d="M3.583 41.806V3.583A3.185 3.185 0 0 1 6.77.398H29.86a3.185 3.185 0 0 1 3.185 3.185v38.223"></path><path d="M.398 41.806h35.833"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 735 B

View File

@ -0,0 +1 @@
<svg width="41" height="45" viewBox="0 0 41 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>golf</title><g transform="translate(-142 -1661) translate(142 1661) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M36 14H22v-3.646a4 4 0 0 1 2.057-3.497l10-5.556C36.724-.179 40 1.748 40 4.798V10a4 4 0 0 1-4 4z"></path><path d="M22 14v12"></path><path d="M2 18h12v-4.681a2 2 0 0 0-1.212-1.838l-10-4.286A2 2 0 0 0 0 9.033V16a2 2 0 0 0 2 2z"></path><path d="M14 18v8"></path><path d="M4 26H32V34H4z"></path><path d="M28 34v10"></path><path d="M8 44V34"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 650 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>hotel</title><g transform="translate(-140 -1732) translate(140 1732) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M8 44L0 44 0 26 8 26"></path><path d="M36 44L44 44 44 26 36 26"></path><path d="M18 0L18 2 18 8"></path><path d="M26 8V0"></path><path d="M26 3h-8"></path><path d="M8 8H36V44H8z"></path><path d="M16 14h2"></path><path d="M26 14h2"></path><path d="M16 20h2"></path><path d="M26 20h2"></path><path d="M16 26h2"></path><path d="M26 26h2"></path><path d="M16 32h2"></path><path d="M26 32h2"></path><path d="M25 44L25 38 19 38 19 44"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 744 B

View File

@ -0,0 +1 @@
<svg width="43" height="43" viewBox="0 0 43 43" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>law</title><g transform="translate(-138 -1808) translate(138 1808) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M32 12L42 22 38 26 28 16"></path><path stroke-width="1" transform="rotate(-45 27.035 11.035)" d="M15.735 6.785H38.335V15.285H15.735z"></path><path d="M4 42L4 36 26 36 26 42"></path><path d="M8 28H2"></path><path d="M10.9 20.9l-4.2-4.2"></path><path d="M0 42h30"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 575 B

View File

@ -0,0 +1 @@
<svg width="41" height="28" viewBox="0 0 41 28" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>mail</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0.899090878 0.723658512L20.6790902 15.1968287 40.4590895 0.723658512"></path><path stroke-linecap="square" d="M0.899 0.724H40.459V26.776H0.899z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 389 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>medical</title><g transform="translate(-140 -1871) translate(140 1871) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M14 30v2c0 6.6 5.4 12 12 12s12-5.4 12-12"></path><circle cx="38" cy="26" r="6"></circle><path d="M20 2h5.7c1.2 0 2.2 1.1 2 2.3l-3.2 22.3c-.3 2-2 3.4-4 3.4h-13c-2 0-3.7-1.5-4-3.4L.3 4.3C.2 3.1 1.1 2 2.3 2H8"></path><path d="M8 0v4"></path><path d="M20 0v4"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 573 B

View File

@ -0,0 +1 @@
<svg width="45" height="39" viewBox="0 0 45 39" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>money</title><g transform="translate(-140 -2012) translate(140 2012) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M32 12H12c0 3.3-2.7 6-6 6v8c3.3 0 6 2.7 6 6h20c0-3.3 2.7-6 6-6v-8c-3.3 0-6-2.7-6-6z"></path><path d="M40 6L40 0 4 0 4 6"></path><path d="M0 6H44V38H0z"></path><circle cx="22" cy="22" r="4"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 506 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>motorcycle</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 34h21.117a4 4 0 0 0 3.795-2.735l3.333-10C29.108 18.675 27.181 16 24.45 16H.827" transform="translate(-140 -1942) translate(140 1942) translate(.5 .5)"></path><path d="M21.588.004C9.477.225 0 9.887 0 22v12c0 5.523 4.477 10 10 10h18c8.837 0 16-7.163 16-16v-6C44 9.713 33.927-.222 21.588.004z" transform="translate(-140 -1942) translate(140 1942) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 614 B

View File

@ -0,0 +1 @@
<svg width="43" height="41" viewBox="0 0 43 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>music</title><g transform="translate(-85 -605) translate(85 605) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M12 10v24"></path><path d="M42 10v20"></path><path d="M12 0H42V10H12z"></path><circle cx="6" cy="34" r="6"></circle><circle cx="36" cy="30" r="6"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 459 B

View File

@ -0,0 +1 @@
<svg width="34" height="34" viewBox="0 0 34 34" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>newspaper</title><g stroke="#444444" stroke-width=".8" fill="none" fill-rule="evenodd" stroke-linecap="square"><path d="M3.67 33.033a2.945 2.945 0 0 1-2.936-2.936V18.352h5.873"></path><path d="M6.607.734v29.363a2.945 2.945 0 0 1-2.937 2.936h26.427a2.945 2.945 0 0 0 2.936-2.936V.734H6.607z"></path><path d="M24.225 8h2.936"></path><path d="M24.225 13h2.936"></path><path d="M12.48 19h14.68"></path><path d="M12.48 25h14.68"></path><path d="M12.479 8.075H18.352V13.948H12.479z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 630 B

View File

@ -0,0 +1 @@
<svg width="41" height="41" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>park</title><g transform="translate(-142 -2203) translate(142 2203) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M12.12499 20L0 20 10 0 15.79992 11.60019"></path><path d="M27.875 20L40 20 30 0 24.20008 11.60019"></path><path d="M20 34v6"></path><path d="M34 34L6 34 20 2z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 474 B

View File

@ -0,0 +1 @@
<svg width="33" height="43" viewBox="0 0 33 43" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>people</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M16 24c-5.5 0-10-4.5-10-10v-4C6 4.5 10.5 0 16 0s10 4.5 10 10v4c0 5.5-4.5 10-10 10z" transform="translate(-146 -2406) translate(146 2406) translate(.5 .5)"></path><path d="M24 30H8c-4.4 0-8 3.6-8 8v4h32v-4c0-4.4-3.6-8-8-8z" transform="translate(-146 -2406) translate(146 2406) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 539 B

View File

@ -0,0 +1 @@
<svg width="45" height="41" viewBox="0 0 45 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>pet</title><g transform="translate(-140 -2340) translate(138 2339) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><ellipse stroke-width="1" transform="rotate(-3.001 16.667 7.065)" cx="16.667" cy="7.065" rx="4.4" ry="5.867"></ellipse><ellipse stroke-width="1" transform="rotate(-17.103 5.817 18.174)" cx="5.817" cy="18.174" rx="3.667" ry="5.133"></ellipse><ellipse stroke-width="1" transform="rotate(-162.897 42.183 18.174)" cx="42.183" cy="18.174" rx="3.667" ry="5.133"></ellipse><ellipse stroke-width="1" transform="rotate(3.105 31.333 7.065)" cx="31.333" cy="7.065" rx="4.4" ry="5.867"></ellipse><path d="M15.752 21.991l-3.813 7.481c-3.18 6.238 2.264 13.587 8.143 10.993 2.764-1.22 5.07-1.22 7.836 0 5.88 2.594 11.323-4.755 8.143-10.993l-3.813-7.48c-3.969-6.656-12.527-6.656-16.496 0z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 978 B

View File

@ -0,0 +1 @@
<svg width="25" height="43" viewBox="0 0 25 43" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>plant</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M0 24C0 14.125 12 0 12 0s12 14.125 12 24c0 6.627-5.373 10-12 10S0 30.627 0 24z" transform="translate(-150 -2269) translate(150 2269) translate(.5 .5)"></path><path d="M12 15v27" transform="translate(-150 -2269) translate(150 2269) translate(.5 .5)"></path><path d="M2 42h20" transform="translate(-150 -2269) translate(150 2269) translate(.5 .5)"></path><path d="M12 29l5-5" transform="translate(-150 -2269) translate(150 2269) translate(.5 .5)"></path><path d="M7 19l5 5" transform="translate(-150 -2269) translate(150 2269) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 787 B

View File

@ -0,0 +1 @@
<svg width="43" height="45" viewBox="0 0 43 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>purchase</title><g transform="translate(-141 -2475) translate(141 2475) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M24 42L42 24 18 0 0 0 0 18z"></path><circle cx="12" cy="12" r="4"></circle><path d="M24 18l6 6"></path><path d="M18 24l6 6"></path><path d="M13.8 15.6c-1-2.2-2.3-3.6-3.8-3.6-3.3 0-6 7.2-6 16s2.7 16 6 16c2.6 0 4.8-4.3 5.6-10.4"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 545 B

View File

@ -0,0 +1 @@
<svg width="45" height="44" viewBox="0 0 45 44" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>repair</title><path d="M42.5 8.6l-5.9 5.9-7.1-7.1 5.9-5.9C34 1.1 32.6.9 31 1c-5.6.5-10.1 5.5-10 11.1 0 1.1.2 2.2.5 3.2l-19.2 17c-2.9 2.5-3 7-.3 9.7 2.7 2.7 7.1 2.6 9.7-.3l17-19.2c1.7.5 3.6.7 5.6.3 4-.8 7.3-3.8 8.4-7.7.5-2.3.4-4.5-.2-6.5z" transform="translate(-140 -2546) translate(140 2545) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"></path></g></svg>

After

Width:  |  Height:  |  Size: 525 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>sadface</title><g transform="translate(-140 -2615) translate(140 2615) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><circle cx="22" cy="22" r="22"></circle><path d="M15.1 32c1.4-2.4 4-4 6.9-4 3 0 5.5 1.6 6.9 4"></path><circle cx="14" cy="14" r="2"></circle><circle cx="30" cy="14" r="2"></circle><path d="M32 24c0-1.1-2-4-2-4s-2 2.9-2 4 .9 2 2 2 2-.9 2-2z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 549 B

View File

@ -0,0 +1 @@
<svg width="41" height="41" viewBox="0 0 41 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>scissors</title><g transform="translate(-142 -2686) translate(142 2686) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M10.878 30.505L36 0"></path><path d="M29.122 30.505L4 0"></path><circle cx="34" cy="34" r="6"></circle><circle cx="6" cy="34" r="6"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 452 B

View File

@ -0,0 +1 @@
<svg width="45" height="43" viewBox="0 0 45 43" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>search</title><g transform="translate(-140 -2752) translate(140 2752) translate(.523 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M43.953 42L32.128 30.7"></path><ellipse cx="18.837" cy="18" rx="18.837" ry="18"></ellipse></g></g></svg>

After

Width:  |  Height:  |  Size: 401 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>shirt</title><g transform="translate(-140 -2880) translate(140 2880) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M22 10v34"></path><path d="M15 24h1"></path><path d="M15 31h1"></path><path d="M15 38h1"></path><path d="M34 6L44 6 44 44 0 44 0 6 10 6"></path><path d="M34 0L22 10 34 18 34 0 10 0 10 18 22 10 10 0"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 514 B

View File

@ -0,0 +1 @@
<svg width="45" height="25" viewBox="0 0 45 25" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>shoes</title><g transform="translate(-140 -2955) translate(140 2955) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M14.8 2.7L25 10 34 10"></path><path d="M0 19h44"></path><path d="M40 24H4c-2.2 0-4-1.8-4-4V0h2s2.9 4 8 4 8-4 8-4h2l14 10h4c3.3 0 6 2.7 6 6v4c0 2.2-1.8 4-4 4z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 474 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>smiley-face</title><g transform="translate(-140 -2814) translate(140 2814) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><circle cx="22" cy="22" r="22"></circle><path d="M14 26c0 4.4 3.6 8 8 8s8-3.6 8-8"></path><circle cx="14" cy="16" r="2"></circle><circle cx="30" cy="16" r="2"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 473 B

View File

@ -0,0 +1 @@
<svg width="45" height="41" viewBox="0 0 45 41" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>business-48px-outline_briefcase-25</title><g transform="translate(-1111 -751) translate(1111 751) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M14 6L14 0 30 0 30 6"></path><path d="M44 28L44 40 0 40 0 28"></path><path d="M30 28H14"></path><path d="M6 28L0 28 0 6 44 6 44 28 38 28"></path><path d="M10 6v18"></path><path d="M34 6v18"></path><path d="M34 32v8"></path><path d="M10 32v8"></path><path d="M6 24H14V32H6z"></path><path d="M30 24H38V32H30z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 652 B

View File

@ -0,0 +1 @@
<svg width="46" height="46" viewBox="0 0 46 46" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>telephone</title><path d="M36.695 45.427c-5.318 0-12.283-4.376-22.142-14.236C4.529 20.085.128 12.721.693 8.061 1 5.449 2.811 3.708 5.846 1.614 7.023.767 7.916.46 8.717.602c1.53.282 3.388 2.259 6.212 6.612 3.435 5.341 2.47 6.165.847 7.506-1.153.941-2.376 2-2.376 3.341 0 .66.282 1.248.776 1.789 2.8 3.106 8.118 8.588 12.071 12.165a2.92 2.92 0 0 0 1.977.753c1.647 0 3.13-1.624 3.576-2.024 1.671-1.506 2.518-2.259 7.483 1.012 3.86 2.518 6.071 5.083 6.071 7.224 0 1.906-3.93 6.447-8.66 6.447z" stroke="#444444" stroke-width=".8" fill-rule="nonzero" fill="none"></path></g></svg>

After

Width:  |  Height:  |  Size: 706 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>television</title><g transform="translate(-140 -3081) translate(140 3081) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M16 4l6 8"></path><path d="M22 12L32 0"></path><path d="M0 12H44V44H0z"></path><path d="M6 18H32V38H6z"></path><path d="M38 18v2"></path><path d="M38 28v10"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 477 B

View File

@ -0,0 +1 @@
<svg width="45" height="45" viewBox="0 0 45 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>tent</title><g transform="translate(-140 -3152) translate(140 3152) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><circle cx="38" cy="6" r="6"></circle><path d="M44 32H28"></path><path d="M20 44L20 36 14 29.2 8 36 8 44"></path><path d="M14 16L28 32 28 44"></path><path d="M0 44L0 32 14 16 30 16 44 32 44 44z"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 500 B

View File

@ -0,0 +1 @@
<svg width="45" height="33" viewBox="0 0 45 33" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>ticket</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M38 16c0-3.3 2.7-6 6-6V0H0v10c3.3 0 6 2.7 6 6s-2.7 6-6 6v10h44V22c-3.3 0-6-2.7-6-6z" transform="translate(-140 -3222) translate(140 3222) translate(.5 .5)"></path><path d="M14 12h16" transform="translate(-140 -3222) translate(140 3222) translate(.5 .5)"></path><path d="M14 20h8" transform="translate(-140 -3222) translate(140 3222) translate(.5 .5)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 596 B

View File

@ -0,0 +1 @@
<svg width="45" height="43" viewBox="0 0 45 43" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>toy</title><g transform="translate(-140 -3281) translate(140 3281) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><circle cx="6" cy="6" r="6"></circle><circle cx="38" cy="6" r="6"></circle><circle cx="22" cy="24" r="18"></circle><path d="M22 28L24 24 20 24z"></path><path d="M22 28v4"></path><path d="M18 32h8"></path><circle cx="16" cy="18" r="1"></circle><circle cx="28" cy="18" r="1"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 579 B

View File

@ -0,0 +1 @@
<svg width="52" height="37" viewBox="0 0 52 37" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>truck</title><g stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-1108 -1350) translate(1108 1350) translate(.5 .5)"><path d="M39 10L39 18 45 18"></path><path d="M37.1 30H20.9"></path><path d="M11.1 30H7V18h26V4h7c2.2 0 11 12 11 12v14h-4.1"></path><circle cx="16" cy="31" r="5"></circle><circle cx="42" cy="31" r="5"></circle><path d="M0 0H33V18H0z"></path></g><path d="M2.5 3.5h28" stroke-linecap="square" transform="translate(-1108 -1350) translate(1108 1350)"></path><path d="M2.5 6.5h28" stroke-linecap="square" transform="translate(-1108 -1350) translate(1108 1350)"></path><path d="M2.5 9.5h28" stroke-linecap="square" transform="translate(-1108 -1350) translate(1108 1350)"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 875 B

View File

@ -0,0 +1 @@
<svg width="37" height="45" viewBox="0 0 37 45" xmlns="http://www.w3.org/2000/svg"><g class="nc-icon-wrapper" fill="#444444"><title>watch</title><g transform="translate(-144 -3349) translate(144 3349) translate(.5 .5)" stroke="#444444" stroke-width="1" fill="none" fill-rule="evenodd"><path d="M6.1 9.4L8 0 24 0 25.9 9.4"></path><path d="M25.9 34.6L24 44 8 44 6.1 34.5"></path><path d="M31.5 18L36 18 36 26 31.5 26"></path><circle cx="16" cy="22" r="16"></circle><path d="M16 16L16 22 22 22"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 513 B

View File

@ -1,9 +1,9 @@
import { DOCUMENT } from "@angular/platform-browser";
import { Directive, Inject } from '@angular/core'; import { Directive, Inject } from '@angular/core';
import { ToastController } from 'ionic-angular'; import { DOCUMENT } from "@angular/platform-browser";
import { Clipboard } from '@ionic-native/clipboard'; import { Clipboard } from '@ionic-native/clipboard';
import { PlatformProvider } from '../../providers/platform/platform'; import { ToastController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
import { PlatformProvider } from '../../providers/platform/platform';
@Directive({ @Directive({
selector: '[copy-to-clipboard]', // Attribute selector selector: '[copy-to-clipboard]', // Attribute selector

View File

@ -1,4 +1,4 @@
import { Directive, ElementRef, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core'; import { Directive, ElementRef, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core';
import { Gesture } from 'ionic-angular/gestures/gesture'; import { Gesture } from 'ionic-angular/gestures/gesture';
declare var Hammer: any; declare var Hammer: any;

View File

@ -1,10 +1,10 @@
export class Profile { export class Profile {
public version: string; public version: string;
public createdOn: Number; public createdOn: number;
public credentials: Array<any>; public credentials: any[];
public disclaimerAccepted: boolean; public disclaimerAccepted: boolean;
public checked: Object; public checked: any;
public checkedUA?: any; public checkedUA?: any;
public dirty: boolean; public dirty: boolean;
@ -32,7 +32,7 @@ export class Profile {
x.checkedUA = obj.checkedUA || {}; x.checkedUA = obj.checkedUA || {};
if (x.credentials[0] && typeof x.credentials[0] != 'object') if (x.credentials[0] && typeof x.credentials[0] != 'object')
throw ("credentials should be an object"); throw new Error("credentials should be an object");
return x; return x;
}; };
@ -74,7 +74,7 @@ export class Profile {
public addWallet(credentials: any): boolean { public addWallet(credentials: any): boolean {
if (!credentials.walletId) if (!credentials.walletId)
throw 'credentials must have .walletId'; throw new Error('credentials must have .walletId');
if (this.hasWallet(credentials.walletId)) if (this.hasWallet(credentials.walletId))
return false; return false;
@ -86,7 +86,7 @@ export class Profile {
public updateWallet(credentials: any): boolean { public updateWallet(credentials: any): boolean {
if (!credentials.walletId) if (!credentials.walletId)
throw 'credentials must have .walletId'; throw new Error('credentials must have .walletId');
if (!this.hasWallet(credentials.walletId)) if (!this.hasWallet(credentials.walletId))
return false; return false;

View File

@ -2,7 +2,7 @@ import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger'; import { Logger } from '../../providers/logger/logger';
//pages // pages
import { CreateWalletPage } from "./create-wallet/create-wallet"; import { CreateWalletPage } from "./create-wallet/create-wallet";
import { ImportWalletPage } from "./import-wallet/import-wallet"; import { ImportWalletPage } from "./import-wallet/import-wallet";
import { JoinWalletPage } from "./join-wallet/join-wallet"; import { JoinWalletPage } from "./join-wallet/join-wallet";
@ -28,7 +28,7 @@ export class AddPage {
} }
public goToCreateWallet(isShared: boolean): void { public goToCreateWallet(isShared: boolean): void {
this.navCtrl.push(CreateWalletPage, { isShared: isShared, coin: this.coin }); this.navCtrl.push(CreateWalletPage, { isShared, coin: this.coin });
} }
public goToJoinWallet(): void { public goToJoinWallet(): void {

View File

@ -1,6 +1,6 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams, Events } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Events, NavController, NavParams } from 'ionic-angular';
// Pages // Pages
import { WalletDetailsPage } from '../../../pages/wallet-details/wallet-details'; import { WalletDetailsPage } from '../../../pages/wallet-details/wallet-details';
@ -8,13 +8,13 @@ import { WalletDetailsPage } from '../../../pages/wallet-details/wallet-details'
// Providers // Providers
import { AppProvider } from '../../../providers/app/app'; import { AppProvider } from '../../../providers/app/app';
import { BwcErrorProvider } from '../../../providers/bwc-error/bwc-error'; import { BwcErrorProvider } from '../../../providers/bwc-error/bwc-error';
import { Logger } from '../../../providers/logger/logger';
import { OnGoingProcessProvider } from "../../../providers/on-going-process/on-going-process"; import { OnGoingProcessProvider } from "../../../providers/on-going-process/on-going-process";
import { PlatformProvider } from '../../../providers/platform/platform'; import { PlatformProvider } from '../../../providers/platform/platform';
import { PopupProvider } from '../../../providers/popup/popup'; import { PopupProvider } from '../../../providers/popup/popup';
import { ProfileProvider } from '../../../providers/profile/profile'; import { ProfileProvider } from '../../../providers/profile/profile';
import { PushNotificationsProvider } from '../../../providers/push-notifications/push-notifications';
import { WalletProvider } from '../../../providers/wallet/wallet'; import { WalletProvider } from '../../../providers/wallet/wallet';
import { Logger } from '../../../providers/logger/logger';
@Component({ @Component({
selector: 'page-copayers', selector: 'page-copayers',
@ -42,7 +42,8 @@ export class CopayersPage {
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private walletProvider: WalletProvider, private walletProvider: WalletProvider,
private translate: TranslateService private translate: TranslateService,
private pushNotificationsProvider: PushNotificationsProvider
) { ) {
this.secret = null; this.secret = null;
} }
@ -59,10 +60,6 @@ export class CopayersPage {
}); });
} }
ionViewWillLeave() {
this.events.unsubscribe('bwsEvent');
}
private updateWallet(): void { private updateWallet(): void {
this.logger.debug('Updating wallet:' + this.wallet.name) this.logger.debug('Updating wallet:' + this.wallet.name)
this.walletProvider.getStatus(this.wallet, {}).then((status: any) => { this.walletProvider.getStatus(this.wallet, {}).then((status: any) => {
@ -98,9 +95,10 @@ export class CopayersPage {
this.profileProvider.deleteWalletClient(this.wallet).then(() => { this.profileProvider.deleteWalletClient(this.wallet).then(() => {
this.onGoingProcessProvider.set('deletingWallet', false); this.onGoingProcessProvider.set('deletingWallet', false);
// TODO: pushNotificationsService.unsubscribe(this.wallet); this.pushNotificationsProvider.unsubscribe(this.wallet);
this.navCtrl.popToRoot(); this.navCtrl.popToRoot().then(() => {
this.navCtrl.parent.select(0); this.navCtrl.parent.select(0);
});
}).catch((err: any) => { }).catch((err: any) => {
this.onGoingProcessProvider.set('deletingWallet', false); this.onGoingProcessProvider.set('deletingWallet', false);
let errorText = this.translate.instant('Error'); let errorText = this.translate.instant('Error');

View File

@ -1,18 +1,19 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Events, NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger';
// Pages // Pages
import { CopayersPage } from '../copayers/copayers'; import { CopayersPage } from '../copayers/copayers';
// Providers // Providers
import { ConfigProvider } from '../../../providers/config/config'; import { ConfigProvider } from '../../../providers/config/config';
import { ProfileProvider } from '../../../providers/profile/profile';
import { DerivationPathHelperProvider } from '../../../providers/derivation-path-helper/derivation-path-helper'; import { DerivationPathHelperProvider } from '../../../providers/derivation-path-helper/derivation-path-helper';
import { PopupProvider } from '../../../providers/popup/popup';
import { OnGoingProcessProvider } from "../../../providers/on-going-process/on-going-process"; import { OnGoingProcessProvider } from "../../../providers/on-going-process/on-going-process";
import { PopupProvider } from '../../../providers/popup/popup';
import { ProfileProvider } from '../../../providers/profile/profile';
import { PushNotificationsProvider } from '../../../providers/push-notifications/push-notifications';
import { WalletProvider } from '../../../providers/wallet/wallet'; import { WalletProvider } from '../../../providers/wallet/wallet';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -45,8 +46,8 @@ export class CreateWalletPage implements OnInit {
private derivationPathByDefault: string; private derivationPathByDefault: string;
private derivationPathForTestnet: string; private derivationPathForTestnet: string;
public copayers: Array<number>; public copayers: number[];
public signatures: Array<number>; public signatures: number[];
public showAdvOpts: boolean; public showAdvOpts: boolean;
public seedOptions: any; public seedOptions: any;
public isShared: boolean; public isShared: boolean;
@ -63,7 +64,9 @@ export class CreateWalletPage implements OnInit {
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private logger: Logger, private logger: Logger,
private walletProvider: WalletProvider, private walletProvider: WalletProvider,
private translate: TranslateService private translate: TranslateService,
private events: Events,
private pushNotificationsProvider: PushNotificationsProvider
) { ) {
this.isShared = this.navParams.get('isShared'); this.isShared = this.navParams.get('isShared');
@ -124,7 +127,7 @@ export class CreateWalletPage implements OnInit {
label: 'Specify Recovery Phrase', label: 'Specify Recovery Phrase',
supportsTestnet: false supportsTestnet: false
}]; }];
this.createForm.controls['selectedSeed'].setValue(this.seedOptions[0].id); // new or set this.createForm.controls['selectedSeed'].setValue(this.seedOptions[0].id); // new or set
}; };
public seedOptionsChange(seed: any): void { public seedOptionsChange(seed: any): void {
@ -195,8 +198,9 @@ export class CreateWalletPage implements OnInit {
this.profileProvider.createWallet(opts).then((wallet: any) => { this.profileProvider.createWallet(opts).then((wallet: any) => {
this.onGoingProcessProvider.set('creatingWallet', false); this.onGoingProcessProvider.set('creatingWallet', false);
this.events.publish('status:updated');
this.walletProvider.updateRemotePreferences(wallet); this.walletProvider.updateRemotePreferences(wallet);
// TODO: this.pushNotificationsService.updateSubscription(wallet); this.pushNotificationsProvider.updateSubscription(wallet);
if (this.createForm.value.selectedSeed == 'set') { if (this.createForm.value.selectedSeed == 'set') {
this.profileProvider.setBackupFlag(wallet.credentials.walletId); this.profileProvider.setBackupFlag(wallet.credentials.walletId);

View File

@ -1,8 +1,8 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Events, NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger';
// Pages // Pages
import { TabsPage } from '../../tabs/tabs'; import { TabsPage } from '../../tabs/tabs';
@ -13,8 +13,8 @@ import { ConfigProvider } from '../../../providers/config/config';
import { DerivationPathHelperProvider } from '../../../providers/derivation-path-helper/derivation-path-helper'; import { DerivationPathHelperProvider } from '../../../providers/derivation-path-helper/derivation-path-helper';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process'; import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process';
import { PlatformProvider } from '../../../providers/platform/platform'; import { PlatformProvider } from '../../../providers/platform/platform';
import { ProfileProvider } from '../../../providers/profile/profile';
import { PopupProvider } from '../../../providers/popup/popup'; import { PopupProvider } from '../../../providers/popup/popup';
import { ProfileProvider } from '../../../providers/profile/profile';
import { WalletProvider } from '../../../providers/wallet/wallet'; import { WalletProvider } from '../../../providers/wallet/wallet';
@Component({ @Component({
@ -54,7 +54,8 @@ export class ImportWalletPage {
private logger: Logger, private logger: Logger,
private onGoingProcessProvider: OnGoingProcessProvider, private onGoingProcessProvider: OnGoingProcessProvider,
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private translate: TranslateService private translate: TranslateService,
private events: Events
) { ) {
this.reader = new FileReader(); this.reader = new FileReader();
this.defaults = this.configProvider.getDefaults(); this.defaults = this.configProvider.getDefaults();
@ -203,6 +204,7 @@ export class ImportWalletPage {
private finish(wallet: any): void { private finish(wallet: any): void {
this.walletProvider.updateRemotePreferences(wallet).then(() => { this.walletProvider.updateRemotePreferences(wallet).then(() => {
this.profileProvider.setBackupFlag(wallet.credentials.walletId); this.profileProvider.setBackupFlag(wallet.credentials.walletId);
this.events.publish('status:updated');
if (this.fromOnboarding) { if (this.fromOnboarding) {
this.profileProvider.setDisclaimerAccepted().catch((err: any) => { this.profileProvider.setDisclaimerAccepted().catch((err: any) => {
this.logger.error(err); this.logger.error(err);
@ -211,8 +213,9 @@ export class ImportWalletPage {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot();
} }
else { else {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot().then(() => {
this.navCtrl.parent.select(0); this.navCtrl.parent.select(0);
});
} }
}).catch((err: any) => { }).catch((err: any) => {
this.logger.warn(err); this.logger.warn(err);
@ -331,7 +334,7 @@ export class ImportWalletPage {
} else if (words.indexOf('xprv') == 0 || words.indexOf('tprv') == 0) { } else if (words.indexOf('xprv') == 0 || words.indexOf('tprv') == 0) {
return this.importExtendedPrivateKey(words, opts); return this.importExtendedPrivateKey(words, opts);
} else { } else {
let wordList: Array<any> = words.split(/[\u3000\s]+/); let wordList: any[] = words.split(/[\u3000\s]+/);
if ((wordList.length % 3) != 0) { if ((wordList.length % 3) != 0) {
let title = this.translate.instant('Error'); let title = this.translate.instant('Error');
@ -369,10 +372,11 @@ export class ImportWalletPage {
public openScanner(): void { public openScanner(): void {
if (this.navParams.data.fromScan) { if (this.navParams.data.fromScan) {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot({ animate: false });
} else { } else {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot({ animate: false }).then(() => {
this.navCtrl.parent.select(2); this.navCtrl.parent.select(2);
});
} }
} }

View File

@ -1,8 +1,8 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams } from 'ionic-angular'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Logger } from '../../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Events, NavController, NavParams } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger';
// Pages // Pages
import { CopayersPage } from '../copayers/copayers'; import { CopayersPage } from '../copayers/copayers';
@ -40,7 +40,8 @@ export class JoinWalletPage {
private profileProvider: ProfileProvider, private profileProvider: ProfileProvider,
private walletProvider: WalletProvider, private walletProvider: WalletProvider,
private logger: Logger, private logger: Logger,
private translate: TranslateService private translate: TranslateService,
private events: Events
) { ) {
this.defaults = this.configProvider.getDefaults(); this.defaults = this.configProvider.getDefaults();
@ -147,6 +148,7 @@ export class JoinWalletPage {
this.profileProvider.joinWallet(opts).then((wallet: any) => { this.profileProvider.joinWallet(opts).then((wallet: any) => {
this.onGoingProcessProvider.set('joiningWallet', false); this.onGoingProcessProvider.set('joiningWallet', false);
this.events.publish('status:updated');
this.walletProvider.updateRemotePreferences(wallet); this.walletProvider.updateRemotePreferences(wallet);
if (!wallet.isComplete()) { if (!wallet.isComplete()) {
@ -165,10 +167,11 @@ export class JoinWalletPage {
public openScanner(): void { public openScanner(): void {
if (this.navParams.data.fromScan) { if (this.navParams.data.fromScan) {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot({ animate: false });
} else { } else {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot({ animate: false }).then(() => {
this.navCtrl.parent.select(2); this.navCtrl.parent.select(2);
});
} }
} }

View File

@ -1,16 +1,16 @@
import { Component, ViewChild } from '@angular/core'; import { Component, ViewChild } from '@angular/core';
import { NavController, Slides, Navbar, AlertController, NavParams } from 'ionic-angular'; import { AlertController, Navbar, NavController, NavParams, Slides } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger';
import * as _ from 'lodash'; import * as _ from 'lodash';
import { Logger } from '../../../providers/logger/logger';
//pahes // pages
import { DisclaimerPage } from '../../onboarding/disclaimer/disclaimer'; import { DisclaimerPage } from '../../onboarding/disclaimer/disclaimer';
//providers // providers
import { ProfileProvider } from '../../../providers/profile/profile';
import { WalletProvider } from '../../../providers/wallet/wallet';
import { BwcProvider } from '../../../providers/bwc/bwc'; import { BwcProvider } from '../../../providers/bwc/bwc';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process'; import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process';
import { ProfileProvider } from '../../../providers/profile/profile';
import { WalletProvider } from '../../../providers/wallet/wallet';
@Component({ @Component({
selector: 'page-backup-game', selector: 'page-backup-game',
@ -24,10 +24,10 @@ export class BackupGamePage {
public currentIndex: number; public currentIndex: number;
public deleted: boolean; public deleted: boolean;
public mnemonicWords: Array<String>; public mnemonicWords: string[];
public shuffledMnemonicWords: Array<any>; public shuffledMnemonicWords: any[];
public password: String; public password: string;
public customWords: Array<any>; public customWords: any[];
public selectComplete: boolean; public selectComplete: boolean;
public error: boolean; public error: boolean;
public credentialsEncrypted: boolean; public credentialsEncrypted: boolean;
@ -84,7 +84,7 @@ export class BackupGamePage {
if (this.slides) this.slides.lockSwipes(true); if (this.slides) this.slides.lockSwipes(true);
} }
private shuffledWords(words: Array<String>) { private shuffledWords(words: string[]) {
var sort = _.sortBy(words); var sort = _.sortBy(words);
return _.map(sort, (w) => { return _.map(sort, (w) => {
@ -143,7 +143,7 @@ export class BackupGamePage {
if (this.fromOnboarding) { if (this.fromOnboarding) {
this.navCtrl.push(DisclaimerPage); this.navCtrl.push(DisclaimerPage);
} else { } else {
this.navCtrl.popToRoot(); this.navCtrl.popToRoot({ animate: false });
} }
} }
}], }],
@ -226,7 +226,7 @@ export class BackupGamePage {
try { try {
walletClient.seedFromMnemonic(customSentence, { walletClient.seedFromMnemonic(customSentence, {
network: this.wallet.credentials.network, network: this.wallet.credentials.network,
password: password, password,
account: this.wallet.credentials.account account: this.wallet.credentials.account
}); });
} catch (err) { } catch (err) {

View File

@ -1,5 +1,5 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams, ModalController, AlertController } from 'ionic-angular'; import { AlertController, ModalController, NavController, NavParams } from 'ionic-angular';
import { BackupGamePage } from '../backup-game/backup-game'; import { BackupGamePage } from '../backup-game/backup-game';
@Component({ @Component({

View File

@ -2,16 +2,16 @@ import { Component } from '@angular/core';
import { NavController, NavParams, ViewController } from 'ionic-angular'; import { NavController, NavParams, ViewController } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
//native // native
import { SocialSharing } from '@ionic-native/social-sharing'; import { SocialSharing } from '@ionic-native/social-sharing';
//providers // providers
import { PersistenceProvider } from '../../../providers/persistence/persistence';
import { PlatformProvider } from '../../../providers/platform/platform';
import { AppProvider } from '../../../providers/app/app'; import { AppProvider } from '../../../providers/app/app';
import { ConfigProvider } from '../../../providers/config/config'; import { ConfigProvider } from '../../../providers/config/config';
import { PersistenceProvider } from '../../../providers/persistence/persistence';
import { PlatformProvider } from '../../../providers/platform/platform';
//pages // pages
import { HomePage } from '../../home/home'; import { HomePage } from '../../home/home';
@Component({ @Component({

View File

@ -1,15 +1,15 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavParams, NavController, Platform } from 'ionic-angular'; import { NavController, NavParams, Platform } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
//providers // providers
import { PlatformProvider } from '../../../providers/platform/platform';
import { AppProvider } from '../../../providers/app/app'; import { AppProvider } from '../../../providers/app/app';
import { ConfigProvider } from '../../../providers/config/config'; import { ConfigProvider } from '../../../providers/config/config';
import { FeedbackProvider } from '../../../providers/feedback/feedback';
import { ExternalLinkProvider } from '../../../providers/external-link/external-link'; import { ExternalLinkProvider } from '../../../providers/external-link/external-link';
import { FeedbackProvider } from '../../../providers/feedback/feedback';
import { PlatformProvider } from '../../../providers/platform/platform';
//pages // pages
import { FeedbackCompletePage } from '../feedback-complete/feedback-complete'; import { FeedbackCompletePage } from '../feedback-complete/feedback-complete';
import { SendFeedbackPage } from '../send-feedback/send-feedback'; import { SendFeedbackPage } from '../send-feedback/send-feedback';
@ -50,7 +50,7 @@ export class FeedbackPage {
public skip(): void { public skip(): void {
let platform = this.platform.platforms().join(""); let platform = this.platform.platforms().join("");
let versions: any = this.platform.versions(); let versions: any = this.platform.versions();
versions = _.values(_.pickBy(versions, _.identity)) //remove undefined and get array of versions versions = _.values(_.pickBy(versions, _.identity)) // remove undefined and get array of versions
let version: any = versions && versions[0] ? versions[0] : null; let version: any = versions && versions[0] ? versions[0] : null;
let versionStr = version ? version.str : ''; let versionStr = version ? version.str : '';

View File

@ -1,19 +1,19 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { NavController, NavParams, Platform } from 'ionic-angular'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { NavController, NavParams, Platform } from 'ionic-angular';
import * as _ from "lodash"; import * as _ from "lodash";
//providers // providers
import { ConfigProvider } from '../../../providers/config/config';
import { AppProvider } from '../../../providers/app/app'; import { AppProvider } from '../../../providers/app/app';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process'; import { ConfigProvider } from '../../../providers/config/config';
import { FeedbackProvider } from '../../../providers/feedback/feedback'; import { FeedbackProvider } from '../../../providers/feedback/feedback';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process';
import { PopupProvider } from '../../../providers/popup/popup'; import { PopupProvider } from '../../../providers/popup/popup';
//pages // pages
import { FeedbackCompletePage } from '../feedback-complete/feedback-complete';
import { HomePage } from '../../home/home'; import { HomePage } from '../../home/home';
import { FeedbackCompletePage } from '../feedback-complete/feedback-complete';
@Component({ @Component({
@ -85,7 +85,7 @@ export class SendFeedbackPage {
let platform = this.platform.platforms().join(""); let platform = this.platform.platforms().join("");
let versions: any = this.platform.versions(); let versions: any = this.platform.versions();
versions = _.values(_.pickBy(versions, _.identity)) //remove undefined and get array of versions versions = _.values(_.pickBy(versions, _.identity)) // remove undefined and get array of versions
let version: any = versions && versions[0] ? versions[0] : null; let version: any = versions && versions[0] ? versions[0] : null;
let versionStr = version ? version.str : ''; let versionStr = version ? version.str : '';

View File

@ -0,0 +1,17 @@
<div class="container">
<div class="content" [ngClass]="{'success': cssClass == 'success', 'warning': cssClass == 'warning', 'danger': cssClass == 'danger'}">
<div class="body">
<img class="body-img" *ngIf="cssClass == 'success'" src="assets/img/onboarding-success.svg">
<img class="body-img" *ngIf="cssClass != 'success'" src="assets/img/icon-important.svg">
<div class="body-text">
{{finishText}}
</div>
<div class="body-comment">
{{finishComment}}
</div>
</div>
</div>
<div class="footer" (click)="close()">
OK
</div>
</div>

View File

@ -1,6 +1,5 @@
page-success{ page-finish{
.container { .container {
background-color: #11D1A6;
height: 100%; height: 100%;
position: relative; position: relative;
.content { .content {
@ -8,7 +7,7 @@ page-success{
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
.success { .body {
margin-top: -20vh; margin-top: -20vh;
text-align: center; text-align: center;
&-img { &-img {
@ -41,4 +40,13 @@ page-success{
cursor: pointer; cursor: pointer;
} }
} }
.success {
background-color: #11D1A6;
}
.warning {
background-color: color($colors, warning);
}
.danger {
background-color: color($colors, danger);
}
} }

View File

@ -0,0 +1,28 @@
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { NavParams, ViewController } from 'ionic-angular';
@Component({
selector: 'page-finish',
templateUrl: 'finish.html',
})
export class FinishModalPage {
public finishText: string;
public finishComment: string;
public cssClass: string; // success, warning, danger
constructor(
private viewCtrl: ViewController,
private navParams: NavParams,
private translate: TranslateService
) {
this.finishText = (this.navParams.data.finishText || this.navParams.data.finishText == '') ? this.navParams.data.finishText : this.translate.instant('Payment Sent');
this.finishComment = this.navParams.data.finishComment ? this.navParams.data.finishComment : '';
this.cssClass = this.navParams.data.cssClass ? this.navParams.data.cssClass : 'success';
}
public close(): void {
this.viewCtrl.dismiss();
}
}

View File

@ -7,20 +7,15 @@
</ion-header> </ion-header>
<ion-content> <ion-content>
<div text-center *ngIf="fetchingNotifications"> <ion-list *ngIf="notifications && notifications[0]">
<ion-spinner></ion-spinner>
<span translate>Updating... Please stand by</span>
</div>
<ion-list *ngIf="notifications && notifications[0] && !fetchingNotifications">
<span *ngFor="let notification of notifications" (click)="openNotificationModal(notification)"> <span *ngFor="let notification of notifications" (click)="openNotificationModal(notification)">
<page-wallet-activity [notification]="notification"></page-wallet-activity> <page-wallet-activity [notification]="notification"></page-wallet-activity>
</span> </span>
</ion-list> </ion-list>
<ion-list *ngIf="notifications && !notifications[0] && !fetchingNotifications"> <ion-list *ngIf="notifications && !notifications[0]">
<ion-item text-center> <ion-item text-center>
<span translate>No pending proposals</span> <span translate>No pending proposals</span>
</ion-item> </ion-item>
</ion-list> </ion-list>
</ion-content> </ion-content>

View File

@ -1,17 +1,17 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { Logger } from '../../../providers/logger/logger';
import { ModalController, NavController } from 'ionic-angular';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { ModalController, NavController } from 'ionic-angular';
import { Logger } from '../../../providers/logger/logger';
//providers // providers
import { ProfileProvider } from '../../../providers/profile/profile';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process'; import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process';
import { WalletProvider } from '../../../providers/wallet/wallet';
import { PopupProvider } from '../../../providers/popup/popup'; import { PopupProvider } from '../../../providers/popup/popup';
import { ProfileProvider } from '../../../providers/profile/profile';
import { WalletProvider } from '../../../providers/wallet/wallet';
//pages // pages
import { TxpDetailsPage } from '../../txp-details/txp-details';
import { TxDetailsPage } from '../../tx-details/tx-details'; import { TxDetailsPage } from '../../tx-details/tx-details';
import { TxpDetailsPage } from '../../txp-details/txp-details';
import * as _ from 'lodash'; import * as _ from 'lodash';
@ -21,7 +21,6 @@ import * as _ from 'lodash';
}) })
export class ActivityPage { export class ActivityPage {
public fetchingNotifications: boolean;
public addressbook: any; public addressbook: any;
public txps: any; public txps: any;
public notifications: any; public notifications: any;
@ -36,12 +35,13 @@ export class ActivityPage {
private popupProvider: PopupProvider, private popupProvider: PopupProvider,
private translate: TranslateService private translate: TranslateService
) { ) {
this.fetchingNotifications = true;
} }
ionViewDidEnter() { ionViewWillEnter() {
let loading = this.translate.instant('Updating... Please stand by');
this.onGoingProcessProvider.set(loading, true);
this.profileProvider.getNotifications(50).then((nData: any) => { this.profileProvider.getNotifications(50).then((nData: any) => {
this.fetchingNotifications = false; this.onGoingProcessProvider.set(loading, false);
this.notifications = nData.notifications; this.notifications = nData.notifications;
this.profileProvider.getTxps({}).then((txpsData: any) => { this.profileProvider.getTxps({}).then((txpsData: any) => {
this.txps = txpsData.txps; this.txps = txpsData.txps;
@ -82,4 +82,4 @@ export class ActivityPage {
} }
} }
}; };
} }

View File

@ -61,25 +61,21 @@
</ion-card> </ion-card>
<ion-list *ngIf="txps && txps[0]"> <ion-list *ngIf="txps && txps[0]">
<ion-item-divider> <ion-item-divider padding-top>
<div item-start> <div item-start>
<span translate>Payment Proposals</span> <span translate>Payment Proposals</span>
</div> </div>
<button ion-button item-end (click)="openProposalsPage()" *ngIf="txpsN>3"> <ion-badge item-end (click)="openProposalsPage()" *ngIf="txpsN>3">{{txpsN}}</ion-badge>
<ion-badge>{{txpsN}}</ion-badge>
</button>
</ion-item-divider> </ion-item-divider>
<page-txp *ngFor="let txp of txps" [tx]="txp" [addressbook]="addressbook"></page-txp> <page-txp *ngFor="let txp of txps" [tx]="txp" [addressbook]="addressbook"></page-txp>
</ion-list> </ion-list>
<ion-list *ngIf="notifications && notifications[0] && recentTransactionsEnabled"> <ion-list *ngIf="notifications && notifications[0] && recentTransactionsEnabled">
<ion-item-divider> <ion-item-divider padding-top>
<div item-start> <div item-start>
<span translate>Recent Transactions</span> <span translate>Recent Transactions</span>
</div> </div>
<button ion-button item-end (click)="openActivityPage()" *ngIf="notificationsN>3"> <ion-badge item-end (click)="openActivityPage()" *ngIf="notificationsN>3">{{notificationsN}}</ion-badge>
<ion-badge>{{notificationsN}}</ion-badge>
</button>
</ion-item-divider> </ion-item-divider>
<span *ngFor="let notification of notifications" (click)="openNotificationModal(notification)"> <span *ngFor="let notification of notifications" (click)="openNotificationModal(notification)">
@ -101,12 +97,12 @@
<span translate>Bitcoin Wallets</span> <span translate>Bitcoin Wallets</span>
</div> </div>
<div item-end *ngIf="!showReorderBtc"> <div item-end *ngIf="!showReorderBtc">
<button ion-button clear icon-only color="secondary" (click)="reorderBtc()" *ngIf="walletsBtc.length > 1"> <button ion-button clear icon-only color="grey" (click)="goToAddView()">
<ion-icon name="reorder"></ion-icon>
</button>
<button ion-button clear icon-only color="primary" (click)="goToAddView()">
<ion-icon name="add"></ion-icon> <ion-icon name="add"></ion-icon>
</button> </button>
<button ion-button clear icon-only color="grey" (click)="reorderBtc()" *ngIf="walletsBtc.length > 1">
<ion-icon name="reorder"></ion-icon>
</button>
</div> </div>
<div item-end *ngIf="showReorderBtc"> <div item-end *ngIf="showReorderBtc">
<button ion-button clear color="secondary" (click)="reorderBtc()"> <button ion-button clear color="secondary" (click)="reorderBtc()">
@ -123,8 +119,8 @@
<img *ngIf="wallet.network != 'testnet'" [ngStyle]="{'background-color': wallet.color}" src="assets/img/icon-wallet.svg" <img *ngIf="wallet.network != 'testnet'" [ngStyle]="{'background-color': wallet.color}" src="assets/img/icon-wallet.svg"
class="icon-wallet" /> class="icon-wallet" />
</ion-icon> </ion-icon>
<h2>{{wallet.credentials.walletName}}</h2> <div class="item-title">{{wallet.credentials.walletName}}</div>
<p> <div class="item-subtitle">
<span *ngIf="!wallet.isComplete()" translate> <span *ngIf="!wallet.isComplete()" translate>
Incomplete Incomplete
</span> </span>
@ -138,10 +134,10 @@
<span *ngIf="wallet.balanceHidden && !wallet.scanning">[{{'Balance Hidden' | translate}}]</span> <span *ngIf="wallet.balanceHidden && !wallet.scanning">[{{'Balance Hidden' | translate}}]</span>
<span *ngIf="wallet.credentials.m > 1">{{wallet.credentials.m}}-of-{{wallet.credentials.n}}</span> <span *ngIf="wallet.credentials.m > 1">{{wallet.credentials.m}}-of-{{wallet.credentials.n}}</span>
<ion-icon *ngIf="!wallet.balanceHidden && wallet.status && (wallet.status.totalBalanceSat != wallet.status.spendableAmount)" <ion-icon *ngIf="!wallet.balanceHidden && wallet.status && (wallet.status.totalBalanceSat != wallet.status.spendableAmount)"
name="timer"></ion-icon> ios="ios-timer-outline" md="md-timer"></ion-icon>
<span *ngIf="wallet.error" class="error">{{wallet.error}}</span> <span *ngIf="wallet.error" class="error">{{wallet.error}}</span>
</span> </span>
</p> </div>
</button> </button>
</ion-list> </ion-list>
</div> </div>
@ -153,12 +149,12 @@
<span translate>Bitcoin Cash Wallets</span> <span translate>Bitcoin Cash Wallets</span>
</div> </div>
<div item-end *ngIf="!showReorderBch"> <div item-end *ngIf="!showReorderBch">
<button ion-button clear icon-only color="secondary" (click)="reorderBch()" *ngIf="walletsBch.length > 1"> <button ion-button clear icon-only color="grey" (click)="goToAddView('bch')">
<ion-icon name="reorder"></ion-icon>
</button>
<button ion-button clear icon-only color="primary" (click)="goToAddView('bch')">
<ion-icon name="add"></ion-icon> <ion-icon name="add"></ion-icon>
</button> </button>
<button ion-button clear icon-only color="grey" (click)="reorderBch()" *ngIf="walletsBch.length > 1">
<ion-icon name="reorder"></ion-icon>
</button>
</div> </div>
<div item-end *ngIf="showReorderBch"> <div item-end *ngIf="showReorderBch">
<button ion-button clear color="secondary" (click)="reorderBch()"> <button ion-button clear color="secondary" (click)="reorderBch()">
@ -175,8 +171,8 @@
<img *ngIf="wallet.network != 'testnet'" [ngStyle]="{'background-color': wallet.color}" src="assets/img/icon-wallet.svg" <img *ngIf="wallet.network != 'testnet'" [ngStyle]="{'background-color': wallet.color}" src="assets/img/icon-wallet.svg"
class="icon-wallet" /> class="icon-wallet" />
</ion-icon> </ion-icon>
<h2>{{wallet.credentials.walletName}}</h2> <div class="item-title">{{wallet.credentials.walletName}}</div>
<p> <div class="item-subtitle">
<span *ngIf="!wallet.isComplete()" translate> <span *ngIf="!wallet.isComplete()" translate>
Incomplete Incomplete
</span> </span>
@ -193,7 +189,29 @@
name="timer"></ion-icon> name="timer"></ion-icon>
<span *ngIf="wallet.error" class="error">{{wallet.error}}</span> <span *ngIf="wallet.error" class="error">{{wallet.error}}</span>
</span> </span>
</p> </div>
</button>
</ion-list>
</div>
<div *ngIf="bitpayCardItems && bitpayCardItems[0]">
<ion-item-divider>
<div class="title" item-start>
<span translate>BitPay Visa<sup>&reg;</sup> Card</span>
</div>
<div item-end>
<button ion-button clear icon-only color="grey" (click)="goTo('BitPayCardIntroPage')">
<ion-icon name="add"></ion-icon>
</button>
</div>
</ion-item-divider>
<ion-list>
<button ion-item *ngFor="let card of bitpayCardItems" (click)="goToCard(card.id)">
<ion-icon item-start>
<img src="assets/img/icon-card.svg" class="icon-card" />
</ion-icon>
<div class="item-title">BitPay Visa&reg; Card ({{card.lastFourDigits}})</div>
<div class="item-subtitle">{{card.balance ? (card.balance | currency:card.currencySymbol:2) : 'Add funds to get started'|translate}} {{card.updatedOn ? (' &middot; ' + (card.updatedOn * 1000 | amTimeAgo)) : ''}}</div>
</button> </button>
</ion-list> </ion-list>
</div> </div>

View File

@ -1,39 +1,41 @@
import { Component } from '@angular/core'; import { Component, NgZone } from '@angular/core';
import { NavController, Events, ModalController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Events, ModalController, NavController } from 'ionic-angular';
import { Logger } from '../../providers/logger/logger';
// Pages // Pages
import { ActivityPage } from './activity/activity';
import { AddPage } from "../add/add"; import { AddPage } from "../add/add";
import { AmazonPage } from '../integrations/amazon/amazon';
import { CopayersPage } from '../add/copayers/copayers'; import { CopayersPage } from '../add/copayers/copayers';
import { GlideraPage } from '../integrations/glidera/glidera'; import { AmazonPage } from '../integrations/amazon/amazon';
import { BitPayCardPage } from '../integrations/bitpay-card/bitpay-card';
import { BitPayCardIntroPage } from '../integrations/bitpay-card/bitpay-card-intro/bitpay-card-intro';
import { CoinbasePage } from '../integrations/coinbase/coinbase'; import { CoinbasePage } from '../integrations/coinbase/coinbase';
import { GlideraPage } from '../integrations/glidera/glidera';
import { MercadoLibrePage } from '../integrations/mercado-libre/mercado-libre'; import { MercadoLibrePage } from '../integrations/mercado-libre/mercado-libre';
import { ProposalsPage } from './proposals/proposals';
import { ShapeshiftPage } from '../integrations/shapeshift/shapeshift'; import { ShapeshiftPage } from '../integrations/shapeshift/shapeshift';
import { TxDetailsPage } from '../tx-details/tx-details'; import { TxDetailsPage } from '../tx-details/tx-details';
import { TxpDetailsPage } from '../txp-details/txp-details'; import { TxpDetailsPage } from '../txp-details/txp-details';
import { WalletDetailsPage } from '../wallet-details/wallet-details'; import { WalletDetailsPage } from '../wallet-details/wallet-details';
import { BitPayCardIntroPage } from '../integrations/bitpay-card/bitpay-card-intro/bitpay-card-intro'; import { ActivityPage } from './activity/activity';
import { ProposalsPage } from './proposals/proposals';
// Providers // Providers
import { BwcErrorProvider } from '../../providers/bwc-error/bwc-error';
import { ProfileProvider } from '../../providers/profile/profile';
import { ReleaseProvider } from '../../providers/release/release';
import { WalletProvider } from '../../providers/wallet/wallet';
import { ConfigProvider } from '../../providers/config/config';
import { PushNotificationsProvider } from '../../providers/push-notifications/push-notifications';
import { ExternalLinkProvider } from '../../providers/external-link/external-link';
import { OnGoingProcessProvider } from '../../providers/on-going-process/on-going-process';
import { PopupProvider } from '../../providers/popup/popup';
import { AddressBookProvider } from '../../providers/address-book/address-book'; import { AddressBookProvider } from '../../providers/address-book/address-book';
import { AppProvider } from '../../providers/app/app'; import { AppProvider } from '../../providers/app/app';
import { PlatformProvider } from '../../providers/platform/platform'; import { BitPayCardProvider } from '../../providers/bitpay-card/bitpay-card';
import { HomeIntegrationsProvider } from '../../providers/home-integrations/home-integrations'; import { BwcErrorProvider } from '../../providers/bwc-error/bwc-error';
import { PersistenceProvider } from '../../providers/persistence/persistence'; import { ConfigProvider } from '../../providers/config/config';
import { ExternalLinkProvider } from '../../providers/external-link/external-link';
import { FeedbackProvider } from '../../providers/feedback/feedback'; import { FeedbackProvider } from '../../providers/feedback/feedback';
import { HomeIntegrationsProvider } from '../../providers/home-integrations/home-integrations';
import { OnGoingProcessProvider } from '../../providers/on-going-process/on-going-process';
import { PersistenceProvider } from '../../providers/persistence/persistence';
import { PlatformProvider } from '../../providers/platform/platform';
import { PopupProvider } from '../../providers/popup/popup';
import { ProfileProvider } from '../../providers/profile/profile';
import { PushNotificationsProvider } from '../../providers/push-notifications/push-notifications';
import { ReleaseProvider } from '../../providers/release/release';
import { WalletProvider } from '../../providers/wallet/wallet';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as moment from 'moment'; import * as moment from 'moment';
@ -57,7 +59,8 @@ export class HomePage {
public addressbook: any; public addressbook: any;
public newRelease: boolean; public newRelease: boolean;
public updateText: string; public updateText: string;
public homeIntegrations: Array<any>; public homeIntegrations: any[];
public bitpayCardItems: any;
public showRateCard: boolean; public showRateCard: boolean;
public homeTip: boolean; public homeTip: boolean;
@ -67,6 +70,8 @@ export class HomePage {
private isNW: boolean; private isNW: boolean;
private isWindowsPhoneApp: boolean; private isWindowsPhoneApp: boolean;
private updatingWalletId: object;
private zone: any;
constructor( constructor(
private navCtrl: NavController, private navCtrl: NavController,
@ -88,52 +93,55 @@ export class HomePage {
private homeIntegrationsProvider: HomeIntegrationsProvider, private homeIntegrationsProvider: HomeIntegrationsProvider,
private persistenceProvider: PersistenceProvider, private persistenceProvider: PersistenceProvider,
private feedbackProvider: FeedbackProvider, private feedbackProvider: FeedbackProvider,
private bitPayCardProvider: BitPayCardProvider,
private translate: TranslateService private translate: TranslateService
) { ) {
this.updatingWalletId = {};
this.cachedBalanceUpdateOn = ''; this.cachedBalanceUpdateOn = '';
this.isNW = this.platformProvider.isNW; this.isNW = this.platformProvider.isNW;
this.isWindowsPhoneApp = this.platformProvider.isWP; this.isWindowsPhoneApp = this.platformProvider.isWP;
this.showReorderBtc = false; this.showReorderBtc = false;
this.showReorderBch = false; this.showReorderBch = false;
this.zone = new NgZone({ enableLongStackTrace: false });
} }
ionViewWillEnter() { ionViewWillEnter() {
this.config = this.configProvider.get(); this.config = this.configProvider.get();
this.wallets = this.profileProvider.getWallets(); this.pushNotificationsProvider.init();
this.walletsBtc = this.profileProvider.getWallets({ coin: 'btc' }); this.homeIntegrations = this.homeIntegrationsProvider.get();
this.walletsBch = this.profileProvider.getWallets({ coin: 'bch' }); this.showIntegration = this.config.showIntegration;
this.homeIntegrations.forEach((integration: any) => {
integration.show = this.showIntegration[integration.name];
});
this.homeIntegrations = _.filter(this.homeIntegrations, (homeIntegrations) => {
return homeIntegrations.show == true;
});
// Update Tx Notifications
this.recentTransactionsEnabled = this.config.recentTransactions.enabled; this.recentTransactionsEnabled = this.config.recentTransactions.enabled;
if (this.recentTransactionsEnabled) this.getNotifications(); if (this.recentTransactionsEnabled) this.getNotifications();
this.pushNotificationsProvider.init(); // BWS Events: Update Status per Wallet
if (this.config.showIntegrations.enabled) { // NewBlock, NewCopayer, NewAddress, NewTxProposal, TxProposalAcceptedBy, TxProposalRejectedBy, txProposalFinallyRejected,
this.homeIntegrations = this.homeIntegrationsProvider.get(); // txProposalFinallyAccepted, TxProposalRemoved, NewIncomingTx, NewOutgoingTx
this.showIntegration = this.config.showIntegration; this.events.subscribe('bwsEvent', (walletId: string) => {
this.homeIntegrations.forEach((integration: any) => { if (this.recentTransactionsEnabled) this.getNotifications();
integration.show = this.showIntegration[integration.name]; this.updateWallet(walletId);
}); });
this.homeIntegrations = _.filter(this.homeIntegrations, (homeIntegrations) => {
return homeIntegrations.show == true;
});
} else {
this.homeIntegrations = null;
}
this.events.subscribe('bwsEvent', (walletId, type, n) => { // Create, Join, Import and Delete -> Get Wallets -> Update Status for All Wallets
let wallet = this.profileProvider.getWallet(walletId); this.events.subscribe('status:updated', () => {
this.updateWallet(wallet); this.setWallets();
if (this.recentTransactionsEnabled) this.getNotifications();
});
this.events.subscribe('Local/TxAction', (walletId) => {
this.logger.debug('Got action for wallet ' + walletId);
var wallet = this.profileProvider.getWallet(walletId);
this.updateWallet(wallet);
if (this.recentTransactionsEnabled) this.getNotifications();
}); });
// Hide stars to rate
this.events.subscribe('feedback:hide', () => { this.events.subscribe('feedback:hide', () => {
this.showRateCard = false; this.showRateCard = false;
}); });
this.bitPayCardProvider.get({}, (err, cards) => {
this.bitpayCardItems = cards;
});
} }
ionViewDidEnter() { ionViewDidEnter() {
@ -149,16 +157,33 @@ export class HomePage {
} }
ionViewWillLeave() { ionViewWillLeave() {
this.events.unsubscribe('bwsEvent');
this.events.unsubscribe('Local/TxAction');
this.events.unsubscribe('feedback:hide'); this.events.unsubscribe('feedback:hide');
} }
ionViewDidLoad() { ionViewDidLoad() {
this.logger.info('ionViewDidLoad HomePage'); this.logger.info('ionViewDidLoad HomePage');
this.updateAllWallets(); this.setWallets();
} }
private startUpdatingWalletId(walletId: string) {
this.updatingWalletId[walletId] = true;
}
private stopUpdatingWalletId(walletId: string) {
setTimeout(() => {
this.updatingWalletId[walletId] = false;
}, 10000);
}
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 { public checkHomeTip(): void {
this.persistenceProvider.getHomeTipAccepted().then((value: string) => { this.persistenceProvider.getHomeTipAccepted().then((value: string) => {
this.homeTip = (value == 'accepted') ? false : true; this.homeTip = (value == 'accepted') ? false : true;
@ -180,7 +205,7 @@ export class HomePage {
this.initFeedBackInfo(); this.initFeedBackInfo();
} else { } else {
let feedbackInfo = info; let feedbackInfo = info;
//Check if current version is greater than saved version // Check if current version is greater than saved version
let currentVersion = this.releaseProvider.getCurrentAppVersion(); let currentVersion = this.releaseProvider.getCurrentAppVersion();
let savedVersion = feedbackInfo.version; let savedVersion = feedbackInfo.version;
let isVersionUpdated = this.feedbackProvider.isVersionUpdated(currentVersion, savedVersion); let isVersionUpdated = this.feedbackProvider.isVersionUpdated(currentVersion, savedVersion);
@ -204,38 +229,50 @@ export class HomePage {
this.persistenceProvider.setFeedbackInfo(feedbackInfo); this.persistenceProvider.setFeedbackInfo(feedbackInfo);
} }
private updateWallet(wallet: any): void { private updateWallet(walletId: string): void {
this.logger.debug('Updating wallet:' + wallet.name) if (this.updatingWalletId[walletId]) return;
this.startUpdatingWalletId(walletId);
let wallet = this.profileProvider.getWallet(walletId);
this.walletProvider.getStatus(wallet, {}).then((status: any) => { this.walletProvider.getStatus(wallet, {}).then((status: any) => {
wallet.status = status; wallet.status = status;
wallet.error = null;
this.profileProvider.setLastKnownBalance(wallet.id, wallet.status.availableBalanceStr);
this.updateTxps(); this.updateTxps();
this.stopUpdatingWalletId(walletId);
}).catch((err: any) => { }).catch((err: any) => {
this.logger.error(err); this.logger.error(err);
this.stopUpdatingWalletId(walletId);
}); });
} }
private updateTxps(): void { private updateTxps = _.debounce(() => {
this.profileProvider.getTxps({ limit: 3 }).then((data: any) => { this.profileProvider.getTxps({ limit: 3 }).then((data: any) => {
this.txps = data.txps; this.zone.run(() => {
this.txpsN = data.n; this.txps = data.txps;
this.txpsN = data.n;
});
}).catch((err: any) => { }).catch((err: any) => {
this.logger.error(err); this.logger.error(err);
}); });
} }, 5000, {
'leading': true
});
private getNotifications = _.debounce(() => { private getNotifications = _.debounce(() => {
this.profileProvider.getNotifications({ limit: 3 }).then((data: any) => { this.profileProvider.getNotifications({ limit: 3 }).then((data: any) => {
this.notifications = data.notifications; this.zone.run(() => {
this.notificationsN = data.total; this.notifications = data.notifications;
this.notificationsN = data.total;
});
}).catch((err: any) => { }).catch((err: any) => {
this.logger.error(err); this.logger.error(err);
}); });
}, 2000, { }, 5000, {
'leading': true 'leading': true
}); });
private updateAllWallets(): void { private updateAllWallets(): void {
let wallets: Array<any> = []; let wallets: any[] = [];
let foundMessage = false let foundMessage = false
_.each(this.walletsBtc, (wBtc) => { _.each(this.walletsBtc, (wBtc) => {
@ -280,7 +317,7 @@ export class HomePage {
} }
private checkUpdate(): void { private checkUpdate(): void {
//TODO check if new update // TODO check if new update
this.releaseProvider.getLatestAppVersion().toPromise() this.releaseProvider.getLatestAppVersion().toPromise()
.then((version) => { .then((version) => {
this.logger.debug('Current app version:', version); this.logger.debug('Current app version:', version);
@ -302,7 +339,7 @@ export class HomePage {
} }
public goToAddView(coin?: string): void { public goToAddView(coin?: string): void {
this.navCtrl.push(AddPage, { coin: coin }); this.navCtrl.push(AddPage, { coin });
} }
public goToWalletDetails(wallet: any): void { public goToWalletDetails(wallet: any): void {
@ -378,7 +415,7 @@ export class HomePage {
} }
public openTxpModal(tx: any): void { public openTxpModal(tx: any): void {
let modal = this.modalCtrl.create(TxpDetailsPage, { tx: tx }, { showBackdrop: false, enableBackdropDismiss: false }); let modal = this.modalCtrl.create(TxpDetailsPage, { tx }, { showBackdrop: false, enableBackdropDismiss: false });
modal.present(); modal.present();
} }
@ -413,7 +450,12 @@ export class HomePage {
} }
} }
public goToCard(cardId): void {
this.navCtrl.push(BitPayCardPage, { id: cardId });
}
public doRefresh(refresher) { public doRefresh(refresher) {
refresher.pullMin = 90;
this.updateAllWallets(); this.updateAllWallets();
setTimeout(() => { setTimeout(() => {
refresher.complete(); refresher.complete();

View File

@ -7,16 +7,11 @@
</ion-header> </ion-header>
<ion-content> <ion-content>
<div *ngIf="fetchingProposals"> <ion-list *ngIf="txps && txps[0]">
<ion-spinner></ion-spinner>
<span translate>Updating pending proposals. Please stand by</span>
</div>
<ion-list *ngIf="txps && txps[0] && !fetchingProposals">
<page-txp *ngFor="let txp of txps" [tx]="txp" [addressbook]="addressbook"></page-txp> <page-txp *ngFor="let txp of txps" [tx]="txp" [addressbook]="addressbook"></page-txp>
</ion-list> </ion-list>
<ion-list *ngIf="txps && !txps[0] && !fetchingProposals"> <ion-list *ngIf="txps && !txps[0]">
<ion-item> <ion-item>
<span translate>No pending proposals</span> <span translate>No pending proposals</span>
</ion-item> </ion-item>

View File

@ -1,8 +1,10 @@
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { TranslateService } from '@ngx-translate/core';
import { Logger } from '../../../providers/logger/logger'; import { Logger } from '../../../providers/logger/logger';
//providers // providers
import { AddressBookProvider } from '../../../providers/address-book/address-book'; import { AddressBookProvider } from '../../../providers/address-book/address-book';
import { OnGoingProcessProvider } from '../../../providers/on-going-process/on-going-process';
import { ProfileProvider } from '../../../providers/profile/profile'; import { ProfileProvider } from '../../../providers/profile/profile';
@Component({ @Component({
@ -11,27 +13,29 @@ import { ProfileProvider } from '../../../providers/profile/profile';
}) })
export class ProposalsPage { export class ProposalsPage {
public fetchingProposals: boolean;
public addressbook: any; public addressbook: any;
public txps: any; public txps: any;
constructor( constructor(
private onGoingProcessProvider: OnGoingProcessProvider,
private addressBookProvider: AddressBookProvider, private addressBookProvider: AddressBookProvider,
private logger: Logger, private logger: Logger,
private profileProvider: ProfileProvider private profileProvider: ProfileProvider,
private translate: TranslateService
) { ) {
this.fetchingProposals = true;
} }
ionViewDidEnter() { ionViewWillEnter() {
this.addressBookProvider.list().then((ab: any) => { this.addressBookProvider.list().then((ab: any) => {
this.addressbook = ab || {}; this.addressbook = ab || {};
let loading = this.translate.instant('Updating pending proposals... Please stand by');
this.onGoingProcessProvider.set(loading, true);
this.profileProvider.getTxps(50).then((txpsData) => { this.profileProvider.getTxps(50).then((txpsData) => {
this.fetchingProposals = false; this.onGoingProcessProvider.set(loading, false);
this.txps = txpsData.txps; this.txps = txpsData.txps;
}).catch((err: any) => { }).catch((err: any) => {
this.fetchingProposals = false; this.onGoingProcessProvider.set(loading, false);
this.logger.error(err); this.logger.error(err);
}); });
}).catch((err: any) => { }).catch((err: any) => {

Some files were not shown because too many files have changed in this diff Show More