-
+
Contacts & Wallets
diff --git a/public/views/walletDetails.html b/public/views/walletDetails.html
index 3bd314da6..59d725aa4 100644
--- a/public/views/walletDetails.html
+++ b/public/views/walletDetails.html
@@ -19,6 +19,11 @@
+
+ This wallet is not registered at the given Bitcore Wallet Service (BWS). You can recreate it from the local information.
+
+
+
Scan status finished with error
Tap to retry
diff --git a/src/js/controllers/create.js b/src/js/controllers/create.js
index f2b49c79e..d2bfe37a8 100644
--- a/src/js/controllers/create.js
+++ b/src/js/controllers/create.js
@@ -23,7 +23,7 @@ angular.module('copayApp.controllers').controller('createController',
12: 1,
};
- $scope.init = function() {
+ $scope.init = function(tc) {
$scope.formData = {};
var defaults = configService.getDefaults();
$scope.formData.account = 1;
@@ -31,9 +31,9 @@ angular.module('copayApp.controllers').controller('createController',
$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.setTotalCopayers(tc);
+ updateRCSelect(tc);
+ updateSeedSourceSelect(tc);
};
$scope.showAdvChange = function() {
diff --git a/src/js/controllers/onboarding/disclaimer.js b/src/js/controllers/onboarding/disclaimer.js
index 1cd51cc26..ccb64ed82 100644
--- a/src/js/controllers/onboarding/disclaimer.js
+++ b/src/js/controllers/onboarding/disclaimer.js
@@ -1,6 +1,14 @@
'use strict';
-angular.module('copayApp.controllers').controller('disclaimerController', function($scope, $state, $log, $ionicModal, profileService) {
+angular.module('copayApp.controllers').controller('disclaimerController', function($scope, $timeout, $state, $log, $ionicModal, profileService) {
+
+ $scope.init = function() {
+ $scope.terms = {};
+ $scope.accept1 = $scope.accept2 = $scope.accept3 = false;
+ $timeout(function() {
+ $scope.$apply();
+ }, 1);
+ };
$scope.confirm = function() {
profileService.setDisclaimerAccepted(function(err) {
@@ -11,14 +19,12 @@ angular.module('copayApp.controllers').controller('disclaimerController', functi
});
};
- this.openModal = function() {
-
- $ionicModal.fromTemplateUrl('views/modals/addressbook.html', {
+ $scope.openTermsModal = function() {
+ $ionicModal.fromTemplateUrl('views/modals/terms.html', {
scope: $scope
}).then(function(modal) {
- $scope.addressbookModal = modal;
- $scope.addressbookModal.show();
+ $scope.termsModal = modal;
+ $scope.termsModal.show();
});
};
-
});
diff --git a/src/js/controllers/walletDetails.js b/src/js/controllers/walletDetails.js
index afa0e3223..f9a23f91c 100644
--- a/src/js/controllers/walletDetails.js
+++ b/src/js/controllers/walletDetails.js
@@ -1,6 +1,11 @@
'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, externalLinkService) {
+angular.module('copayApp.controllers').controller('walletDetailsController', function($scope, $rootScope, $interval, $timeout, $filter, $log, $ionicModal, $ionicPopover, $ionicNavBarDelegate, $state, $stateParams, profileService, lodash, configService, gettext, gettextCatalog, platformInfo, walletService, $ionicPopup, txpModalService, externalLinkService) {
+ var isCordova = platformInfo.isCordova;
+ var isWP = platformInfo.isWP;
+ var isAndroid = platformInfo.isAndroid;
+ var isChromeApp = platformInfo.isChromeApp;
+
var HISTORY_SHOW_LIMIT = 10;
var currentTxHistoryPage;
var wallet;
@@ -65,14 +70,19 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
$scope.updateStatus = function(force) {
$scope.updatingStatus = true;
$scope.updateStatusError = false;
+ $scope.walletNotRegistered = false;
walletService.getStatus(wallet, {
force: !!force,
}, function(err, status) {
$scope.updatingStatus = false;
if (err) {
+ if (err === 'WALLET_NOT_REGISTERED') {
+ $scope.walletNotRegistered = true;
+ } else {
+ $scope.updateStatusError = true;
+ }
$scope.status = null;
- $scope.updateStatusError = true;
return;
}
@@ -140,7 +150,15 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
};
$scope.recreate = function() {
- walletService.recreate();
+ walletService.recreate(wallet, function(err) {
+ $scope.init();
+ if (err) return;
+ $timeout(function() {
+ walletService.startScan(wallet, function() {
+ $scope.$apply();
+ });
+ });
+ });
};
$scope.updateTxHistory = function(cb) {
@@ -158,7 +176,6 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
$timeout(function() {
$scope.$apply();
}, 1);
-
};
$timeout(function() {
diff --git a/src/js/routes.js b/src/js/routes.js
index 0f858cc81..e37d8efa2 100644
--- a/src/js/routes.js
+++ b/src/js/routes.js
@@ -282,11 +282,19 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
},
},
})
- .state('tabs.create', {
- url: '/create',
+ .state('tabs.create-personal', {
+ url: '/create-personal',
views: {
'tab-home': {
- templateUrl: 'views/create.html'
+ templateUrl: 'views/tab-create-personal.html'
+ },
+ }
+ })
+ .state('tabs.create-shared', {
+ url: '/create-shared',
+ views: {
+ 'tab-home': {
+ templateUrl: 'views/tab-create-shared.html'
},
}
})
diff --git a/src/js/services/onGoingProcess.js b/src/js/services/onGoingProcess.js
index 8f6b3c014..be1d5ee70 100644
--- a/src/js/services/onGoingProcess.js
+++ b/src/js/services/onGoingProcess.js
@@ -7,31 +7,31 @@ angular.module('copayApp.services').factory('ongoingProcess', function($log, $ti
var ongoingProcess = {};
var processNames = {
- 'scanning': gettext('Scanning Wallet funds...'),
- 'recreating': gettext('Recreating Wallet...'),
- 'generatingCSV': gettext('Generating .csv file...'),
- 'creatingTx': gettext('Creating transaction'),
- 'sendingTx': gettext('Sending transaction'),
- 'signingTx': gettext('Signing transaction'),
'broadcastingTx': gettext('Broadcasting transaction'),
- 'rejectTx': gettext('Rejecting payment proposal'),
- 'removeTx': gettext('Deleting payment proposal'),
- 'fetchingPayPro': gettext('Fetching Payment Information'),
'calculatingFee': gettext('Calculating fee'),
- 'joiningWallet': gettext('Joining Wallet...'),
- 'retrivingInputs': gettext('Retrieving inputs information'),
- 'creatingWallet': gettext('Creating Wallet...'),
- 'validatingWallet': gettext('Validating wallet integrity...'),
- 'connectingledger': gettext('Waiting for Ledger...'),
- 'connectingtrezor': gettext('Waiting for Trezor...'),
- 'validatingWords': gettext('Validating recovery phrase...'),
'connectingCoinbase': gettext('Connecting to Coinbase...'),
'connectingGlidera': gettext('Connecting to Glidera...'),
- 'importingWallet': gettext('Importing Wallet...'),
- 'sweepingWallet': gettext('Sweeping Wallet...'),
+ 'connectingledger': gettext('Waiting for Ledger...'),
+ 'connectingtrezor': gettext('Waiting for Trezor...'),
+ 'creatingTx': gettext('Creating transaction'),
+ 'creatingWallet': gettext('Creating Wallet...'),
'deletingWallet': gettext('Deleting Wallet...'),
'extractingWalletInfo': gettext('Extracting Wallet Information...'),
+ 'fetchingPayPro': gettext('Fetching Payment Information'),
+ 'generatingCSV': gettext('Generating .csv file...'),
'gettingFeeLevels': gettext('Getting fee levels...'),
+ 'importingWallet': gettext('Importing Wallet...'),
+ 'joiningWallet': gettext('Joining Wallet...'),
+ 'recreating': gettext('Recreating Wallet...'),
+ 'rejectTx': gettext('Rejecting payment proposal'),
+ 'removeTx': gettext('Deleting payment proposal'),
+ 'retrivingInputs': gettext('Retrieving inputs information'),
+ 'scanning': gettext('Scanning Wallet funds...'),
+ 'sendingTx': gettext('Sending transaction'),
+ 'signingTx': gettext('Signing transaction'),
+ 'sweepingWallet': gettext('Sweeping Wallet...'),
+ 'validatingWallet': gettext('Validating wallet integrity...'),
+ 'validatingWords': gettext('Validating recovery phrase...'),
};
root.clear = function() {
diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js
index f5bf2e45d..204869c61 100644
--- a/src/js/services/walletService.js
+++ b/src/js/services/walletService.js
@@ -10,6 +10,8 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
root.SOFT_CONFIRMATION_LIMIT = 12;
root.SAFE_CONFIRMATIONS = 6;
+ var errors = bwcService.getErrors();
+
// UI Related
root.openStatusModal = function(type, txp, cb) {
var scope = $rootScope.$new(true);
@@ -175,6 +177,9 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
twoStep: true
}, function(err, ret) {
if (err) {
+ if (err instanceof errors.NOT_AUTHORIZED) {
+ return cb('WALLET_NOT_REGISTERED');
+ }
return cb(bwcError.msg(err, gettext('Could not update Wallet')));
}
return cb(null, ret);
@@ -296,7 +301,6 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
};
var getSavedTxs = function(walletId, cb) {
-
storageService.getTxHistory(walletId, function(err, txs) {
if (err) return cb(err);
@@ -671,41 +675,30 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
});
};
- // walletHome
root.recreate = function(wallet, cb) {
+ $log.debug('Recreating wallet:', wallet.id);
ongoingProcess.set('recreating', true);
wallet.recreateWallet(function(err) {
wallet.notAuthorized = false;
ongoingProcess.set('recreating', false);
-
- if (err) {
- handleError(err);
- return;
- }
- root.startScan(wallet);
-
- // TODO TODO TODO TODO:
- // Do it on the controller
- // profileService.bindWalletClient(wallet, {
- // force: true
- // });
+ return cb(err);
});
};
- root.startScan = function(wallet) {
- $log.debug('Scanning wallet ' + wallet.credentials.walletId);
+ root.startScan = function(wallet, cb) {
+ cb = cb || function() {};
+
+ $log.debug('Scanning wallet ' + wallet.id);
if (!wallet.isComplete()) return;
- // wallet.updating = true;
-
+ wallet.updating = true;
+ ongoingProcess.set('scanning', true);
wallet.startScan({
includeCopayerBranches: true,
}, function(err) {
-
- if (err && wallet.walletId == walletId) {
- wallet.updating = false;
- handleError(err);
- }
+ wallet.updating = false;
+ ongoingProcess.set('scanning', false);
+ return cb(err);
});
};
@@ -861,7 +854,7 @@ 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);
});
@@ -956,8 +949,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
$rootScope.$emit('Local/TxAction', wallet.id);
var type = root.getViewStatus(wallet, broadcastedTxp);
- root.openStatusModal(type, broadcastedTxp, function() {
- });
+ root.openStatusModal(type, broadcastedTxp, function() {});
return cb(null, broadcastedTxp)
});
@@ -965,8 +957,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
$rootScope.$emit('Local/TxAction', wallet.id);
var type = root.getViewStatus(wallet, signedTxp);
- root.openStatusModal(type, signedTxp, function() {
- });
+ root.openStatusModal(type, signedTxp, function() {});
return cb(null, signedTxp);
}
});
diff --git a/src/sass/common.scss b/src/sass/common.scss
index 52d021c1e..502df7d91 100644
--- a/src/sass/common.scss
+++ b/src/sass/common.scss
@@ -21,6 +21,10 @@
padding-left: 74px;
}
+.item-no-bottom-border + .item {
+ border-top: 0;
+}
+
.icon.big-icon-svg {
padding: 0 7px;
> img {
@@ -30,7 +34,7 @@
box-shadow: 0px 6px 12px 0px rgba(0, 0, 0, 0.3);
}
}
-.overlay{
+.overlay {
position: absolute;
top:0;
left:0;
@@ -72,3 +76,7 @@ ion-header-bar{
border:none;
}
}
+
+.border-top{
+ border-top:1px solid rgb(228,228,228);
+}
diff --git a/src/sass/main.scss b/src/sass/main.scss
index 4651a0516..40aea0ae0 100644
--- a/src/sass/main.scss
+++ b/src/sass/main.scss
@@ -772,6 +772,10 @@ ul.wallet-selection.wallets {
margin: 30px 0;
}
+.m15v {
+ margin: 15px 0;
+}
+
.m10h {
margin: 0 10px;
}
@@ -897,44 +901,6 @@ input[type=file] {
font-size: 16px;
}
-/*
- * Calculator
- */
-
-.calculator .header-calc {
- position: absolute;
- width: 100%;
- text-align: center;
-}
-
-.calculator .button-calc {
- position: absolute;
- width: 100%;
- bottom: 0;
-}
-
-.calculator .button-calc .row {
- padding: 0 !important;
-}
-
-.calculator .button-calc .columns {
- cursor: pointer;
- text-align: center;
-}
-
-.calculator .button-calc .operator {
- color: #2C3E50;
- background-color: #eee;
-}
-
-.calculator .button-calc .columns:active {
- background-color: #eee;
-}
-
-.calculator .button-calc .operator:active {
- background-color: #f8f8f8;
-}
-
// No looks likes locked
input[type="number"] {
&[readonly] {
@@ -994,8 +960,12 @@ input[type=number] {
@import "forms";
@import 'mixins/mixins';
@import "views/add";
+@import "views/amount";
@import "views/tab-home";
+@import "views/tab-receive";
+@import "views/tab-send";
@import "views/walletDetails";
@import "views/bitpayCard";
@import 'views/onboarding/onboarding';
@import "views/includes/walletActivity";
+@import "views/includes/wallets";
diff --git a/src/sass/views/amount.scss b/src/sass/views/amount.scss
new file mode 100644
index 000000000..d89984be6
--- /dev/null
+++ b/src/sass/views/amount.scss
@@ -0,0 +1,88 @@
+#view-amount {
+ @media(max-width: 480px) {
+ .bitcoin-address {
+ .icon {
+ left: 8px;
+ font-size: 24px;
+ }
+ font-size: 11px;
+ padding-left: 48px;
+ }
+ }
+
+ .amount-pane {
+ position: absolute;
+ top: 125px;
+ bottom: 0;
+ width: 100%;
+ background-color: #fff;
+ padding: 0 16px;
+
+ .amount-bar {
+ padding: 24px 0;
+ font-size: 18px;
+ .title {
+ float: left;
+ padding-top: 10px;
+ }
+ }
+ .amount {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ flex-grow: 1;
+ position: absolute;
+ bottom: 254px;
+ top: 66px;
+ }
+ }
+
+ .keypad {
+ text-align: center;
+ font-size: 24px;
+ font-weight: lighter;
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+
+ .row {
+ padding: 0 !important;
+ margin: 0 !important;
+ }
+
+ .col {
+ line-height: 40px;
+ }
+
+ .operator {
+ background-color: #eaeaea;
+ font-weight: normal;
+ cursor: pointer;
+
+ &:active {
+ background-color: #f8f8f8;
+ }
+ }
+
+ .operator-send {
+ font-weight: bolder;
+ background-color: #f7f7f7;
+ font-size: 36px;
+ cursor: pointer;
+
+ &:active {
+ background-color: #eaeaea;
+ }
+ }
+
+ .digit{
+ cursor: pointer;
+ border-top: 1px solid #eaeaea;
+ border-left: 1px solid #eaeaea;
+ &:active {
+ background-color: #eaeaea;
+ }
+ }
+
+ }
+}
diff --git a/src/sass/views/includes/wallets.scss b/src/sass/views/includes/wallets.scss
new file mode 100644
index 000000000..4f73f3ce6
--- /dev/null
+++ b/src/sass/views/includes/wallets.scss
@@ -0,0 +1,33 @@
+.wallets{
+ .slides{
+ .swiper-container{
+ width:75% !important;
+ overflow:visible;
+ }
+ .card{
+ padding: .7rem;
+ padding-left:.25rem;
+ padding-right:.25rem;
+ border-radius: .25rem;
+ }
+ .swiper-slide{
+ width:100% !important;
+ &.swiper-slide-prev, &.swiper-slide-next{
+ opacity: .2;
+ }
+ &.swiper-slide-prev{
+ left:-5%;
+ }
+ &.swiper-slide-next{
+ left:4%;
+ }
+ span{
+ float:right;
+ clear:both;
+ }
+ }
+ }
+ .swiper-pagination{
+ visibility: hidden;
+ }
+}
\ No newline at end of file
diff --git a/src/sass/views/tab-receive.scss b/src/sass/views/tab-receive.scss
new file mode 100644
index 000000000..88fd844ed
--- /dev/null
+++ b/src/sass/views/tab-receive.scss
@@ -0,0 +1,91 @@
+#tab-receive {
+ ion-header-bar{
+ button{
+ i{
+ color:#fff;
+ font-size: 1.1rem;
+ }
+ }
+ }
+ #address {
+ background: #fff;
+ .item {
+ border: none;
+ font-size: .8rem;
+ i {
+ font-size: 1.3rem;
+ &.ion-social-bitcoin-outline {
+ border-right: 1px solid rgb(228, 228, 228);
+ }
+ }
+ }
+ .bit-address {
+ font-size: .8rem;
+ .item {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ }
+ &-gen-address {}
+ }
+ }
+ #wallets {
+ position: relative;
+ &:before {
+ content: "";
+ display: inline-block;
+ width: 0;
+ height: 0;
+ border-style: solid;
+ border-width: 0 20px 20px 20px;
+ border-color: transparent transparent #f5f5f5 transparent;
+ top: -9px;
+ position: absolute;
+ left: 45%;
+ }
+ }
+ #first-time-tip {
+ background: rgba(30, 49, 134, 1);
+ background: -moz-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(30, 49, 134, 0) 88%, rgba(30, 49, 134, 0) 100%);
+ background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(30, 49, 134, 1)), color-stop(88%, rgba(30, 49, 134, 0)), color-stop(100%, rgba(30, 49, 134, 0)));
+ background: -webkit-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(30, 49, 134, 0) 88%, rgba(30, 49, 134, 0) 100%);
+ background: -o-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(30, 49, 134, 0) 88%, rgba(30, 49, 134, 0) 100%);
+ background: -ms-linear-gradient(top, rgba(30, 49, 134, 1) 0%, rgba(30, 49, 134, 0) 88%, rgba(30, 49, 134, 0) 100%);
+ background: linear-gradient(to bottom, rgba(30, 49, 134, 1) 0%, rgba(30, 49, 134, 0) 88%, rgba(30, 49, 134, 0) 100%);
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ animation-name: fadeIn;
+ animation-iteration-count: 1;
+ animation-timing-function: ease-in;
+ animation-duration: .4s;
+ animation-delay: 2s;
+ animation-fill-mode: forwards;
+ z-index: 10;
+ text-align: center;
+ color: #fff;
+ padding-top: 3rem;
+ .close {
+ top: .5rem;
+ right: 1rem;
+ position: absolute;
+ font-size: 1.5rem;
+ opacity: .5;
+ }
+ h3 {
+ color: #fff;
+ margin-bottom:1rem;
+ }
+ }
+}
+
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
diff --git a/src/sass/views/tab-send.scss b/src/sass/views/tab-send.scss
new file mode 100644
index 000000000..44d2a2b1b
--- /dev/null
+++ b/src/sass/views/tab-send.scss
@@ -0,0 +1,14 @@
+#tab-send {
+ .bitcoin-address {
+ @media(max-width: 480px) {
+ input {
+ font-size: 12px;
+ }
+ }
+ .icon {
+ line-height: 31px;
+ padding-top: 2px;
+ padding-bottom: 1px;
+ }
+ }
+}