diff --git a/Gruntfile.js b/Gruntfile.js index ad4a457a5..1ef8ef2cf 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -69,7 +69,7 @@ module.exports = function(grunt) { tasks: ['concat:css'] }, sass: { - files: ['src/sass/**/*.scss'], + files: ['src/sass/**/**/*.scss'], tasks: ['sass', 'concat:css'] }, main: { diff --git a/app-template/ProjectMakefile b/app-template/ProjectMakefile index 245b891b9..3331e5c33 100644 --- a/app-template/ProjectMakefile +++ b/app-template/ProjectMakefile @@ -16,7 +16,7 @@ plugins: cordova plugin add cordova-plugin-console cordova plugin add cordova-plugin-uniquedeviceid cordova plugin add cordova-plugin-file - cordova plugin add cordova-plugin-touch-id + cordova plugin add cordova-plugin-touch-id cordova prepare cordova plugin add cordova-plugin-transport-security cordova plugin add cordova-ios-requires-fullscreen @@ -26,7 +26,8 @@ plugins: cordova plugin add cordova-plugin-screen-orientation cordova plugin add ionic-plugin-keyboard cordova plugin add cordova-plugin-whitelist - + cordova plugin add https://github.com/driftyco/cordova-plugin-wkwebview-engine.git --save + ios-platform android-platform wp-platform: @@ -40,12 +41,12 @@ android: android-platform plugins cordova plugin add https://github.com/jrontend/phonegap-plugin-barcodescanner cordova plugin add phonegap-plugin-push@1.2.3 -wp: wp-platform plugins +wp: wp-platform plugins cordova plugin add https://github.com/jrontend/phonegap-plugin-barcodescanner build-ios build-android build-wp8: cordova build $(subst build-,,$@) run: - cordova run --device + cordova run --device diff --git a/app-template/config.xml b/app-template/config.xml index 635456255..84952a749 100644 --- a/app-template/config.xml +++ b/app-template/config.xml @@ -21,9 +21,8 @@ - - - + + diff --git a/app-template/copay/appConfig.json b/app-template/copay/appConfig.json index 60afe4b6b..4bc581559 100644 --- a/app-template/copay/appConfig.json +++ b/app-template/copay/appConfig.json @@ -5,6 +5,8 @@ "nameCase": "Copay", "nameCaseNoSpace": "Copay", "bundleName": "copay", + "gitHubRepoName": "copay", + "disclaimerUrl": "https://copay.io/disclaimer", "url": "https://copay.io", "appDescription": "Copay Bitcoin Wallet", "winAppName": "CopayWallet", @@ -18,5 +20,5 @@ "coinbase": true, "glidera": true, "amazon": true - } + } } diff --git a/app-template/package.json b/app-template/package.json index 0d396c2af..3e19f4248 100644 --- a/app-template/package.json +++ b/app-template/package.json @@ -42,7 +42,7 @@ "url": "https://github.com/bitpay/copay/issues" }, "dependencies": { - "bitcore-wallet-client": "4.1.0", + "bitcore-wallet-client": "4.2.0", "coveralls": "^2.11.9", "express": "^4.11.2", "fs": "0.0.2", diff --git a/package.json b/package.json index abfa18eb5..b4086fa2f 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "url": "https://github.com/bitpay/copay/issues" }, "dependencies": { - "bitcore-wallet-client": "4.1.0", + "bitcore-wallet-client": "4.2.0", "coveralls": "^2.11.9", "express": "^4.11.2", "fs": "0.0.2", diff --git a/public/index.html b/public/index.html index cef1fb09e..fe0611bae 100644 --- a/public/index.html +++ b/public/index.html @@ -6,7 +6,6 @@ - {{appConfig.nameCase}} - {{appConfig.description}} diff --git a/public/views/add.html b/public/views/add.html index b41d8bd08..4b24c8da7 100644 --- a/public/views/add.html +++ b/public/views/add.html @@ -10,7 +10,7 @@ - +

Create new wallet

diff --git a/public/views/confirm.html b/public/views/confirm.html index 2d45e16b1..a36da1bc9 100644 --- a/public/views/confirm.html +++ b/public/views/confirm.html @@ -49,7 +49,7 @@ -
diff --git a/public/views/create.html b/public/views/create.html index c379f7d72..49a483906 100644 --- a/public/views/create.html +++ b/public/views/create.html @@ -1,13 +1,22 @@ - - + + + {{'Create new wallet' | translate}} + + + + - - - + +
+
+ Personal Wallet +
+
+ Shared Wallet +
+
- - - - -
+
+
+
diff --git a/public/views/includes/backupWarningPopup.html b/public/views/includes/backupWarningPopup.html index fbe1b79fd..b5cfecee9 100644 --- a/public/views/includes/backupWarningPopup.html +++ b/public/views/includes/backupWarningPopup.html @@ -1,7 +1,7 @@

Screenshots are not secure

if you take a screenshot, your backup may be viewed by others apps. You can make a safe backup with paper and a pen. -
diff --git a/public/views/includes/txp.html b/public/views/includes/txp.html index 0749fd310..183c49f90 100644 --- a/public/views/includes/txp.html +++ b/public/views/includes/txp.html @@ -1,23 +1,31 @@ - - - - {{addressbook[tx.toAddress]}} - - - {{tx.message}} - - - Sending - - - - {{tx.merchant.domain}} - {{tx.merchant.domain}} - - - - {{tx.amountStr}} - -
- {{tx.wallet.name}} · -
+
+ + + {{addressbook[tx.toAddress]}} + + + {{tx.message}} + + + Sending + + + + {{tx.merchant.domain}} + {{tx.merchant.domain}} + + + + +
+ {{tx.amountStr}} +
+ + +

+ + {{tx.wallet.name}} + +

+
diff --git a/public/views/modals/addressbook.html b/public/views/modals/addressbook.html index 77b43b5ef..e6a434a8c 100644 --- a/public/views/modals/addressbook.html +++ b/public/views/modals/addressbook.html @@ -1,13 +1,13 @@ -
Addressbook Add entry
- +
diff --git a/public/views/onboarding/backupWarning.html b/public/views/onboarding/backupWarning.html index 7b5e173af..d3406fb13 100644 --- a/public/views/onboarding/backupWarning.html +++ b/public/views/onboarding/backupWarning.html @@ -1,12 +1,12 @@ - - + + - - +

Are you being watched? @@ -18,7 +18,7 @@

- +

diff --git a/public/views/onboarding/collectEmail.html b/public/views/onboarding/collectEmail.html index ca3afbd94..5145b53e7 100644 --- a/public/views/onboarding/collectEmail.html +++ b/public/views/onboarding/collectEmail.html @@ -1,29 +1,27 @@ - - - - -

- +

Wallet Created

- -
-
-

Where would you like to receive email notifications about payments

+
+
+

Where would you like to receive email notifications about payments

+
+
+ +
+
+ +
-
- -
-
-
+
+ diff --git a/public/views/onboarding/notifications.html b/public/views/onboarding/notifications.html index 555a06d08..d086b1355 100644 --- a/public/views/onboarding/notifications.html +++ b/public/views/onboarding/notifications.html @@ -10,7 +10,7 @@ - +
diff --git a/public/views/onboarding/tour.html b/public/views/onboarding/tour.html index 3524f8231..8df77f256 100644 --- a/public/views/onboarding/tour.html +++ b/public/views/onboarding/tour.html @@ -2,12 +2,12 @@ - - diff --git a/public/views/onboarding/welcome.html b/public/views/onboarding/welcome.html index 05459b33d..1c97d5274 100644 --- a/public/views/onboarding/welcome.html +++ b/public/views/onboarding/welcome.html @@ -3,7 +3,7 @@
- +

diff --git a/public/views/preferences.html b/public/views/preferences.html index 76cbd551a..27f1c2bc5 100644 --- a/public/views/preferences.html +++ b/public/views/preferences.html @@ -6,33 +6,24 @@

-
- Preferences -
+
- Wallet Name + Name - {{alias||wallet.walletName}} + {{wallet.name}}
-
- Wallet Type - - {{wallet.m}}-of-{{wallet.n}} - -
- Hardware wallet + Hardware Wallet {{wallet.externalSource}}
- - Wallet Color - - {{wallet.alias||wallet.walletName}} + Color + + █
@@ -65,9 +56,7 @@ Delete recovery phrase
-
- Advanced -
+
Advanced diff --git a/public/views/preferencesAbout.html b/public/views/preferencesAbout.html index e768ddc8b..1604fe98e 100644 --- a/public/views/preferencesAbout.html +++ b/public/views/preferencesAbout.html @@ -7,36 +7,41 @@ -
- Release information -
-
- - Version - - v{{v.version}} - -
-
- - Commit hash - - #{{v.commitHash}} - -
-
-
-
- - Terms of Use -
-
- - Translators -
-
- - Session log +
+
+ Release information +
+
+ + Version + + v{{version}} + +
+
+ + Commit hash + + #{{commitHash}} + +
+
+
+
+ + Terms of Use + +
+
+ + Translators + +
+
+ + Session log + +
diff --git a/public/views/preferencesAlias.html b/public/views/preferencesAlias.html index 8a8c72d6b..053986d67 100644 --- a/public/views/preferencesAlias.html +++ b/public/views/preferencesAlias.html @@ -6,12 +6,18 @@
- - +
+ +
+
-
Changing wallet alias only affects the local wallet name.
+
Changing wallet alias only affects the local wallet name.
diff --git a/public/views/preferencesBwsUrl.html b/public/views/preferencesBwsUrl.html index 71542f87f..4cb483b88 100644 --- a/public/views/preferencesBwsUrl.html +++ b/public/views/preferencesBwsUrl.html @@ -6,17 +6,15 @@ -
-
- -
-
- -
+
+
- + diff --git a/public/views/preferencesDeleteWallet.html b/public/views/preferencesDeleteWallet.html index c68b8e984..0cc6f099b 100644 --- a/public/views/preferencesDeleteWallet.html +++ b/public/views/preferencesDeleteWallet.html @@ -4,12 +4,14 @@ - -
Warning!
-
Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED
-
- {{alias}}{{walletName}} + +
+

Warning!

+
Permanently delete this wallet. THIS ACTION CANNOT BE REVERSED
+
+ {{alias}}{{walletName}} +
- +
diff --git a/public/views/preferencesEmail.html b/public/views/preferencesEmail.html index 2ac020111..d7a81e90e 100644 --- a/public/views/preferencesEmail.html +++ b/public/views/preferencesEmail.html @@ -6,13 +6,19 @@
- - +
+ +
+
-
Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more. +
Setting up email notifications could weaken your privacy, if the wallet service provider is compromised. Information available to an attacker would include your wallet addresses and its balance, but no more.
diff --git a/public/views/preferencesFee.html b/public/views/preferencesFee.html index 89c2d417e..fb178fbf8 100644 --- a/public/views/preferencesFee.html +++ b/public/views/preferencesFee.html @@ -6,19 +6,17 @@ -
- Loading... -
- {{feeOpts[fee.level]|translate}} + + {{feeOpts[fee.level]|translate}} -
-
- Average confirmation time: {{fee.nbBlocks * 10}} minutes. -
- Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB -
-
- Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy. +
+
+ Average confirmation time: {{fee.nbBlocks * 10}} minutes.
+ Current fee rate for this policy: {{fee.feePerKBUnit}}/kiB +
+
+ Bitcoin transactions may include a fee collected by miners on the network. The higher the fee, the greater the incentive a miner has to include that transaction in a block. Current fees are determined based on network load and the selected policy. +
diff --git a/public/views/preferencesHistory.html b/public/views/preferencesHistory.html index 001ab547a..e2d2d8d55 100644 --- a/public/views/preferencesHistory.html +++ b/public/views/preferencesHistory.html @@ -6,7 +6,7 @@
-
+
Export to file
@@ -15,7 +15,7 @@ preparing...
-
+
Clear cache
diff --git a/public/views/preferencesInformation.html b/public/views/preferencesInformation.html index 7e5ee438e..2fe6298ce 100644 --- a/public/views/preferencesInformation.html +++ b/public/views/preferencesInformation.html @@ -6,9 +6,7 @@
-
- Wallet Information -
+
Wallet Name (at creation) @@ -64,23 +62,23 @@
-
+
Copayers
-
- {{copayer.name}} ({{'Me'|translate}}) - {{copayer.name}} - +
+ {{copayer.name}} + + ({{'Me'|translate}}) +
-
+
Extended Public Keys
- Copayer {{$index}}< - + Copayer {{$index}} Copayer {{$index}} {{pk}} @@ -89,27 +87,27 @@
-
+
Last Wallet Addresses
- {{a.address}} - {{a.path}} · {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }} - + {{a.address}} + {{a.path}} · {{a.createdOn *1000 | amDateFormat:'MMMM Do YYYY, h:mm a' }}
-
+
Only Main (not change) addresses are shown. The addresses on this list were not verified locally at this time.
- + + Send addresses by email + +
-
-
+
+
Balance By Address
diff --git a/public/views/preferencesLanguage.html b/public/views/preferencesLanguage.html index 3adb8a34a..df04e0160 100644 --- a/public/views/preferencesLanguage.html +++ b/public/views/preferencesLanguage.html @@ -8,10 +8,12 @@ {{lang.name}} - All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at - https://crowdin.com/project/copay. - - Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. - +
+ All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at + https://crowdin.com/project/copay. + + Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. + +
diff --git a/public/views/preferencesLogs.html b/public/views/preferencesLogs.html index dcd0add3e..8d2d1311b 100644 --- a/public/views/preferencesLogs.html +++ b/public/views/preferencesLogs.html @@ -4,16 +4,25 @@ - - + -
    -
  • - - {{l.msg}} - -
  • -
diff --git a/public/views/proposals.html b/public/views/proposals.html index 515d8e050..0f3306ddc 100644 --- a/public/views/proposals.html +++ b/public/views/proposals.html @@ -11,7 +11,7 @@
- + diff --git a/public/views/tab-create-personal.html b/public/views/tab-create-personal.html index be899d465..94887a3ba 100644 --- a/public/views/tab-create-personal.html +++ b/public/views/tab-create-personal.html @@ -1,125 +1,88 @@ - - - - - - {{'Create new wallet' | translate}} - +
+
+ - + + Show advanced options + Hide advanced options + - +
+ -
- + - - Show advanced options - Hide advanced options - + -
+
+
+ WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password. +
+
- + - + - + -
-
- WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password. -
-
+ - + + Testnet + + + Single Address Wallet + For audit purposes + - +
+
- - - - - - Testnet - - - - Single Address Wallet - For audit purposes - - -
-
- - - - - -
- -
+ + diff --git a/public/views/tab-create-shared.html b/public/views/tab-create-shared.html index 2d5dc1ccf..a40c1df8b 100644 --- a/public/views/tab-create-shared.html +++ b/public/views/tab-create-shared.html @@ -1,159 +1,119 @@ - - - - - - {{'Create new wallet' | translate}} - +
+
+ - + - + -
- + - + + Show advanced options + Hide advanced options + - +
+ - + - - Show advanced options - Hide advanced options - + -
+
+
+ WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password. +
+
- - - - - - -
-
- WARNING: The password cannot be recovered. Be sure to write it down. The wallet can not be restored without the password. -
-
- - + - + - + - + - - Testnet - + + Testnet + - - Single Address Wallet - For audit purposes - + + Single Address Wallet + For audit purposes + -
-
+
+
- - - - -
- -
+ + diff --git a/public/views/tab-home.html b/public/views/tab-home.html index e22dcf09a..c323373cf 100644 --- a/public/views/tab-home.html +++ b/public/views/tab-home.html @@ -7,20 +7,20 @@
- + Recent Activity @@ -28,7 +28,7 @@
Updating activity. Please stand by
- +
@@ -118,5 +118,9 @@
+

+{{name}} v{{version}} +

+
diff --git a/public/views/tab-settings.html b/public/views/tab-settings.html index d0f99acc0..1b8220bb6 100644 --- a/public/views/tab-settings.html +++ b/public/views/tab-settings.html @@ -6,7 +6,6 @@
-
Address Book @@ -14,36 +13,40 @@
Preferences
-
+
Language {{currentLanguageName|translate}} +
-
+
Unit {{unitName}} +
-
+
Alternative Currency {{selectedAlternative.name}} +
-
- +
+ Bitcoin Network Fee Policy {{feeOpts[currentFeeLevel]|translate}} +
@@ -80,8 +83,8 @@ Use Unconfirmed Funds -
Wallets Settings
-
Wallets Preferences
+
@@ -92,14 +95,15 @@ Incomplete +
-
- - About Bitpay Wallet +
+ + About {{appName}} +
-
diff --git a/public/views/termsOfUse.html b/public/views/termsOfUse.html index 788b1b4b0..7fd05725a 100644 --- a/public/views/termsOfUse.html +++ b/public/views/termsOfUse.html @@ -5,14 +5,14 @@ - -

-

-

- + +
+
+
+
diff --git a/public/views/translators.html b/public/views/translators.html index 7163e1e45..cb865e3eb 100644 --- a/public/views/translators.html +++ b/public/views/translators.html @@ -5,29 +5,29 @@ - -

Translation Credits

-
    -
  • kinoshitajonaJapanese
  • -
  • KirvxFrench
  • -
  • saschadGerman
  • -
  • cmgustavo83Spanish
  • -
  • RussianNeuroMancerRussian
  • -
  • HostFatItalian
  • -
  • xm2hiChinese
  • -
  • Pirx1618Polish
  • -
  • mareksipCzech
  • -
-
-
-

- All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at - https://crowdin.com/project/copay. -

- - Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. - -
+ +
+
+ Translation Credits
+
kinoshitajonaJapanese
+
KirvxFrench
+
saschadGerman
+
cmgustavo83Spanish
+
RussianNeuroMancerRussian
+
HostFatItalian
+
xm2hiChinese
+
Pirx1618Polish
+
mareksipCzech
+
+
+

+ All contributions to Copay's translation are welcome. Sign up at crowdin.com and join the Copay project at + https://crowdin.com/project/copay. +

+ + Don't see your language on Crowdin? Contact the Owner on Crowdin! We'd love to support your language. + +
diff --git a/public/views/walletDetails.html b/public/views/walletDetails.html index 6e586caee..78cd5ce10 100644 --- a/public/views/walletDetails.html +++ b/public/views/walletDetails.html @@ -94,7 +94,7 @@
-
+
{{newRelease}}
diff --git a/src/js/controllers/amazon.js b/src/js/controllers/amazon.js index 353c73600..302bd2a24 100644 --- a/src/js/controllers/amazon.js +++ b/src/js/controllers/amazon.js @@ -1,15 +1,10 @@ 'use strict'; angular.module('copayApp.controllers').controller('amazonController', - function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, nodeWebkit, popupService) { + function($scope, $timeout, $ionicModal, $log, lodash, bwcError, amazonService, platformInfo, externalLinkService, popupService) { $scope.openExternalLink = function(url, target) { - if (platformInfo.isNW) { - nodeWebkit.openExternalLink(url); - } else { - target = target || '_blank'; - var ref = window.open(url, target, 'location=no'); - } + externalLinkService.open(url, target); }; this.init = function() { diff --git a/src/js/controllers/buyAmazon.js b/src/js/controllers/buyAmazon.js index 61409d6ef..b0b2d948d 100644 --- a/src/js/controllers/buyAmazon.js +++ b/src/js/controllers/buyAmazon.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('buyAmazonController', - function($scope, $log, $timeout, $state, lodash, profileService, bwcError, gettextCatalog, configService, walletService, amazonService, ongoingProcess, platformInfo, nodeWebkit, popupService) { + function($scope, $log, $timeout, $state, lodash, profileService, bwcError, gettextCatalog, configService, walletService, amazonService, ongoingProcess, platformInfo, externalLinkService, popupService) { var self = this; var wallet; @@ -16,12 +16,7 @@ angular.module('copayApp.controllers').controller('buyAmazonController', }); $scope.openExternalLink = function(url, target) { - if (platformInfo.isNW) { - nodeWebkit.openExternalLink(url); - } else { - target = target || '_blank'; - var ref = window.open(url, target, 'location=no'); - } + externalLinkService.open(url, target); }; this.init = function() { diff --git a/src/js/controllers/confirm.js b/src/js/controllers/confirm.js index 9fd24fa7a..4c701775c 100644 --- a/src/js/controllers/confirm.js +++ b/src/js/controllers/confirm.js @@ -5,6 +5,17 @@ angular.module('copayApp.controllers').controller('confirmController', function( var cachedTxp = {}; var isChromeApp = platformInfo.isChromeApp; + + $scope.$on('Wallet/Changed', function(event, wallet) { + if (lodash.isEmpty(wallet)) { + $log.debug('No wallet provided'); + return; + } + $log.debug('Wallet changed: ' + wallet.name); + setWallet(wallet, true); + }); + + $scope.showDescriptionPopup = function() { var commentPopup = $ionicPopup.show({ templateUrl: "views/includes/note.html", @@ -17,13 +28,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.commentPopupSave = function(description) { $log.debug('Saving description: ' + description); $scope.description = description; - $scope.txp = null; - - createTx($scope.wallet, function(err, txp) { - if (err) return; - cachedTxp[$scope.wallet.id] = txp; - apply(txp); - }); commentPopup.close(); }; }; @@ -137,15 +141,6 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); }; - $scope.$on('Wallet/Changed', function(event, wallet) { - if (lodash.isEmpty(wallet)) { - $log.debug('No wallet provided'); - return; - } - $log.debug('Wallet changed: ' + wallet.name); - setWallet(wallet, true); - }); - function setWallet(wallet, delayed) { var stop; $scope.wallet = wallet; @@ -165,7 +160,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( apply(cachedTxp[wallet.id]); } else { stop = $timeout(function() { - createTx(wallet, function(err, txp) { + createTx(wallet, true, function(err, txp) { if (err) return; cachedTxp[wallet.id] = txp; apply(txp); @@ -184,7 +179,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.$apply(); }; - var createTx = function(wallet, cb) { + var createTx = function(wallet, dryRun, cb) { var config = configService.getSync().wallet; var currentSpendUnconfirmed = config.spendUnconfirmed; var outputs = []; @@ -227,6 +222,7 @@ angular.module('copayApp.controllers').controller('confirmController', function( txp.payProUrl = paypro; txp.excludeUnconfirmedUtxos = config.spendUnconfirmed ? false : true; txp.feeLevel = config.settings.feeLevel || 'normal'; + txp.dryRun = dryRun; walletService.createTx(wallet, txp, function(err, ctxp) { if (err) { @@ -247,14 +243,10 @@ angular.module('copayApp.controllers').controller('confirmController', function( $scope.approve = function() { var wallet = $scope.wallet; - var txp = $scope.txp; if (!wallet) { return setSendError(gettextCatalog.getString('No wallet selected')); }; - if (!txp) { - return setSendError(gettextCatalog.getString('No transaction')); - }; if (!wallet.canSign() && !wallet.isPrivKeyExternal()) { $log.info('No signing proposal: No private key'); @@ -265,9 +257,14 @@ angular.module('copayApp.controllers').controller('confirmController', function( }); } - walletService.publishAndSign(wallet, txp, function(err, txp) { - if (err) return setSendError(err); - $state.transitionTo('tabs.home'); + ongoingProcess.set('creatingTx', true); + createTx(wallet, false, function(err, txp) { + ongoingProcess.set('creatingTx', false); + if (err) return; + walletService.publishAndSign(wallet, txp, function(err, txp) { + if (err) return setSendError(err); + $state.transitionTo('tabs.home'); + }); }); }; diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js index 1faf089f7..f2b49c79e 100644 --- a/src/js/controllers/create.js +++ b/src/js/controllers/create.js @@ -7,11 +7,6 @@ angular.module('copayApp.controllers').controller('createController', var isCordova = platformInfo.isCordova; var isDevel = platformInfo.isDevel; - var self = this; - var defaults = configService.getDefaults(); - this.isWindowsPhoneApp = platformInfo.isWP && isCordova; - $scope.account = 1; - /* For compressed keys, m*73 + n*34 <= 496 */ var COPAYER_PAIR_LIMITS = { 1: 1, @@ -28,96 +23,91 @@ angular.module('copayApp.controllers').controller('createController', 12: 1, }; - var defaults = configService.getDefaults(); - $scope.bwsurl = defaults.bws.url; - $scope.derivationPath = derivationPathHelper.default; - - // ng-repeat defined number of times instead of repeating over array? - this.getNumber = function(num) { - return new Array(num); - } + $scope.init = function() { + $scope.formData = {}; + var defaults = configService.getDefaults(); + $scope.formData.account = 1; + $scope.formData.bwsurl = defaults.bws.url; + $scope.TCValues = lodash.range(2, defaults.limits.totalCopayers + 1); + $scope.formData.totalCopayers = defaults.wallet.totalCopayers; + $scope.formData.derivationPath = derivationPathHelper.default; + $scope.setTotalCopayers(1); + updateRCSelect(1); + updateSeedSourceSelect(1); + }; $scope.showAdvChange = function() { $ionicScrollDelegate.resize(); }; - var updateRCSelect = function(n) { - $scope.totalCopayers = n; + function updateRCSelect(n) { + $scope.formData.totalCopayers = n; var maxReq = COPAYER_PAIR_LIMITS[n]; - self.RCValues = lodash.range(1, maxReq + 1); - $scope.requiredCopayers = Math.min(parseInt(n / 2 + 1), maxReq); + $scope.RCValues = lodash.range(1, maxReq + 1); + $scope.formData.requiredCopayers = Math.min(parseInt(n / 2 + 1), maxReq); }; - var updateSeedSourceSelect = function(n) { - - self.seedOptions = [{ + function updateSeedSourceSelect(n) { + var seedOptions = [{ id: 'new', label: gettext('Random'), }, { id: 'set', label: gettext('Specify Recovery Phrase...'), }]; - $scope.seedSource = self.seedOptions[0]; + + $scope.seedSource = seedOptions[0]; if (n > 1 && isChromeApp) - self.seedOptions.push({ + seedOptions.push({ id: 'ledger', label: 'Ledger Hardware Wallet', }); if (isChromeApp || isDevel) { - self.seedOptions.push({ + seedOptions.push({ id: 'trezor', label: 'Trezor Hardware Wallet', }); } + $scope.seedOptions = seedOptions; }; - this.TCValues = lodash.range(2, defaults.limits.totalCopayers + 1); - $scope.totalCopayers = defaults.wallet.totalCopayers; - - this.setTotalCopayers = function(tc) { + $scope.setTotalCopayers = function(tc) { + $scope.formData.totalCopayers = tc; updateRCSelect(tc); updateSeedSourceSelect(tc); - self.seedSourceId = $scope.seedSource.id; }; - this.setSeedSource = function(src) { - self.seedSourceId = $scope.seedSource.id; - - $timeout(function() { - $rootScope.$apply(); - }); - }; - - this.create = function(form) { + $scope.create = function(form) { if (form && form.$invalid) { popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Please enter the required fields')); return; } var opts = { - m: $scope.requiredCopayers, - n: $scope.totalCopayers, - name: $scope.walletName, - myName: $scope.totalCopayers > 1 ? $scope.myName : null, - networkName: $scope.testnetEnabled ? 'testnet' : 'livenet', - bwsurl: $scope.bwsurl, - singleAddress: $scope.singleAddressEnabled, - walletPrivKey: $scope._walletPrivKey, // Only for testing + name: $scope.formData.walletName, + m: $scope.formData.requiredCopayers, + n: $scope.formData.totalCopayers, + myName: $scope.formData.totalCopayers > 1 ? $scope.formData.myName : null, + networkName: $scope.formData.testnetEnabled ? 'testnet' : 'livenet', + bwsurl: $scope.formData.bwsurl, + singleAddress: $scope.formData.singleAddressEnabled, + walletPrivKey: $scope.formData._walletPrivKey, // Only for testing }; - var setSeed = self.seedSourceId == 'set'; + + var setSeed = $scope.seedSource.id == 'set'; if (setSeed) { - var words = $scope.privateKey || ''; + var words = $scope.formData.privateKey || ''; if (words.indexOf(' ') == -1 && words.indexOf('prv') == 1 && words.length > 108) { opts.extendedPrivateKey = words; } else { opts.mnemonic = words; } - opts.passphrase = $scope.passphrase; + opts.passphrase = $scope.formData.passphrase; - var pathData = derivationPathHelper.parse($scope.derivationPath); + var pathData = derivationPathHelper.parse($scope.formData.derivationPath); if (!pathData) { popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Invalid derivation path')); return; @@ -128,7 +118,7 @@ angular.module('copayApp.controllers').controller('createController', opts.derivationStrategy = pathData.derivationStrategy; } else { - opts.passphrase = $scope.createPassphrase; + opts.passphrase = $scope.formData.createPassphrase; } if (setSeed && !opts.mnemonic && !opts.extendedPrivateKey) { @@ -136,36 +126,36 @@ angular.module('copayApp.controllers').controller('createController', return; } - if (self.seedSourceId == 'ledger' || self.seedSourceId == 'trezor') { - var account = $scope.account; + if ($scope.seedSource.id == 'ledger' || $scope.seedSource.id == 'trezor') { + var account = $scope.formData.account; if (!account || account < 1) { popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Invalid account number')); return; } - if (self.seedSourceId == 'trezor') + if ($scope.seedSource.id == 'trezor') account = account - 1; opts.account = account; - ongoingProcess.set('connecting' + self.seedSourceId, true); + ongoingProcess.set('connecting' + $scope.seedSource.id, true); - var src = self.seedSourceId == 'ledger' ? ledger : trezor; + var src = $scope.seedSource.id == 'ledger' ? ledger : trezor; src.getInfoForNewWallet(opts.n > 1, account, function(err, lopts) { - ongoingProcess.set('connecting' + self.seedSourceId, false); + ongoingProcess.set('connecting' + $scope.seedSource.id, false); if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err); return; } opts = lodash.assign(lopts, opts); - self._create(opts); + _create(opts); }); } else { - self._create(opts); + _create(opts); } }; - this._create = function(opts) { + function _create(opts) { ongoingProcess.set('creatingWallet', true); $timeout(function() { @@ -182,35 +172,11 @@ angular.module('copayApp.controllers').controller('createController', }); - if (self.seedSourceId == 'set') { + if ($scope.seedSource.id == 'set') { profileService.setBackupFlag(client.credentials.walletId); } $state.go('tabs.home') }); }, 100); } - - this.formFocus = function(what) { - if (!this.isWindowsPhoneApp) return - - if (what && what == 'my-name') { - this.hideWalletName = true; - this.hideTabs = true; - } else if (what && what == 'wallet-name') { - this.hideTabs = true; - } else { - this.hideWalletName = false; - this.hideTabs = false; - } - $timeout(function() { - $rootScope.$digest(); - }, 1); - }; - - $scope.$on("$destroy", function() { - $rootScope.hideWalletNavigation = false; - }); - - updateSeedSourceSelect(1); - self.setSeedSource(); }); diff --git a/src/js/controllers/export.js b/src/js/controllers/export.js index 0a0690e85..1e4d78e47 100644 --- a/src/js/controllers/export.js +++ b/src/js/controllers/export.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('exportController', - function($rootScope, $scope, $timeout, $log, lodash, backupService, walletService, storageService, profileService, platformInfo, gettext, gettextCatalog, $state, $stateParams, popupService) { + function($rootScope, $scope, $timeout, $log, $ionicHistory, lodash, backupService, walletService, storageService, profileService, platformInfo, gettext, gettextCatalog, $state, $stateParams, popupService) { var prevState; var isWP = platformInfo.isWP; var isAndroid = platformInfo.isAndroid; @@ -63,6 +63,7 @@ angular.module('copayApp.controllers').controller('exportController', popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export')); return; } + $ionicHistory.clearHistory(); $state.go('tabs.home'); }); }); diff --git a/src/js/controllers/glidera.js b/src/js/controllers/glidera.js index 8eaac6558..e1703411a 100644 --- a/src/js/controllers/glidera.js +++ b/src/js/controllers/glidera.js @@ -1,15 +1,10 @@ 'use strict'; angular.module('copayApp.controllers').controller('glideraController', - function($scope, $timeout, $ionicModal, $log, storageService, glideraService, ongoingProcess, platformInfo, nodeWebkit, popupService, gettextCatalog) { + function($scope, $timeout, $ionicModal, $log, storageService, glideraService, ongoingProcess, platformInfo, externalLinkService, popupService, gettextCatalog) { $scope.openExternalLink = function(url, target) { - if (platformInfo.isNW) { - nodeWebkit.openExternalLink(url); - } else { - target = target || '_blank'; - var ref = window.open(url, target, 'location=no'); - } + externalLinkService.open(url, target); }; $scope.init = function(accessToken) { diff --git a/src/js/controllers/modals/txDetails.js b/src/js/controllers/modals/txDetails.js index 2db8bb8b1..3de9cda31 100644 --- a/src/js/controllers/modals/txDetails.js +++ b/src/js/controllers/modals/txDetails.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('txDetailsController', function($rootScope, $log, $scope, $filter, $stateParams, $ionicPopup, gettextCatalog, profileService, configService, lodash, txFormatService, platformInfo) { +angular.module('copayApp.controllers').controller('txDetailsController', function($rootScope, $log, $scope, $filter, $stateParams, $ionicPopup, gettextCatalog, profileService, configService, lodash, txFormatService, platformInfo, externalLinkService) { var self = $scope.self; var wallet = profileService.getWallet($stateParams.walletId); @@ -81,12 +81,7 @@ angular.module('copayApp.controllers').controller('txDetailsController', functio }; $scope.openExternalLink = function(url, target) { - if (platformInfo.isNW) { - nodeWebkit.openExternalLink(url); - } else { - target = target || '_blank'; - var ref = window.open(url, target, 'location=no'); - } + externalLinkService.open(url, target); }; $scope.getShortNetworkName = function() { diff --git a/src/js/controllers/modals/txpDetails.js b/src/js/controllers/modals/txpDetails.js index dadc6309e..a9fd5656c 100644 --- a/src/js/controllers/modals/txpDetails.js +++ b/src/js/controllers/modals/txpDetails.js @@ -32,12 +32,9 @@ angular.module('copayApp.controllers').controller('txpDetailsController', functi $scope.sign = function() { $scope.loading = true; walletService.publishAndSign($scope.wallet, $scope.tx, function(err, txp) { - -console.log('[txpDetails.js.35] AFTER publush'); //TODO - $scope.$emit('UpdateTx'); if (err) return setSendError(err); - $scope.close(txp); + $scope.close(); }); }; @@ -53,7 +50,7 @@ console.log('[txpDetails.js.35] AFTER publush'); //TODO if (err) return setError(err, gettextCatalog.getString('Could not reject payment')); - $scope.close(txpr); + $scope.close(); }); @@ -90,7 +87,7 @@ console.log('[txpDetails.js.35] AFTER publush'); //TODO return setError(err, gettextCatalog.getString('Could not broadcast payment')); } - $scope.close(txpb); + $scope.close(); }); }, 10); }; @@ -175,7 +172,7 @@ console.log('[txpDetails.js.35] AFTER publush'); //TODO }); }; - $scope.close = function(txp) { + $scope.close = function() { $scope.loading = null; $scope.txpDetailsModal.hide(); }; diff --git a/src/js/controllers/onboarding/backupRequest.js b/src/js/controllers/onboarding/backupRequest.js index 60ae381f2..8284baafb 100644 --- a/src/js/controllers/onboarding/backupRequest.js +++ b/src/js/controllers/onboarding/backupRequest.js @@ -1,7 +1,8 @@ 'use strict'; -angular.module('copayApp.controllers').controller('backupRequestController', function($scope, $state, $ionicPopup) { +angular.module('copayApp.controllers').controller('backupRequestController', function($scope, $state, $stateParams, $ionicPopup) { + $scope.walletId = $stateParams.walletId; $scope.openPopup = function() { var backupLaterPopup = $ionicPopup.show({ templateUrl: "views/includes/backupLaterPopup.html", diff --git a/src/js/controllers/onboarding/backupWarning.js b/src/js/controllers/onboarding/backupWarning.js index cb4aa4934..b7099ed8a 100644 --- a/src/js/controllers/onboarding/backupWarning.js +++ b/src/js/controllers/onboarding/backupWarning.js @@ -1,7 +1,8 @@ 'use strict'; -angular.module('copayApp.controllers').controller('backupWarningController', function($scope, $state, $ionicPopup, $stateParams, profileService) { +angular.module('copayApp.controllers').controller('backupWarningController', function($scope, $state, $stateParams, $ionicPopup, profileService) { + $scope.walletId = $stateParams.walletId; $scope.openPopup = function() { var backupWarningPopup = $ionicPopup.show({ templateUrl: "views/includes/backupWarningPopup.html", @@ -10,7 +11,7 @@ angular.module('copayApp.controllers').controller('backupWarningController', fun $scope.close = function() { backupWarningPopup.close(); - $state.go('onboarding.backup'); + $state.go('onboarding.backup', {walletId: $stateParams.walletId, fromOnboarding: true}); }; } }); diff --git a/src/js/controllers/onboarding/collectEmail.js b/src/js/controllers/onboarding/collectEmail.js index b5dbfc739..8fcda40f5 100644 --- a/src/js/controllers/onboarding/collectEmail.js +++ b/src/js/controllers/onboarding/collectEmail.js @@ -25,9 +25,13 @@ angular.module('copayApp.controllers').controller('collectEmailController', func if (err) $log.warn(err); configService.set(opts, function(err) { if (err) $log.warn(err); - if (!usePushNotifications) $state.go('onboarding.backupRequest'); - else $state.go('onboarding.notifications'); + if (!usePushNotifications) $state.go('onboarding.backupRequest', {walletId: walletId}); + else $state.go('onboarding.notifications', {walletId: walletId}); }); }); }; + + $scope.onboardingMailSkip = function() { + $state.go('onboarding.backupRequest', {walletId: walletId}); + }; }); diff --git a/src/js/controllers/onboarding/notifications.js b/src/js/controllers/onboarding/notifications.js index 2b40cd65a..7f22581fd 100644 --- a/src/js/controllers/onboarding/notifications.js +++ b/src/js/controllers/onboarding/notifications.js @@ -1,7 +1,8 @@ 'use strict'; -angular.module('copayApp.controllers').controller('notificationsController', function($scope, $state, profileService) { +angular.module('copayApp.controllers').controller('notificationsController', function($scope, $state, $stateParams, profileService) { + $scope.walletId = $stateParams.walletId; $scope.allowNotif = function() { profileService.pushNotificationsInit(); $state.go('onboarding.backupRequest'); diff --git a/src/js/controllers/onboarding/terms.js b/src/js/controllers/onboarding/terms.js index e3f30c321..a76d52b96 100644 --- a/src/js/controllers/onboarding/terms.js +++ b/src/js/controllers/onboarding/terms.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, uxLanguage, profileService) { +angular.module('copayApp.controllers').controller('termsController', function($scope, $log, $state, uxLanguage, profileService, externalLinkService) { $scope.lang = uxLanguage.currentLanguage; $scope.confirm = function() { @@ -12,4 +12,8 @@ angular.module('copayApp.controllers').controller('termsController', function($s }); }; + $scope.openExternalLink = function(url, target) { + externalLinkService.open(url, target); + }; + }); diff --git a/src/js/controllers/paperWallet.js b/src/js/controllers/paperWallet.js index db0d21bca..6393fdc3f 100644 --- a/src/js/controllers/paperWallet.js +++ b/src/js/controllers/paperWallet.js @@ -1,5 +1,5 @@ angular.module('copayApp.controllers').controller('paperWalletController', - function($scope, $timeout, $log, $ionicModal, configService, profileService, $state, addressService, bitcore, ongoingProcess, txFormatService, $stateParams, walletService) { + function($scope, $timeout, $log, $ionicModal, $ionicHistory, configService, profileService, $state, addressService, bitcore, ongoingProcess, txFormatService, $stateParams, walletService) { var wallet = profileService.getWallet($stateParams.walletId); var rawTx; @@ -102,6 +102,7 @@ angular.module('copayApp.controllers').controller('paperWalletController', } else { var type = walletService.getViewStatus(wallet, txp); $scope.openStatusModal(type, txp, function() { + $ionicHistory.clearHistory(); $state.go('tabs.home'); }); } diff --git a/src/js/controllers/paymentUri.js b/src/js/controllers/paymentUri.js index 79628814c..70cf15d51 100644 --- a/src/js/controllers/paymentUri.js +++ b/src/js/controllers/paymentUri.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.controllers').controller('paymentUriController', - function($rootScope, $scope, $stateParams, $location, $timeout, profileService, configService, lodash, bitcore, $state) { + function($rootScope, $scope, $stateParams, $location, $timeout, $ionicHistory, profileService, configService, lodash, bitcore, $state) { function strip(number) { return (parseFloat(number.toPrecision(12))); }; @@ -47,6 +47,7 @@ angular.module('copayApp.controllers').controller('paymentUriController', this.selectWallet = function(wid) { var self = this; profileService.setAndStoreFocus(wid, function() {}); + $ionicHistory.clearHistory(); $state.go('tabs.home'); $timeout(function() { $rootScope.$emit('paymentUri', self.bitcoinURI); diff --git a/src/js/controllers/preferences.js b/src/js/controllers/preferences.js index f66aad999..288ef49f4 100644 --- a/src/js/controllers/preferences.js +++ b/src/js/controllers/preferences.js @@ -2,7 +2,7 @@ angular.module('copayApp.controllers').controller('preferencesController', function($scope, $rootScope, $timeout, $log, $stateParams, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, profileService, fingerprintService, walletService) { - $ionicNavBarDelegate.title(gettextCatalog.getString('Preferences')); + $ionicNavBarDelegate.title(gettextCatalog.getString('Wallet Preferences')); var wallet = profileService.getWallet($stateParams.walletId); var walletId = wallet.credentials.walletId; $scope.wallet = wallet; @@ -14,9 +14,6 @@ angular.module('copayApp.controllers').controller('preferencesController', return $ionicHistory.goBack(); var config = configService.getSync(); - config.aliasFor = config.aliasFor || {}; - $scope.alias = config.aliasFor[walletId] || wallet.credentials.walletName; - $scope.color = config.colorFor[walletId] || '#4A90E2'; $scope.encryptEnabled = walletService.isEncrypted(wallet); if (wallet.isPrivKeyExternal) diff --git a/src/js/controllers/preferencesAbout.js b/src/js/controllers/preferencesAbout.js index d410eec64..55ae224d9 100644 --- a/src/js/controllers/preferencesAbout.js +++ b/src/js/controllers/preferencesAbout.js @@ -1,6 +1,14 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesAbout', - function($ionicNavBarDelegate, gettextCatalog) { - $ionicNavBarDelegate.title(gettextCatalog.getString('About Copay')); + function($scope, $window, $ionicNavBarDelegate, gettextCatalog, externalLinkService) { + $ionicNavBarDelegate.title(gettextCatalog.getString('About') + ' ' + $window.appConfig.nameCase); + + $scope.version = $window.version; + $scope.commitHash = $window.commitHash; + $scope.name = $window.appConfig.gitHubRepoName; + + $scope.openExternalLink = function(url, target) { + externalLinkService.open(url, target); + }; }); diff --git a/src/js/controllers/preferencesAlias.js b/src/js/controllers/preferencesAlias.js index 41557fa80..d51957301 100644 --- a/src/js/controllers/preferencesAlias.js +++ b/src/js/controllers/preferencesAlias.js @@ -8,9 +8,8 @@ angular.module('copayApp.controllers').controller('preferencesAliasController', var walletId = wallet.credentials.walletId; var config = configService.getSync(); - config.aliasFor = config.aliasFor || {}; $scope.walletName = wallet.credentials.walletName; - $scope.alias = config.aliasFor[walletId] || wallet.walletName; + $scope.alias = (config.aliasFor && config.aliasFor[walletId]) || wallet.walletName; $scope.save = function() { var opts = { diff --git a/src/js/controllers/preferencesDelete.js b/src/js/controllers/preferencesDelete.js index c66e2c165..8e95a31c1 100644 --- a/src/js/controllers/preferencesDelete.js +++ b/src/js/controllers/preferencesDelete.js @@ -1,32 +1,17 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesDeleteWalletController', - function($scope, $ionicPopup, $stateParams, $ionicNavBarDelegate, gettextCatalog, lodash, profileService, $state, ongoingProcess, popupService) { - $ionicNavBarDelegate.title(gettextCatalog.getString('Delete Wallet')); + function($scope, $stateParams, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, lodash, profileService, $state, ongoingProcess, popupService) { + $ionicNavBarDelegate.title(gettextCatalog.getString('Delete')); var wallet = profileService.getWallet($stateParams.walletId); $scope.alias = lodash.isEqual(wallet.name, wallet.credentials.walletName) ? null : wallet.name + ' '; $scope.walletName = '[' + wallet.credentials.walletName + ']'; $scope.showDeletePopup = function() { - var popup = $ionicPopup.show({ - template: '' + gettextCatalog.getString('Are you sure you want to delete this wallet?') + '', - title: gettextCatalog.getString('Confirm'), - buttons: [ - { - text: gettextCatalog.getString('Cancel'), - onTap: function(e) { - popup.close(); - } - }, - { - text: gettextCatalog.getString('Accept'), - type: 'button-positive', - onTap: function(e) { - deleteWallet(); - popup.close(); - } - } - ] + var title = gettextCatalog.getString('Warning!'); + var message = gettextCatalog.getString('Are you sure you want to delete this wallet?'); + popupService.showConfirm(title, message, function(res) { + if (res) deleteWallet(); }); }; @@ -37,6 +22,7 @@ angular.module('copayApp.controllers').controller('preferencesDeleteWalletContro if (err) { popupService.showAlert(gettextCatalog.getString('Error'), err.message || err); } else { + $ionicHistory.clearHistory(); $state.go('tabs.home'); } }); diff --git a/src/js/controllers/preferencesFee.js b/src/js/controllers/preferencesFee.js index e254f0411..4fa0c0761 100644 --- a/src/js/controllers/preferencesFee.js +++ b/src/js/controllers/preferencesFee.js @@ -1,12 +1,12 @@ 'use strict'; -angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, feeService) { - $ionicNavBarDelegate.title(gettextCatalog.getString('Preferences fee')); +angular.module('copayApp.controllers').controller('preferencesFeeController', function($scope, $timeout, $ionicHistory, $ionicNavBarDelegate, gettextCatalog, configService, feeService, ongoingProcess) { + $ionicNavBarDelegate.title(gettextCatalog.getString('Bitcoin Network Fee Policy')); $scope.init = function() { - $scope.loading = true; + ongoingProcess.set('gettingFeeLevels', true); feeService.getFeeLevels(function(levels) { - $scope.loading = false; + ongoingProcess.set('gettingFeeLevels', false); $scope.feeOpts = feeService.feeOpts; $scope.currentFeeLevel = feeService.getCurrentFeeLevel(); $scope.feeLevels = levels; @@ -29,7 +29,7 @@ angular.module('copayApp.controllers').controller('preferencesFeeController', fu $ionicHistory.goBack(); $timeout(function() { $scope.$apply(); - }, 10); + }, 100); }); }; }); diff --git a/src/js/controllers/preferencesHistory.js b/src/js/controllers/preferencesHistory.js index 721f3723e..a44f69b36 100644 --- a/src/js/controllers/preferencesHistory.js +++ b/src/js/controllers/preferencesHistory.js @@ -1,17 +1,16 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesHistory', - function($scope, $log, $stateParams, $timeout, $ionicNavBarDelegate, gettextCatalog, storageService, $state, profileService, lodash) { + function($scope, $log, $stateParams, $timeout, $ionicNavBarDelegate, gettextCatalog, storageService, $state, $ionicHistory, profileService, lodash) { $ionicNavBarDelegate.title(gettextCatalog.getString('Transaction History')); - var wallet = profileService.getWallet($stateParams.walletId); - var c = wallet.credentials; + $scope.wallet = profileService.getWallet($stateParams.walletId); $scope.csvReady = false; $scope.csvHistory = function(cb) { var allTxs = []; function getHistory(cb) { - storageService.getTxHistory(c.walletId, function(err, txs) { + storageService.getTxHistory($scope.wallet.id, function(err, txs) { if (err) return cb(err); var txsFromLocal = []; @@ -22,7 +21,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory', } allTxs.push(txsFromLocal); - return cb(null, lodash.flatten(allTxs)); + return cb(null, lodash.compact(lodash.flatten(allTxs))); }); }; @@ -40,7 +39,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory', var data = txs; var satToBtc = 1 / 100000000; $scope.csvContent = []; - $scope.csvFilename = 'Copay-' + ($scope.alias || $scope.walletName) + '.csv'; + $scope.csvFilename = 'Copay-' + $scope.wallet.name + '.csv'; $scope.csvHeader = ['Date', 'Destination', 'Description', 'Amount', 'Currency', 'Txid', 'Creator', 'Copayers', 'Comment']; var _amount, _note, _copayers, _creator, _comment; @@ -118,7 +117,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory', }; $scope.clearTransactionHistory = function() { - storageService.removeTxHistory(c.walletId, function(err) { + storageService.removeTxHistory($scope.wallet.id, function(err) { if (err) { $log.error(err); return; @@ -126,6 +125,7 @@ angular.module('copayApp.controllers').controller('preferencesHistory', $scope.$emit('Local/ClearHistory'); $timeout(function() { + $ionicHistory.clearHistory(); $state.go('tabs.home'); }, 100); }); diff --git a/src/js/controllers/preferencesInformation.js b/src/js/controllers/preferencesInformation.js index 2848d95ce..fd8d9f99c 100644 --- a/src/js/controllers/preferencesInformation.js +++ b/src/js/controllers/preferencesInformation.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesInformation', - function($scope, $log, $timeout, $ionicNavBarDelegate, platformInfo, gettextCatalog, lodash, profileService, configService, $stateParams, walletService, $state) { + function($scope, $log, $timeout, $ionicNavBarDelegate, $ionicHistory, platformInfo, gettextCatalog, lodash, profileService, configService, $stateParams, walletService, $state) { $ionicNavBarDelegate.title(gettextCatalog.getString('Wallet Information')); var base = 'xpub'; var wallet = profileService.getWallet($stateParams.walletId); @@ -105,6 +105,7 @@ angular.module('copayApp.controllers').controller('preferencesInformation', opts.colorFor[walletId] = color; configService.set(opts, function(err) { + $ionicHistory.clearHistory(); $state.go('tabs.home'); if (err) $log.warn(err); }); @@ -116,6 +117,7 @@ angular.module('copayApp.controllers').controller('preferencesInformation', $scope.scan = function() { walletService.startScan(wallet); + $ionicHistory.clearHistory(); $state.go('tabs.home'); }; diff --git a/src/js/controllers/preferencesLanguage.js b/src/js/controllers/preferencesLanguage.js index 0406d3542..5ae3b2588 100644 --- a/src/js/controllers/preferencesLanguage.js +++ b/src/js/controllers/preferencesLanguage.js @@ -1,9 +1,13 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesLanguageController', - function($scope, $log, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, configService, profileService, uxLanguage, walletService) { + function($scope, $log, $ionicNavBarDelegate, $ionicHistory, gettextCatalog, configService, profileService, uxLanguage, walletService, externalLinkService) { $ionicNavBarDelegate.title(gettextCatalog.getString('Language')); + $scope.openExternalLink = function(url, target) { + externalLinkService.open(url, target); + }; + $scope.init = function() { $scope.availableLanguages = uxLanguage.getLanguages(); $scope.currentLanguage = uxLanguage.getCurrentLanguage(); @@ -22,7 +26,7 @@ angular.module('copayApp.controllers').controller('preferencesLanguageController if (err) $log.warn(err); $ionicHistory.goBack(); - uxLanguage.update(function() { + uxLanguage.init(function() { walletService.updateRemotePreferences(profileService.getWallets(), {}, function() { $log.debug('Remote preferences saved'); }); diff --git a/src/js/controllers/preferencesLogs.js b/src/js/controllers/preferencesLogs.js index 153a279aa..6c9a8c16d 100644 --- a/src/js/controllers/preferencesLogs.js +++ b/src/js/controllers/preferencesLogs.js @@ -8,13 +8,19 @@ angular.module('copayApp.controllers').controller('preferencesLogs', $scope.logs = historicLog.get(); } - $scope.sendLogs = function() { - var body = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n'; - body += '\n\n'; - body += $scope.logs.map(function(v) { + $scope.prepare = function() { + var log = 'Copay Session Logs\n Be careful, this could contain sensitive private data\n\n'; + log += '\n\n'; + log += $scope.logs.map(function(v) { return v.msg; }).join('\n'); + return log; + }; + + $scope.sendLogs = function() { + var body = $scope.prepare(); + window.plugins.socialsharing.shareViaEmail( body, 'Copay Logs', diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 20d85c7d6..3abf9f157 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -1,23 +1,30 @@ 'use strict'; angular.module('copayApp.controllers').controller('tabHomeController', - function($rootScope, $timeout, $scope, $state, $ionicScrollDelegate, lodash, profileService, walletService, configService, txFormatService, $ionicModal, $log, platformInfo, storageService, txpModalService) { + function($rootScope, $timeout, $scope, $state, $ionicScrollDelegate, lodash, profileService, walletService, configService, txFormatService, $ionicModal, $log, platformInfo, storageService, txpModalService, $window) { $scope.externalServices = {}; $scope.bitpayCardEnabled = true; // TODO + function updateTxps() { + profileService.getTxps({ + limit: 3 + }, function(err, txps, n) { + if (err) { + console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO + } + $scope.txps = txps; + $scope.txpsN = n; + $ionicScrollDelegate.resize(); - var setPendingTxps = function(txps) { - if (!txps) { - $scope.txps = []; - return; - } - $scope.txps = lodash.sortBy(txps, 'createdOn').reverse(); + $timeout(function() { + $scope.$apply(); + }, 1); + }) }; - $scope.updateAllWallets = function() { $scope.wallets = profileService.getWallets(); if (lodash.isEmpty($scope.wallets)) return; @@ -35,20 +42,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', wallet.status = status; } if (++j==i) { - profileService.getTxps({ - limit: 3 - }, function(err, txps, n) { - if (err) { - console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO - } - $scope.txps = txps; - $scope.txpsN = n; - $ionicScrollDelegate.resize(); - - $timeout(function() { - $scope.$apply(); - }, 1); - }); + updateTxps(); } }); }); @@ -81,29 +75,18 @@ angular.module('copayApp.controllers').controller('tabHomeController', } wallet.status = status; + $scope.fetchingNotifications = true; profileService.getNotifications({ limit: 3 }, function(err, notifications) { + $scope.fetchingNotifications = false; if (err) { console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO return; } $scope.notifications = notifications; - profileService.getTxps({ - limit: 3 - }, function(err, txps, n) { - if (err) { - console.log('[tab-home.js.35:err:]', $log.error(err)); //TODO - } - $scope.txps = txps; - $scope.txpsN = n; - $ionicScrollDelegate.resize(); - - $timeout(function() { - $scope.$apply(); - }, 1); - }) + updateTxps(); }) }); }; @@ -123,6 +106,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.updateWallet(wallet); }), $rootScope.$on('Local/TxAction', function(e, walletId) { + $log.debug('Got action for wallet '+ walletId); var wallet = profileService.getWallet(walletId); $scope.updateWallet(wallet); }), @@ -143,5 +127,9 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.openTxpModal = txpModalService.open; + $scope.version = $window.version; + $scope.name = $window.appConfig.nameCase; + + }); diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index e4edb47d4..e4ce0e833 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabSettingsController', function($scope, $rootScope, $log, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService) { +angular.module('copayApp.controllers').controller('tabSettingsController', function($scope, $rootScope, $log, $ionicModal, $window, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService) { $scope.init = function() { @@ -9,6 +9,8 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct var isWP = platformInfo.isWP; var isIOS = platformInfo.isIOS; + $scope.appName = $window.appConfig.nameCase; + $scope.unitName = config.wallet.settings.unitName; $scope.currentLanguageName = uxLanguage.getCurrentLanguageName(); $scope.selectedAlternative = { @@ -30,9 +32,6 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct $scope.glideraEnabled = config.glidera.enabled; $scope.coinbaseEnabled = config.coinbase.enabled; $scope.pushNotifications = config.pushNotifications.enabled; - if (isCordova && StatusBar.isVisible) { - StatusBar.backgroundColorByHexString("#4B6178"); - } $scope.otherWallets = lodash.filter(profileService.getWallets(self.network), function(w) { return w.id != self.walletId; }); diff --git a/src/js/controllers/termOfUse.js b/src/js/controllers/termOfUse.js index c66f55b8c..7632e187a 100644 --- a/src/js/controllers/termOfUse.js +++ b/src/js/controllers/termOfUse.js @@ -1,7 +1,12 @@ 'use strict'; angular.module('copayApp.controllers').controller('termOfUseController', - function($scope, uxLanguage, $ionicNavBarDelegate, gettextCatalog) { - $ionicNavBarDelegate.title(gettextCatalog.getString('About Copay')); + function($scope, $window, uxLanguage, $ionicNavBarDelegate, gettextCatalog, externalLinkService) { + $ionicNavBarDelegate.title(gettextCatalog.getString('Terms Of Use')); $scope.lang = uxLanguage.currentLanguage; + $scope.disclaimerUrl = $window.appConfig.disclaimerUrl; + + $scope.openExternalLink = function(url, target) { + externalLinkService.open(url, target); + }; }); diff --git a/src/js/controllers/translators.js b/src/js/controllers/translators.js new file mode 100644 index 000000000..7f09f58d5 --- /dev/null +++ b/src/js/controllers/translators.js @@ -0,0 +1,8 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('translatorsController', + function($scope, externalLinkService) { + $scope.openExternalLink = function(url, target) { + externalLinkService.open(url, target); + }; + }); diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js index 349e57bf2..6e8f7b078 100644 --- a/src/js/controllers/walletDetails.js +++ b/src/js/controllers/walletDetails.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup, txpModalService) { +angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, bwcError, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup, txpModalService, externalLinkService) { var isCordova = platformInfo.isCordova; var isWP = platformInfo.isWP; @@ -12,6 +12,9 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun var HISTORY_SHOW_LIMIT = 10; $scope.txps = []; + $scope.openExternalLink = function(url, target) { + externalLinkService.open(url, target); + }; var setPendingTxps = function(txps) { if (!txps) { diff --git a/src/js/directives/copyToClipboard.js b/src/js/directives/copyToClipboard.js index 1e9cbfe92..b6523b6f1 100644 --- a/src/js/directives/copyToClipboard.js +++ b/src/js/directives/copyToClipboard.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.directives') - .directive('copyToClipboard', function(platformInfo, nodeWebkit, gettextCatalog, ionicToast, clipboard) { + .directive('copyToClipboard', function(platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) { return { restrict: 'A', scope: { @@ -22,7 +22,7 @@ angular.module('copayApp.directives') window.cordova.plugins.clipboard.copy(data); window.plugins.toast.showShortCenter(msg); } else if (isNW) { - nodeWebkit.writeToClipboard(data); + nodeWebkitService.writeToClipboard(data); scope.$apply(function() { ionicToast.show(msg, 'bottom', false, 1000); }); diff --git a/src/js/routes.js b/src/js/routes.js index 501d46f26..bde25a606 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -143,14 +143,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr url: '/uri-coinbase/:url', templateUrl: 'views/coinbaseUri.html' }) - .state('activity', { - url: '/activity', - templateUrl: 'views/activity.html' - }) - .state('proposals', { - url: '/proposals', - templateUrl: 'views/proposals.html' - }) /* * @@ -159,17 +151,33 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr */ .state('tabs.details', { - url: '/details/{walletId}/{fromOnboarding}', - views: { - 'tab-home': { - templateUrl: 'views/walletDetails.html' + url: '/details/{walletId}/{fromOnboarding}', + views: { + 'tab-home': { + templateUrl: 'views/walletDetails.html' + } + }, + params: { + txid: null, + txpId: null, + }, + }) + .state('tabs.activity', { + url: '/activity', + views: { + 'tab-home': { + templateUrl: 'views/activity.html', + } } - }, - params: { - txid: null, - txpId: null, - }, - }) + }) + .state('tabs.proposals', { + url: '/proposals', + views: { + 'tab-home': { + templateUrl: 'views/proposals.html', + } + } + }) /* * @@ -254,12 +262,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr url: '/add', views: { 'tab-home': { - templateUrl: 'views/add.html', - controller: function(platformInfo) { - if (platformInfo.isCordova && StatusBar.isVisible) { - StatusBar.backgroundColorByHexString("#4B6178"); - } - } + templateUrl: 'views/add.html' } } }) @@ -306,30 +309,12 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }) .state('tabs.create', { url: '/create', - abstract: true, - templateUrl: 'views/create.html', views: { 'tab-home': { templateUrl: 'views/create.html' }, } }) - .state('tabs.create.personal', { - url: '/tab-create-personal', - views: { - 'tab-create-personal': { - templateUrl: 'views/tab-create-personal.html', - }, - } - }) - .state('tabs.create.shared', { - url: '/tab-create-shared', - views: { - 'tab-create-shared': { - templateUrl: 'views/tab-create-shared.html', - }, - } - }) /* * @@ -565,11 +550,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr .state('onboarding', { url: '/onboarding', abstract: true, - template: '', - params: { - walletId: null, - fromOnboarding: null, - }, + template: '' }) .state('onboarding.welcome', { url: '/welcome', @@ -588,7 +569,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('onboarding.collectEmail', { - url: '/collectEmail', + url: '/collectEmail/:walletId', views: { 'onboarding': { templateUrl: 'views/onboarding/collectEmail.html' @@ -596,7 +577,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('onboarding.notifications', { - url: '/notifications', + url: '/notifications/:walletId', views: { 'onboarding': { templateUrl: 'views/onboarding/notifications.html' @@ -604,7 +585,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('onboarding.backupRequest', { - url: '/backupRequest', + url: '/backupRequest/:walletId', views: { 'onboarding': { templateUrl: 'views/onboarding/backupRequest.html' @@ -612,7 +593,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('onboarding.backupWarning', { - url: '/backupWarning', + url: '/backupWarning/:walletId', views: { 'onboarding': { templateUrl: 'views/onboarding/backupWarning.html' @@ -620,7 +601,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('onboarding.backup', { - url: '/backup', + url: '/backup/:walletId/:fromOnboarding', views: { 'onboarding': { templateUrl: 'views/backup.html' @@ -652,7 +633,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, }, params: { - code: null + code: null, + fromOnboarding: null }, }) .state('onboarding.import.phrase', { @@ -807,74 +789,35 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }) .run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService) { - if (platformInfo.isCordova) { - if (screen.width < 768) { - screen.lockOrientation('portrait'); - } else { - window.addEventListener("orientationchange", function() { - var leftMenuWidth = document.querySelector("ion-side-menu[side='left']").clientWidth; - if (screen.orientation.includes('portrait')) { - // Portrait - document.querySelector("ion-side-menu-content").style.width = (screen.width - leftMenuWidth) + "px"; - } else { - // Landscape - document.querySelector("ion-side-menu-content").style.width = (screen.height - leftMenuWidth) + "px"; - } - }); - } - } else { - if (screen.width >= 768) { - window.addEventListener('resize', lodash.throttle(function() { - $rootScope.$emit('Local/WindowResize'); - }, 100)); - } - } - uxLanguage.init(); openURLService.init(); $ionicPlatform.ready(function() { if (platformInfo.isCordova) { - window.addEventListener('native.keyboardhide', function() { - $timeout(function() { - $rootScope.shouldHideMenuBar = false; //show menu bar when keyboard is hidden with back button action on send screen - }, 100); - }); - - window.addEventListener('native.keyboardshow', function() { - $timeout(function() { - $rootScope.shouldHideMenuBar = true; //hide menu bar when keyboard opens with back button action on send screen - }, 300); - }); - if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); cordova.plugins.Keyboard.disableScroll(true); } - if (window.StatusBar) { - StatusBar.styleLightContent(); - } $ionicPlatform.registerBackButtonAction(function(e) { - var fromDisclaimer = $ionicHistory.currentStateName().match(/disclaimer/) ? 'true' : ''; - var fromTabs = $ionicHistory.currentStateName().match(/tabs/) ? 'true' : ''; + var fromDisclaimer = $ionicHistory.currentStateName().match(/disclaimer/) ? 'true' : ''; + var fromTabs = $ionicHistory.currentStateName().match(/tabs/) ? 'true' : ''; - if ($rootScope.backButtonPressedOnceToExit || fromDisclaimer) { - ionic.Platform.exitApp(); - } else if ($ionicHistory.backView() && !fromTabs) { - $ionicHistory.goBack(); - } else { - $rootScope.backButtonPressedOnceToExit = true; - window.plugins.toast.showShortBottom(gettextCatalog.getString('Press again to exit')); - setInterval(function() { - $rootScope.backButtonPressedOnceToExit = false; - }, 5000); - } - e.preventDefault(); - }, - 101); + if ($rootScope.backButtonPressedOnceToExit || fromDisclaimer) { + ionic.Platform.exitApp(); + } else if ($ionicHistory.backView() && !fromTabs) { + $ionicHistory.goBack(); + } else { + $rootScope.backButtonPressedOnceToExit = true; + window.plugins.toast.showShortBottom(gettextCatalog.getString('Press again to exit')); + setInterval(function() { + $rootScope.backButtonPressedOnceToExit = false; + }, 5000); + } + e.preventDefault(); + }, 101); $ionicPlatform.on('pause', function() { // Nothing to do @@ -890,7 +833,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr setTimeout(function() { navigator.splashscreen.hide(); - }, 1000); + }, 500); } diff --git a/src/js/services/applicationService.js b/src/js/services/applicationService.js index b5e80e4ea..6c7de2954 100644 --- a/src/js/services/applicationService.js +++ b/src/js/services/applicationService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('applicationService', function($rootScope, $timeout, platformInfo, $state) { + .factory('applicationService', function($rootScope, $timeout, $ionicHistory, platformInfo, $state) { var root = {}; var isChromeApp = platformInfo.isChromeApp; @@ -19,6 +19,7 @@ angular.module('copayApp.services') if (isChromeApp) { chrome.runtime.reload(); } else if (isNW) { + $ionicHistory.clearHistory(); $state.go('tabs.home'); $timeout(function() { var win = require('nw.gui').Window.get(); diff --git a/src/js/services/externalLinkService.js b/src/js/services/externalLinkService.js new file mode 100644 index 000000000..aa1951fd6 --- /dev/null +++ b/src/js/services/externalLinkService.js @@ -0,0 +1,14 @@ +'use strict'; + +angular.module('copayApp.services').service('externalLinkService', function(platformInfo, nodeWebkitService) { + + this.open = function(url, target) { + if (platformInfo.isNW) { + nodeWebkitService.openExternalLink(url); + } else { + target = target || '_blank'; + var ref = window.open(url, target, 'location=no'); + } + }; + +}); diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 388d652ca..73e093336 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.services').factory('incomingData', function($log, $ionicModal, $state, bitcore) { +angular.module('copayApp.services').factory('incomingData', function($log, $ionicModal, $state, $window, bitcore) { var root = {}; @@ -63,10 +63,10 @@ angular.module('copayApp.services').factory('incomingData', function($log, $ioni return $state.go('send.amount', {toAddress: data}) - // copay: protocol - } else if (data.indexOf('copay://glidera')==0) { + // Protocol + } else if (data.indexOf($window.appConfig.name + '://glidera')==0) { return $state.go('uriglidera', {url: data}) - } else if (data.indexOf('copay://coinbase')==0) { + } else if (data.indexOf($window.appConfig.name + '://coinbase')==0) { return $state.go('uricoinbase', {url: data}) // Join diff --git a/src/js/services/nodeWebkit.js b/src/js/services/nodeWebkit.js deleted file mode 100644 index c1e13d84b..000000000 --- a/src/js/services/nodeWebkit.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -angular.module('copayApp.services').factory('nodeWebkit', function nodeWebkitFactory() { - var root = {}; - - var isNodeWebkit = function() { - var isNode = (typeof process !== "undefined" && typeof require !== "undefined"); - if(isNode) { - try { - return (typeof require('nw.gui') !== "undefined"); - } catch(e) { - return false; - } - } - }; - - root.readFromClipboard = function() { - if (!isNodeWebkit()) return; - var gui = require('nw.gui'); - var clipboard = gui.Clipboard.get(); - return clipboard.get(); - }; - - root.writeToClipboard = function(text) { - if (!isNodeWebkit()) return; - var gui = require('nw.gui'); - var clipboard = gui.Clipboard.get(); - return clipboard.set(text); - }; - - root.openExternalLink = function(url) { - if (!isNodeWebkit()) return; - var gui = require('nw.gui'); - return gui.Shell.openExternal(url); - }; - - return root; -}); diff --git a/src/js/services/nodeWebkitService.js b/src/js/services/nodeWebkitService.js new file mode 100644 index 000000000..a2b836ca5 --- /dev/null +++ b/src/js/services/nodeWebkitService.js @@ -0,0 +1,22 @@ +'use strict'; + +angular.module('copayApp.services').service('nodeWebkitService', function() { + + this.readFromClipboard = function() { + var gui = require('nw.gui'); + var clipboard = gui.Clipboard.get(); + return clipboard.get(); + }; + + this.writeToClipboard = function(text) { + var gui = require('nw.gui'); + var clipboard = gui.Clipboard.get(); + return clipboard.set(text); + }; + + this.openExternalLink = function(url) { + var gui = require('nw.gui'); + return gui.Shell.openExternal(url); + }; + +}); diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js index 2c433a4af..8f6b3c014 100644 --- a/src/js/services/onGoingProcess.js +++ b/src/js/services/onGoingProcess.js @@ -31,6 +31,7 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti 'sweepingWallet': gettext('Sweeping Wallet...'), 'deletingWallet': gettext('Deleting Wallet...'), 'extractingWalletInfo': gettext('Extracting Wallet Information...'), + 'gettingFeeLevels': gettext('Getting fee levels...'), }; root.clear = function() { diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 8fb2df403..4bd0612b0 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -30,13 +30,12 @@ angular.module('copayApp.services') root.updateWalletSettings = function(wallet) { var defaults = configService.getDefaults(); - var config = configService.getSync(); - - wallet.usingCustomBWS = config.bwsFor && config.bwsFor[wallet.id] && (config.bwsFor[wallet.id] != defaults.bws.url); - - wallet.name = config.aliasFor && (config.aliasFor[wallet.id] || wallet.credentials.walletName); - wallet.color = config.colorFor && (config.colorFor[wallet.id] || '#4A90E2'); - wallet.email = config.emailFor && config.emailFor[wallet.id]; + configService.whenAvailable(function(config){ + wallet.usingCustomBWS = config.bwsFor && config.bwsFor[wallet.id] && (config.bwsFor[wallet.id] != defaults.bws.url); + wallet.name = (config.aliasFor && config.aliasFor[wallet.id]) || wallet.credentials.walletName; + wallet.color = (config.colorFor && config.colorFor[wallet.id]) || '#4A90E2'; + wallet.email = config.emailFor && config.emailFor[wallet.id]; + }); } root.setBackupFlag = function(walletId) { @@ -78,7 +77,7 @@ angular.module('copayApp.services') var opts = opts || {}; var walletId = wallet.credentials.walletId; - if ((root.wallet[walletId] && root.wallet[walletId].started) || opts.force) { + if ((root.wallet[walletId] && root.wallet[walletId].started) && !opts.force) { return false; } @@ -123,7 +122,6 @@ angular.module('copayApp.services') if (wallet.cachedActivity) wallet.cachedActivity.isValid = false; - if (wallet.cachedTxps) wallet.cachedTxps.isValid = false; @@ -908,22 +906,14 @@ angular.module('copayApp.services') var txps = []; - function process(notifications) { - if (!notifications) return []; - - var shown = lodash.sortBy(notifications, 'createdOn').reverse(); - shown = shown.splice(0, opts.limit || MAX); - return shown; - }; - lodash.each(w, function(x) { if (x.pendingTxps) txps = txps.concat(x.pendingTxps); }); - txps = lodash.sortBy(txps, 'createdOn'); + txps = lodash.sortBy(txps, 'pendingForUs', 'createdOn'); txps = lodash.compact(lodash.flatten(txps)).slice(0,MAX); var n = txps.length; - return cb(null, process(txps), n); + return cb(null, txps, n); }; return root; diff --git a/src/js/services/uxLanguage.js b/src/js/services/uxLanguage.js index 0bd7883f0..92f527f73 100644 --- a/src/js/services/uxLanguage.js +++ b/src/js/services/uxLanguage.js @@ -72,7 +72,8 @@ angular.module('copayApp.services') root._set = function(lang) { $log.debug('Setting default language: ' + lang); gettextCatalog.setCurrentLanguage(lang); - root.currentLanguage = lang; + root.currentLanguage = lang; + if (lang == 'zh') lang = lang + '-CN'; // Fix for Chinese Simplified amMoment.changeLocale(lang); }; @@ -95,31 +96,19 @@ angular.module('copayApp.services') return root.availableLanguages; }; - root.init = function() { - root._detect(function(lang) { - root._set(lang); - }); - }; + root.init = function(cb) { + configService.whenAvailable(function(config) { + var userLang = config.wallet.settings.defaultLanguage; - root.update = function(cb) { - var userLang = configService.getSync().wallet.settings.defaultLanguage; - - if (!userLang) { - root._detect(function(lang) { - userLang = lang; - - if (userLang != root.currentLanguage) { - root._set(lang); - } - if (cb) return cb(userLang); - }); - } else { - if (userLang != root.currentLanguage) { + if (userLang && userLang != root.currentLanguage) { root._set(userLang); + } else { + root._detect(function(lang) { + root._set(lang); + }); } - - if (cb) return cb(userLang); - } + if (cb) return cb(); + }); }; root.getName = function(lang) { diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 6293c31c3..f5bf2e45d 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -92,13 +92,17 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim root.invalidateCache = function(wallet) { - if (wallet.cachedStatus) { + if (wallet.cachedStatus) wallet.cachedStatus.isValid = false; - } - if (wallet.completeHistory) { + if (wallet.completeHistory) wallet.completeHistory.isValid = false; - } + + if (wallet.cachedActivity) + wallet.cachedActivity.isValid = false; + + if (wallet.cachedTxps) + wallet.cachedTxps.isValid = false; }; root.getStatus = function(wallet, opts, cb) { @@ -623,6 +627,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim wallet.removeTxProposal(txp, function(err) { $log.debug('Transaction removed'); + + root.invalidateCache(wallet); + $rootScope.$emit('Local/TxAction', wallet.id); + return cb(err); }); }; @@ -852,6 +860,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim askPassword(wallet.name, gettext('Enter Spending Password'), function(password) { if (!password) return cb('no password'); + if (!wallet.checkPassword(password)) return cb('wrong password'); + return cb(null, password); }); @@ -862,8 +872,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim ongoingProcess.set('rejectTx', true); root.rejectTx(wallet, txp, function(err, txpr) { root.invalidateCache(wallet); - ongoingProcess.set('rejectTx', false); + if (err) return cb(err); $rootScope.$emit('Local/TxAction', wallet.id); @@ -933,6 +943,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim var msg = err.message ? err.message : gettext('The payment was created but could not be completed. Please try again from home screen'); + $rootScope.$emit('Local/TxAction', wallet.id); return cb(msg); } @@ -943,18 +954,18 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim ongoingProcess.set('broadcastingTx', false); if (err) return cb('sign error' + err); + $rootScope.$emit('Local/TxAction', wallet.id); var type = root.getViewStatus(wallet, broadcastedTxp); root.openStatusModal(type, broadcastedTxp, function() { - $rootScope.$emit('Local/TxAction', wallet.id); }); return cb(null, broadcastedTxp) }); } else { + $rootScope.$emit('Local/TxAction', wallet.id); + var type = root.getViewStatus(wallet, signedTxp); root.openStatusModal(type, signedTxp, function() { - root.invalidateCache(wallet); - $rootScope.$emit('Local/TxAction', wallet.id); }); return cb(null, signedTxp); } diff --git a/src/sass/views/includes/walletActivity.scss b/src/sass/views/includes/walletActivity.scss index d5f723582..af7ff4c65 100644 --- a/src/sass/views/includes/walletActivity.scss +++ b/src/sass/views/includes/walletActivity.scss @@ -1,5 +1,9 @@ .wallet-activity { + &-not-pending { + background-color:#eee; + } + &-amount { float: right; font-size: 18px; diff --git a/src/sass/views/onboarding/onboard-collect-email.scss b/src/sass/views/onboarding/onboard-collect-email.scss index 427ab466f..ea71241ee 100644 --- a/src/sass/views/onboarding/onboard-collect-email.scss +++ b/src/sass/views/onboarding/onboard-collect-email.scss @@ -1,5 +1,8 @@ #onboarding-collect-email { background: rgb(17, 209, 166); + .scroll { + height: 100%; + } #success-image { margin-top: 4rem; } @@ -11,17 +14,18 @@ opacity: 1; background: #fff; color: rgb(108, 108, 108); - height: 11rem; + height: 13rem; animation-name: topBottom; animation-iteration-count: 1; animation-timing-function: ease-in; animation-duration: 1s; animation-delay: 2s; position: absolute; - bottom: -100%; + bottom: -13rem; animation-fill-mode: forwards; z-index: 5; margin-top: 0; + width: 100%; label { background: rgba(200, 200, 200, 0.20); height: 3rem; diff --git a/src/sass/views/onboarding/onboard-welcome.scss b/src/sass/views/onboarding/onboard-welcome.scss index 8e40facd9..84d206d20 100644 --- a/src/sass/views/onboarding/onboard-welcome.scss +++ b/src/sass/views/onboarding/onboard-welcome.scss @@ -7,7 +7,7 @@ #shopping-24 { content: url("../img/onboarding-welcome-shopping24.png"); position: absolute; - top: 2%; + top: 5%; right: 5%; width: 35px; height: auto; @@ -17,7 +17,7 @@ @include center-block(); } .logo { - margin-top: 15rem; + margin-top: 13rem; } button { @include center-block(1rem); diff --git a/src/sass/views/onboarding/onboarding.scss b/src/sass/views/onboarding/onboarding.scss index 05d7dd4aa..0b50a6580 100644 --- a/src/sass/views/onboarding/onboarding.scss +++ b/src/sass/views/onboarding/onboarding.scss @@ -34,7 +34,7 @@ background-size: contain; width: 100%; clear: both; - height: 20rem; + height: 23rem; margin-bottom: -3rem; background-position: center; background-repeat: no-repeat; diff --git a/src/sass/views/onboarding/terms-of-use.scss b/src/sass/views/onboarding/terms-of-use.scss index 07e9023da..d5ecd8c45 100644 --- a/src/sass/views/onboarding/terms-of-use.scss +++ b/src/sass/views/onboarding/terms-of-use.scss @@ -3,8 +3,8 @@ background: #fff; box-shadow: 0px 3px 3px 0px rgba(50, 50, 50, 0.2); } - ion-content { - margin-top: 1.5rem; + ion-content{ + padding-top: 1.5rem; color: rgba(86, 86, 86, 0.77); p { padding: 0 2.5%;