fix merge conflicts
This commit is contained in:
commit
d5476b6ccf
31 changed files with 275 additions and 171 deletions
11
Gruntfile.js
11
Gruntfile.js
|
|
@ -224,7 +224,15 @@ module.exports = function(grunt) {
|
||||||
buildDir: './webkitbuilds',
|
buildDir: './webkitbuilds',
|
||||||
version: '0.16.0',
|
version: '0.16.0',
|
||||||
macIcns: './resources/<%= pkg.name %>/mac/app.icns',
|
macIcns: './resources/<%= pkg.name %>/mac/app.icns',
|
||||||
exeIco: './www/img/app/logo.ico'
|
exeIco: './www/img/app/logo.ico',
|
||||||
|
macPlist: {
|
||||||
|
'CFBundleURLTypes': [
|
||||||
|
{
|
||||||
|
'CFBundleURLName' : 'URI Handler',
|
||||||
|
'CFBundleURLSchemes' : ['bitcoin', '<%= pkg.name %>']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
src: ['./package.json', './www/**/*']
|
src: ['./package.json', './www/**/*']
|
||||||
},
|
},
|
||||||
|
|
@ -254,6 +262,7 @@ module.exports = function(grunt) {
|
||||||
grunt.registerTask('translate', ['nggettext_extract']);
|
grunt.registerTask('translate', ['nggettext_extract']);
|
||||||
grunt.registerTask('desktop', ['prod', 'nwjs', 'copy:linux', 'compress:linux']);
|
grunt.registerTask('desktop', ['prod', 'nwjs', 'copy:linux', 'compress:linux']);
|
||||||
grunt.registerTask('macos', ['prod', 'nwjs', 'exec:macos']);
|
grunt.registerTask('macos', ['prod', 'nwjs', 'exec:macos']);
|
||||||
|
grunt.registerTask('macos-debug', ['default', 'nwjs']);
|
||||||
grunt.registerTask('chrome', ['exec:chrome']);
|
grunt.registerTask('chrome', ['exec:chrome']);
|
||||||
grunt.registerTask('wp', ['prod', 'exec:wp']);
|
grunt.registerTask('wp', ['prod', 'exec:wp']);
|
||||||
grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']);
|
grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']);
|
||||||
|
|
|
||||||
|
|
@ -239,10 +239,10 @@ angular.module('copayApp.controllers').controller('amountController', function($
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
var amount = $scope.showAlternativeAmount ? fromFiat(_amount).toFixed(unitDecimals) : _amount.toFixed(unitDecimals);
|
var amount = $scope.showAlternativeAmount ? fromFiat(_amount) : _amount;
|
||||||
$state.transitionTo('tabs.send.confirm', {
|
$state.transitionTo('tabs.send.confirm', {
|
||||||
isWallet: $scope.isWallet,
|
isWallet: $scope.isWallet,
|
||||||
toAmount: amount * unitToSatoshi,
|
toAmount: (amount * unitToSatoshi).toFixed(0),
|
||||||
toAddress: $scope.toAddress,
|
toAddress: $scope.toAddress,
|
||||||
toName: $scope.toName,
|
toName: $scope.toName,
|
||||||
toEmail: $scope.toEmail
|
toEmail: $scope.toEmail
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
||||||
var cachedTxp = {};
|
var cachedTxp = {};
|
||||||
var isChromeApp = platformInfo.isChromeApp;
|
var isChromeApp = platformInfo.isChromeApp;
|
||||||
var countDown = null;
|
var countDown = null;
|
||||||
|
$scope.isCordova = platformInfo.isCordova;
|
||||||
$ionicConfig.views.swipeBackEnabled(false);
|
$ionicConfig.views.swipeBackEnabled(false);
|
||||||
|
|
||||||
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
$scope.$on("$ionicView.beforeEnter", function(event, data) {
|
||||||
|
|
@ -30,9 +31,6 @@ angular.module('copayApp.controllers').controller('confirmController', function(
|
||||||
$log.error('Bad params at amount');
|
$log.error('Bad params at amount');
|
||||||
throw ('bad params');
|
throw ('bad params');
|
||||||
}
|
}
|
||||||
$scope.isCordova = platformInfo.isCordova;
|
|
||||||
$scope.hasClick = platformInfo.hasClick;
|
|
||||||
$scope.data = {};
|
|
||||||
|
|
||||||
var config = configService.getSync().wallet;
|
var config = configService.getSync().wallet;
|
||||||
$scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal';
|
$scope.feeLevel = config.settings && config.settings.feeLevel ? config.settings.feeLevel : 'normal';
|
||||||
|
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('preferencesEmailController', function($scope, $ionicHistory, $stateParams, gettextCatalog, profileService, walletService, configService) {
|
|
||||||
|
|
||||||
$scope.wallet = profileService.getWallet($stateParams.walletId);
|
|
||||||
var walletId = $scope.wallet.credentials.walletId;
|
|
||||||
|
|
||||||
var config = configService.getSync();
|
|
||||||
config.emailFor = config.emailFor || {};
|
|
||||||
$scope.emailForExist = config.emailFor && config.emailFor[walletId];
|
|
||||||
$scope.email = {
|
|
||||||
value: config.emailFor && config.emailFor[walletId]
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
$scope.save = function(val) {
|
|
||||||
var opts = {
|
|
||||||
emailFor: {}
|
|
||||||
};
|
|
||||||
opts.emailFor[walletId] = val;
|
|
||||||
|
|
||||||
walletService.updateRemotePreferences($scope.wallet, {
|
|
||||||
email: val,
|
|
||||||
}, function(err) {
|
|
||||||
if (err) $log.warn(err);
|
|
||||||
configService.set(opts, function(err) {
|
|
||||||
if (err) $log.warn(err);
|
|
||||||
$ionicHistory.goBack();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
@ -1,49 +1,97 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular.module('copayApp.controllers').controller('preferencesNotificationsController',
|
angular.module('copayApp.controllers').controller('preferencesNotificationsController', function($scope, $log, $timeout, $window, lodash, configService, platformInfo, pushNotificationsService, profileService, emailService) {
|
||||||
function($scope, $rootScope, $log, $window, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService) {
|
var updateConfig = function() {
|
||||||
|
var config = configService.getSync();
|
||||||
|
$scope.appName = $window.appConfig.nameCase;
|
||||||
|
$scope.PNEnabledByUser = true;
|
||||||
|
$scope.usePushNotifications = platformInfo.isCordova && !platformInfo.isWP;
|
||||||
|
$scope.isIOSApp = platformInfo.isIOS && platformInfo.isCordova;
|
||||||
|
|
||||||
var updateConfig = function() {
|
$scope.pushNotifications = {
|
||||||
|
value: config.pushNotifications.enabled
|
||||||
var config = configService.getSync();
|
|
||||||
var isCordova = platformInfo.isCordova;
|
|
||||||
var isIOS = platformInfo.isIOS;
|
|
||||||
|
|
||||||
$scope.appName = $window.appConfig.nameCase;
|
|
||||||
$scope.PNEnabledByUser = true;
|
|
||||||
$scope.isIOSApp = isIOS && isCordova;
|
|
||||||
if ($scope.isIOSApp) {
|
|
||||||
try {
|
|
||||||
PushNotification.hasPermission(function(data) {
|
|
||||||
$scope.PNEnabledByUser = data.isEnabled;
|
|
||||||
});
|
|
||||||
} catch(e) {
|
|
||||||
$log.error(e);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.pushNotifications = {
|
|
||||||
value: config.pushNotifications.enabled
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.pushNotificationsChange = function() {
|
$scope.latestEmail = {
|
||||||
if (!$scope.pushNotifications) return;
|
value: getLatestEmailConfig()
|
||||||
var opts = {
|
|
||||||
pushNotifications: {
|
|
||||||
enabled: $scope.pushNotifications.value
|
|
||||||
}
|
|
||||||
};
|
|
||||||
configService.set(opts, function(err) {
|
|
||||||
if (opts.pushNotifications.enabled)
|
|
||||||
profileService.pushNotificationsInit();
|
|
||||||
else
|
|
||||||
pushNotificationsService.disableNotifications(profileService.getWallets());
|
|
||||||
if (err) $log.debug(err);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.$on("$ionicView.enter", function(event, data) {
|
$scope.newEmail = lodash.clone($scope.latestEmail);
|
||||||
updateConfig();
|
var isEmailEnabled = config.emailNotifications ? config.emailNotifications.enabled : false;
|
||||||
|
|
||||||
|
$scope.emailNotifications = {
|
||||||
|
value: isEmailEnabled && $scope.newEmail.value ? true : false
|
||||||
|
};
|
||||||
|
|
||||||
|
$timeout(function() {
|
||||||
|
$scope.$apply();
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.pushNotificationsChange = function() {
|
||||||
|
if (!$scope.pushNotifications) return;
|
||||||
|
var opts = {
|
||||||
|
pushNotifications: {
|
||||||
|
enabled: $scope.pushNotifications.value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
configService.set(opts, function(err) {
|
||||||
|
if (opts.pushNotifications.enabled)
|
||||||
|
profileService.pushNotificationsInit();
|
||||||
|
else
|
||||||
|
pushNotificationsService.disableNotifications(profileService.getWallets());
|
||||||
|
if (err) $log.debug(err);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.emailNotificationsChange = function() {
|
||||||
|
var opts = {
|
||||||
|
emailNotifications: {
|
||||||
|
enabled: $scope.emailNotifications.value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
configService.set(opts, function(err) {
|
||||||
|
if (err) $log.debug(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.latestEmail = {
|
||||||
|
value: getLatestEmailConfig()
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.newEmail = lodash.clone($scope.latestEmail);
|
||||||
|
|
||||||
|
if (!$scope.emailNotifications.value) {
|
||||||
|
emailService.enableEmailNotifications({
|
||||||
|
enabled: $scope.emailNotifications.value,
|
||||||
|
email: null
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$timeout(function() {
|
||||||
|
$scope.$apply();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.save = function() {
|
||||||
|
emailService.enableEmailNotifications({
|
||||||
|
enabled: $scope.emailNotifications.value,
|
||||||
|
email: $scope.newEmail.value
|
||||||
|
});
|
||||||
|
|
||||||
|
$scope.latestEmail = {
|
||||||
|
value: $scope.newEmail.value
|
||||||
|
};
|
||||||
|
|
||||||
|
$timeout(function() {
|
||||||
|
$scope.$apply();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function getLatestEmailConfig() {
|
||||||
|
var config = configService.getSync();
|
||||||
|
return config.emailFor ? lodash.values(config.emailFor)[0] : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.$on("$ionicView.enter", function(event, data) {
|
||||||
|
updateConfig();
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
|
|
@ -276,7 +276,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
templateUrl: 'views/confirm.html'
|
templateUrl: 'views/confirm.html'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
params: { paypro: null }
|
params: {
|
||||||
|
paypro: null
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.state('tabs.send.addressbook', {
|
.state('tabs.send.addressbook', {
|
||||||
url: '/addressbook/add/:fromSendTab/:addressbookEntry',
|
url: '/addressbook/add/:fromSendTab/:addressbookEntry',
|
||||||
|
|
@ -465,15 +467,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.state('tabs.preferences.preferencesEmail', {
|
|
||||||
url: '/preferencesEmail',
|
|
||||||
views: {
|
|
||||||
'tab-settings@tabs': {
|
|
||||||
controller: 'preferencesEmailController',
|
|
||||||
templateUrl: 'views/preferencesEmail.html'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.state('tabs.preferences.backupWarning', {
|
.state('tabs.preferences.backupWarning', {
|
||||||
url: '/backupWarning/:from',
|
url: '/backupWarning/:from',
|
||||||
views: {
|
views: {
|
||||||
|
|
@ -892,7 +885,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
templateUrl: 'views/confirm.html'
|
templateUrl: 'views/confirm.html'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
params: { paypro: null }
|
params: {
|
||||||
|
paypro: null
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.state('tabs.bitpayCard.preferences', {
|
.state('tabs.bitpayCard.preferences', {
|
||||||
url: '/preferences',
|
url: '/preferences',
|
||||||
|
|
@ -907,7 +902,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
.run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService) {
|
.run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService) {
|
||||||
|
|
||||||
uxLanguage.init();
|
uxLanguage.init();
|
||||||
openURLService.init();
|
|
||||||
|
|
||||||
$ionicPlatform.ready(function() {
|
$ionicPlatform.ready(function() {
|
||||||
if (platformInfo.isCordova) {
|
if (platformInfo.isCordova) {
|
||||||
|
|
@ -1000,6 +994,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
|
||||||
scannerService.gentleInitialize();
|
scannerService.gentleInitialize();
|
||||||
$state.go('tabs.home');
|
$state.go('tabs.home');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// After everything have been loaded, initialize handler URL
|
||||||
|
$timeout(function() {
|
||||||
|
openURLService.init();
|
||||||
|
}, 1000);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,10 @@ angular.module('copayApp.services').factory('configService', function(storageSer
|
||||||
windows: {},
|
windows: {},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
emailNotifications: {
|
||||||
|
enabled: false,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
var configCache = null;
|
var configCache = null;
|
||||||
|
|
|
||||||
40
src/js/services/emailService.js
Normal file
40
src/js/services/emailService.js
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('copayApp.services').factory('emailService', function($log, configService, profileService, lodash, walletService) {
|
||||||
|
var root = {};
|
||||||
|
|
||||||
|
root.enableEmailNotifications = function(opts) {
|
||||||
|
opts = opts || {};
|
||||||
|
|
||||||
|
var wallets = profileService.getWallets();
|
||||||
|
var keys = lodash.map(wallets, function(w) {
|
||||||
|
return w.credentials.walletId;
|
||||||
|
});
|
||||||
|
|
||||||
|
lodash.each(wallets, function(w) {
|
||||||
|
walletService.updateRemotePreferences(w, {
|
||||||
|
email: opts.enabled ? opts.email : null
|
||||||
|
}, function(err) {
|
||||||
|
if (err) $log.warn(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var config = configService.getSync();
|
||||||
|
if (!config.emailFor)
|
||||||
|
config.emailFor = {};
|
||||||
|
|
||||||
|
lodash.each(keys, function(k) {
|
||||||
|
config.emailFor[k] = opts.email;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!opts.enabled) return;
|
||||||
|
|
||||||
|
configService.set({
|
||||||
|
emailFor: config.emailFor
|
||||||
|
}, function(err) {
|
||||||
|
if (err) $log.debug(err);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return root;
|
||||||
|
});
|
||||||
|
|
@ -40,7 +40,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
// data extensions for Payment Protocol with non-backwards-compatible request
|
// data extensions for Payment Protocol with non-backwards-compatible request
|
||||||
if ((/^bitcoin:\?r=[\w+]/).exec(data)) {
|
if ((/^bitcoin:\?r=[\w+]/).exec(data)) {
|
||||||
data = decodeURIComponent(data.replace('bitcoin:?r=', ''));
|
data = decodeURIComponent(data.replace('bitcoin:?r=', ''));
|
||||||
$state.go('tabs.send').then(function() {
|
$state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true}).then(function() {
|
||||||
$state.transitionTo('tabs.send.confirm', {paypro: data});
|
$state.transitionTo('tabs.send.confirm', {paypro: data});
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -62,7 +62,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
handlePayPro(details);
|
handlePayPro(details);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
$state.go('tabs.send');
|
$state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true});
|
||||||
// Timeout is required to enable the "Back" button
|
// Timeout is required to enable the "Back" button
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
if (amount) {
|
if (amount) {
|
||||||
|
|
@ -70,7 +70,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
} else {
|
} else {
|
||||||
$state.transitionTo('tabs.send.amount', {toAddress: addr});
|
$state.transitionTo('tabs.send.amount', {toAddress: addr});
|
||||||
}
|
}
|
||||||
});
|
}, 100);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
@ -102,7 +102,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
var secret = getParameterByName('secret', data);
|
var secret = getParameterByName('secret', data);
|
||||||
var email = getParameterByName('email', data);
|
var email = getParameterByName('email', data);
|
||||||
var otp = getParameterByName('otp', data);
|
var otp = getParameterByName('otp', data);
|
||||||
$state.go('tabs.home').then(function() {
|
$state.go('tabs.home', {}, {'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true}).then(function() {
|
||||||
$state.transitionTo('tabs.bitpayCardIntro', {
|
$state.transitionTo('tabs.bitpayCardIntro', {
|
||||||
secret: secret,
|
secret: secret,
|
||||||
email: email,
|
email: email,
|
||||||
|
|
@ -113,14 +113,14 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
|
|
||||||
// Join
|
// Join
|
||||||
} else if (data && data.match(/^copay:[0-9A-HJ-NP-Za-km-z]{70,80}$/)) {
|
} else if (data && data.match(/^copay:[0-9A-HJ-NP-Za-km-z]{70,80}$/)) {
|
||||||
$state.go('tabs.home').then(function() {
|
$state.go('tabs.home', {}, {'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true}).then(function() {
|
||||||
$state.transitionTo('tabs.add.join', {url: data});
|
$state.transitionTo('tabs.add.join', {url: data});
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Old join
|
// Old join
|
||||||
} else if (data && data.match(/^[0-9A-HJ-NP-Za-km-z]{70,80}$/)) {
|
} else if (data && data.match(/^[0-9A-HJ-NP-Za-km-z]{70,80}$/)) {
|
||||||
$state.go('tabs.home').then(function() {
|
$state.go('tabs.home', {}, {'reload': true, 'notify': $state.current.name == 'tabs.home' ? false : true}).then(function() {
|
||||||
$state.transitionTo('tabs.add.join', {url: data});
|
$state.transitionTo('tabs.add.join', {url: data});
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -136,7 +136,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
};
|
};
|
||||||
|
|
||||||
function goToAmountPage(toAddress) {
|
function goToAmountPage(toAddress) {
|
||||||
$state.go('tabs.send');
|
$state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true});
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$state.transitionTo('tabs.send.amount', {toAddress: toAddress});
|
$state.transitionTo('tabs.send.amount', {toAddress: toAddress});
|
||||||
}, 100);
|
}, 100);
|
||||||
|
|
@ -150,7 +150,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
|
||||||
paypro: payProDetails
|
paypro: payProDetails
|
||||||
};
|
};
|
||||||
scannerService.pausePreview();
|
scannerService.pausePreview();
|
||||||
$state.go('tabs.send').then(function() {
|
$state.go('tabs.send', {}, {'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true}).then(function() {
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
$state.transitionTo('tabs.send.confirm', stateParams);
|
$state.transitionTo('tabs.send.confirm', stateParams);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,10 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop
|
||||||
// Stop it from caching the first view as one to return when the app opens
|
// Stop it from caching the first view as one to return when the app opens
|
||||||
$ionicHistory.nextViewOptions({
|
$ionicHistory.nextViewOptions({
|
||||||
historyRoot: true,
|
historyRoot: true,
|
||||||
disableBack: true,
|
disableBack: false,
|
||||||
disableAnimation: true
|
disableAnimation: true
|
||||||
});
|
});
|
||||||
|
|
||||||
var url = args.url;
|
var url = args.url;
|
||||||
if (!url) {
|
if (!url) {
|
||||||
$log.error('No url provided');
|
$log.error('No url provided');
|
||||||
|
|
|
||||||
|
|
@ -220,8 +220,9 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
|
||||||
cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + cache.unitName;
|
cache.totalBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat) + ' ' + cache.unitName;
|
||||||
cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + cache.unitName;
|
cache.lockedBalanceStr = txFormatService.formatAmount(cache.lockedBalanceSat) + ' ' + cache.unitName;
|
||||||
cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + cache.unitName;
|
cache.availableBalanceStr = txFormatService.formatAmount(cache.availableBalanceSat) + ' ' + cache.unitName;
|
||||||
|
cache.pendingBalanceStr = txFormatService.formatAmount(cache.totalBalanceSat + (cache.pendingAmount === null? 0 : cache.pendingAmount)) + ' ' + cache.unitName;
|
||||||
|
|
||||||
if (cache.pendingAmount) {
|
if (cache.pendingAmount !== null && cache.pendingAmount !== 0) {
|
||||||
cache.pendingAmountStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + cache.unitName;
|
cache.pendingAmountStr = txFormatService.formatAmount(cache.pendingAmount) + ' ' + cache.unitName;
|
||||||
} else {
|
} else {
|
||||||
cache.pendingAmountStr = null;
|
cache.pendingAmountStr = null;
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
@mixin absolute-center() {
|
@mixin absolute-center() {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
top: 50%;
|
top: 50%;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ action-sheet {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
-webkit-transform: translateY(100%) translateX(-50%);
|
||||||
transform: translateY(100%) translateX(-50%);
|
transform: translateY(100%) translateX(-50%);
|
||||||
transition: transform 250ms cubic-bezier(0.4, 0.0, 0.2, 1);
|
transition: transform 250ms cubic-bezier(0.4, 0.0, 0.2, 1);
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
|
|
@ -21,6 +22,7 @@ action-sheet {
|
||||||
overflow: scroll;
|
overflow: scroll;
|
||||||
|
|
||||||
&.slide-up {
|
&.slide-up {
|
||||||
|
-webkit-transform: translateY(0) translateX(-50%);
|
||||||
transform: translateY(0) translateX(-50%);
|
transform: translateY(0) translateX(-50%);
|
||||||
box-shadow: 0px 2px 13px 3px rgba(0, 0, 0, .3);
|
box-shadow: 0px 2px 13px 3px rgba(0, 0, 0, .3);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,14 @@ click-to-accept {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
z-index: 4;
|
z-index: 4;
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
|
-webkit-transform: translateY(2rem);
|
||||||
transform: translateY(2rem);
|
transform: translateY(2rem);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
&.enter {
|
&.enter {
|
||||||
transition: transform 250ms ease, opacity 250ms ease;
|
transition: transform 250ms ease, opacity 250ms ease;
|
||||||
|
-webkit-transform: translateY(0);
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
@ -37,9 +39,11 @@ click-to-accept {
|
||||||
|
|
||||||
@keyframes spin {
|
@keyframes spin {
|
||||||
from {
|
from {
|
||||||
|
-webkit-transform:rotate(0deg);
|
||||||
transform:rotate(0deg);
|
transform:rotate(0deg);
|
||||||
}
|
}
|
||||||
to {
|
to {
|
||||||
|
-webkit-transform:rotate(360deg);
|
||||||
transform:rotate(360deg);
|
transform:rotate(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
width: 90%;
|
width: 90%;
|
||||||
max-width: 350px;
|
max-width: 350px;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
border-radius: $unmistakable-radius;
|
border-radius: $unmistakable-radius;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ slide-to-accept {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: $slider-bg-color;
|
background: $slider-bg-color;
|
||||||
|
-webkit-transform: translateX(0);
|
||||||
transform: translateX(0);
|
transform: translateX(0);
|
||||||
margin-left: -100%;
|
margin-left: -100%;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|
@ -55,6 +56,7 @@ slide-to-accept {
|
||||||
right: -71px;
|
right: -71px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
|
-webkit-transform: translateY(-47%);
|
||||||
transform: translateY(-47%);
|
transform: translateY(-47%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -65,6 +67,7 @@ slide-to-accept {
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
|
|
||||||
> img {
|
> img {
|
||||||
|
-webkit-transform: rotateZ(-5deg);
|
||||||
transform: rotateZ(-5deg);
|
transform: rotateZ(-5deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -91,11 +94,13 @@ slide-to-accept {
|
||||||
font-size: 17px;
|
font-size: 17px;
|
||||||
letter-spacing: 0.02rem;
|
letter-spacing: 0.02rem;
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
|
-webkit-transform: translateY(2rem);
|
||||||
transform: translateY(2rem);
|
transform: translateY(2rem);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
||||||
&.enter {
|
&.enter {
|
||||||
transition: transform 250ms ease, opacity 250ms ease;
|
transition: transform 250ms ease, opacity 250ms ease;
|
||||||
|
-webkit-transform: translateY(0);
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
@ -117,9 +122,11 @@ slide-to-accept {
|
||||||
|
|
||||||
@keyframes spin {
|
@keyframes spin {
|
||||||
from {
|
from {
|
||||||
|
-webkit-transform:rotate(0deg);
|
||||||
transform:rotate(0deg);
|
transform:rotate(0deg);
|
||||||
}
|
}
|
||||||
to {
|
to {
|
||||||
|
-webkit-transform:rotate(360deg);
|
||||||
transform:rotate(360deg);
|
transform:rotate(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ slide-to-accept-success {
|
||||||
transition: transform $duration*1.5 ease, background $duration*1.5 ease;
|
transition: transform $duration*1.5 ease, background $duration*1.5 ease;
|
||||||
|
|
||||||
&.fill-screen {
|
&.fill-screen {
|
||||||
|
-webkit-transform: scale3d($scale-factor, $scale-factor, 1) translateY(-40%);
|
||||||
transform: scale3d($scale-factor, $scale-factor, 1) translateY(-40%);
|
transform: scale3d($scale-factor, $scale-factor, 1) translateY(-40%);
|
||||||
background: $success-bg-color;
|
background: $success-bg-color;
|
||||||
}
|
}
|
||||||
|
|
@ -39,12 +40,14 @@ slide-to-accept-success {
|
||||||
|
|
||||||
> img {
|
> img {
|
||||||
margin-bottom: 1.8rem;
|
margin-bottom: 1.8rem;
|
||||||
|
-webkit-transform: translateY(5rem);
|
||||||
transform: translateY(5rem);
|
transform: translateY(5rem);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: transform $duration ease, opacity $duration ease;
|
transition: transform $duration ease, opacity $duration ease;
|
||||||
transition-delay: 200ms;
|
transition-delay: 200ms;
|
||||||
|
|
||||||
&.reveal {
|
&.reveal {
|
||||||
|
-webkit-transform: translateY(0);
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
@ -53,12 +56,14 @@ slide-to-accept-success {
|
||||||
&__header {
|
&__header {
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
font-size: 26px;
|
font-size: 26px;
|
||||||
|
-webkit-transform: translateY(5rem);
|
||||||
transform: translateY(5rem);
|
transform: translateY(5rem);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: transform $duration ease, opacity $duration ease;
|
transition: transform $duration ease, opacity $duration ease;
|
||||||
transition-delay: 250ms;
|
transition-delay: 250ms;
|
||||||
|
|
||||||
&.reveal {
|
&.reveal {
|
||||||
|
-webkit-transform: translateY(0);
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
@ -71,12 +76,14 @@ slide-to-accept-success {
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
padding: 0 1.75rem;
|
padding: 0 1.75rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
-webkit-transform: translateY(5rem);
|
||||||
transform: translateY(5rem);
|
transform: translateY(5rem);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: transform $duration ease, opacity $duration ease;
|
transition: transform $duration ease, opacity $duration ease;
|
||||||
transition-delay: 250ms;
|
transition-delay: 250ms;
|
||||||
|
|
||||||
&.reveal {
|
&.reveal {
|
||||||
|
-webkit-transform: translateY(0);
|
||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,7 @@
|
||||||
width: 1px;
|
width: 1px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
-webkit-transform: translateX(-50%) translateY(-100%);
|
||||||
transform: translateX(-50%) translateY(-100%);
|
transform: translateX(-50%) translateY(-100%);
|
||||||
top: 0;
|
top: 0;
|
||||||
}
|
}
|
||||||
|
|
@ -190,6 +191,7 @@
|
||||||
width: 1px;
|
width: 1px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
-webkit-transform: translateX(-50%) translateY(100%);
|
||||||
transform: translateX(-50%) translateY(100%);
|
transform: translateX(-50%) translateY(100%);
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@
|
||||||
&.swiper-slide-prev,
|
&.swiper-slide-prev,
|
||||||
&.swiper-slide-next {
|
&.swiper-slide-next {
|
||||||
opacity: .3;
|
opacity: .3;
|
||||||
|
-webkit-transform: scale(.8);
|
||||||
transform: scale(.8);
|
transform: scale(.8);
|
||||||
}
|
}
|
||||||
&.swiper-slide-prev {
|
&.swiper-slide-prev {
|
||||||
|
|
|
||||||
|
|
@ -49,24 +49,23 @@
|
||||||
color: #fff;
|
color: #fff;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
.checkbox input:before,
|
.checkbox input:before,
|
||||||
|
.checkbox .checkbox-icon:before,
|
||||||
|
.checkbox input:after,
|
||||||
|
.checkbox-icon:after,
|
||||||
|
.checkbox input:checked:after,
|
||||||
|
input:checked + .checkbox-icon:after{
|
||||||
|
border:none;
|
||||||
|
}
|
||||||
|
.checkbox input:before,
|
||||||
.checkbox .checkbox-icon:before {
|
.checkbox .checkbox-icon:before {
|
||||||
border-radius: 50% !important;
|
padding: 1.1rem;
|
||||||
background: none;
|
|
||||||
border-width: 2px;
|
|
||||||
padding: .9rem;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
left: -7px;
|
background:url("../img/onboarding-checkbox-unchecked.svg") top center no-repeat;
|
||||||
top: -8px;
|
|
||||||
}
|
}
|
||||||
.checkbox input:checked:before,
|
.checkbox input:checked:before,
|
||||||
.checkbox input:checked + .checkbox-icon:before {
|
.checkbox input:checked + .checkbox-icon:before {
|
||||||
border-color: rgb(19, 229, 182);
|
border:none;
|
||||||
}
|
background:url("../img/onboarding-checkbox-checked.svg") top center no-repeat;
|
||||||
.checkbox input:checked:after,
|
|
||||||
input:checked + .checkbox-icon:after {
|
|
||||||
border-color: rgb(19, 229, 182);
|
|
||||||
top: 4px;
|
|
||||||
left: 3px;
|
|
||||||
}
|
}
|
||||||
.item-content {
|
.item-content {
|
||||||
width: 90%;
|
width: 90%;
|
||||||
|
|
@ -76,7 +75,8 @@
|
||||||
}
|
}
|
||||||
.item-checkbox .checkbox {
|
.item-checkbox .checkbox {
|
||||||
margin-left: 3%;
|
margin-left: 3%;
|
||||||
top:44%;
|
top:30%;
|
||||||
|
left:0;
|
||||||
}
|
}
|
||||||
#agree-to-terms {
|
#agree-to-terms {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,7 @@
|
||||||
.qr{
|
.qr{
|
||||||
padding:6vh 0 0;
|
padding:6vh 0 0;
|
||||||
div{
|
div{
|
||||||
|
-webkit-transform: scale(.7);
|
||||||
transform: scale(.7);
|
transform: scale(.7);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -119,6 +120,7 @@
|
||||||
top: -9px;
|
top: -9px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
|
-webkit-transform: translateX(-50%);
|
||||||
transform: translateX(-50%);
|
transform: translateX(-50%);
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
|
|
@ -171,9 +173,11 @@
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
@media (max-height: 600px){
|
@media (max-height: 600px){
|
||||||
&{
|
&{
|
||||||
|
-webkit-transform: translate(-50%, -58%);
|
||||||
transform: translate(-50%, -58%);
|
transform: translate(-50%, -58%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
8
www/img/onboarding-checkbox-checked.svg
Normal file
8
www/img/onboarding-checkbox-checked.svg
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<svg width="35px" height="35px" viewBox="-1 -1 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Icons/Check/Green" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<circle id="Oval-7" stroke="#12E5B6" stroke-width="2" cx="16.5" cy="16.5" r="16.5"></circle>
|
||||||
|
<polyline id="Shape" stroke="#12E5B6" stroke-width="2" points="8.42105263 17 14.3157895 23.5333333 23.1578947 10.4666667"></polyline>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 544 B |
7
www/img/onboarding-checkbox-unchecked.svg
Normal file
7
www/img/onboarding-checkbox-unchecked.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
<svg width="35px" height="35px" viewBox="-1 96 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 40.1 (33804) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<circle id="Oval-7" stroke="#647CE8" stroke-width="2" fill="none" cx="16.5" cy="113.5" r="16.5"></circle>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 404 B |
|
|
@ -7,7 +7,7 @@
|
||||||
</ion-nav-back-button>
|
</ion-nav-back-button>
|
||||||
</ion-nav-bar>
|
</ion-nav-bar>
|
||||||
|
|
||||||
<ion-content ng-class="{'slide-to-pay': !hasClick && !insuffientFunds && !noMatchingWallet}">
|
<ion-content ng-class="{'slide-to-pay': isCordova && !insuffientFunds && !noMatchingWallet}">
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<div class="item head">
|
<div class="item head">
|
||||||
<div class="sending-label">
|
<div class="sending-label">
|
||||||
|
|
@ -79,13 +79,13 @@
|
||||||
</div>
|
</div>
|
||||||
<click-to-accept
|
<click-to-accept
|
||||||
ng-click="approve(statusChangeHandler)"
|
ng-click="approve(statusChangeHandler)"
|
||||||
ng-if="hasClick && wallets[0]"
|
ng-if="!isCordova && wallets[0]"
|
||||||
click-send-status="sendStatus">
|
click-send-status="sendStatus">
|
||||||
Click to pay
|
Click to pay
|
||||||
</click-to-accept>
|
</click-to-accept>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
<slide-to-accept
|
<slide-to-accept
|
||||||
ng-if="!hasClick && wallets[0]"
|
ng-if="isCordova && wallets[0]"
|
||||||
slide-on-confirm="onConfirm()"
|
slide-on-confirm="onConfirm()"
|
||||||
slide-send-status="sendStatus">
|
slide-send-status="sendStatus">
|
||||||
Slide to pay
|
Slide to pay
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@
|
||||||
<div>{{wallet.name}}</div>
|
<div>{{wallet.name}}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="item single-line">
|
<div class="item single-line" ng-if="btx.action != 'received'">
|
||||||
<span class="label" translate>Created by</span>
|
<span class="label" translate>Created by</span>
|
||||||
<span class="item-note">
|
<span class="item-note">
|
||||||
{{btx.creatorName}} <time>{{ (btx.ts || btx.createdOn ) * 1000 | amDateFormat:'MM/DD/YYYY hh:mm a'}}</time>
|
{{btx.creatorName}} <time>{{ (btx.ts || btx.createdOn ) * 1000 | amDateFormat:'MM/DD/YYYY hh:mm a'}}</time>
|
||||||
|
|
@ -66,11 +66,16 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="item single-line">
|
<div class="item single-line">
|
||||||
<span class="label" translate>Confirmations</span>
|
<span class="label" translate>Confirmations</span>
|
||||||
<span class="item-note" ng-if="btx.confirmations < 6">
|
<span class="item-note">
|
||||||
{{btx.confirmations}}
|
<span class="assertive" ng-show="!btx.confirmations || btx.confirmations == 0" translate>
|
||||||
</span>
|
Unconfirmed
|
||||||
<span class="item-note" ng-if="btx.confirmations >= 6">
|
</span>
|
||||||
6+
|
<span ng-show="btx.confirmations>0 && !btx.safeConfirmed">
|
||||||
|
{{btx.confirmations}}
|
||||||
|
</span>
|
||||||
|
<span ng-show="btx.safeConfirmed">
|
||||||
|
{{btx.safeConfirmed}}
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div ng-if="actionList[0]">
|
<div ng-if="actionList[0]">
|
||||||
|
|
|
||||||
|
|
@ -29,14 +29,6 @@
|
||||||
</span>
|
</span>
|
||||||
<i class="icon bp-arrow-right"></i>
|
<i class="icon bp-arrow-right"></i>
|
||||||
</a>
|
</a>
|
||||||
<a class="item has-setting-value item-icon-right" ui-sref="tabs.preferences.preferencesEmail">
|
|
||||||
<span class="setting-title" translate>Email Notifications</span>
|
|
||||||
<span class="setting-value">
|
|
||||||
<span ng-if="!wallet.email" translate>Disabled</span>
|
|
||||||
<span ng-if="wallet.email">{{wallet.email}}</span>
|
|
||||||
</span>
|
|
||||||
<i class="icon bp-arrow-right"></i>
|
|
||||||
</a>
|
|
||||||
<div class="item item-divider" translate>
|
<div class="item item-divider" translate>
|
||||||
Security
|
Security
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
<ion-view class="settings">
|
|
||||||
<ion-nav-bar class="bar-royal">
|
|
||||||
<ion-nav-title>
|
|
||||||
{{'Email Notifications'|translate}}
|
|
||||||
</ion-nav-title>
|
|
||||||
<ion-nav-back-button>
|
|
||||||
</ion-nav-back-button>
|
|
||||||
</ion-nav-bar>
|
|
||||||
<ion-content>
|
|
||||||
<div class="settings-explanation">
|
|
||||||
<div class="settings-description" translate>
|
|
||||||
You'll receive email notifications about payments sent and received from {{wallet.name}}.
|
|
||||||
</div>
|
|
||||||
<a href ng-if="emailForExist" class="settings-description-disabled" ng-click="save(null)" translate>Remove email notifications</a>
|
|
||||||
</div>
|
|
||||||
<form name="emailForm" ng-submit="save(email.value)" novalidate>
|
|
||||||
<div class="list settings-input-group">
|
|
||||||
<label class="item item-input item-stacked-label">
|
|
||||||
<span class="input-label" translate>Email Address</span>
|
|
||||||
<input type="email" id="email" name="email" ng-model="email.value" required></input>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<button type="submit"
|
|
||||||
class="button button-standard button-primary"
|
|
||||||
ng-disabled="emailForm.$invalid" translate>
|
|
||||||
Save
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</ion-content>
|
|
||||||
</ion-view>
|
|
||||||
|
|
@ -7,20 +7,44 @@
|
||||||
|
|
||||||
<ion-content>
|
<ion-content>
|
||||||
<div class="list">
|
<div class="list">
|
||||||
<div ng-show="PNEnabledByUser">
|
<div class="item item-divider" translate>Notifications</div>
|
||||||
<div class="item item-divider" translate>Notifications</div>
|
|
||||||
|
|
||||||
<ion-toggle ng-model="pushNotifications.value" toggle-class="toggle-balanced" ng-change="pushNotificationsChange()">
|
<div ng-if="PNEnabledByUser">
|
||||||
|
<ion-toggle ng-model="pushNotifications.value" toggle-class="toggle-balanced" ng-change="pushNotificationsChange()" ng-if="usePushNotifications">
|
||||||
<span class="toggle-label" translate>Enable push notifications</span>
|
<span class="toggle-label" translate>Enable push notifications</span>
|
||||||
</ion-toggle>
|
</ion-toggle>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ng-show="!PNEnabledByUser && isIOSApp">
|
<div ng-if="!PNEnabledByUser && isIOSApp">
|
||||||
<div class="item item-divider" translate>Notifications</div>
|
|
||||||
<div class="padding text-light" translate>
|
<div class="padding text-light" translate>
|
||||||
Push notifications for {{appName}} are currently disabled. Enable them in the Settings app.
|
Push notifications for {{appName}} are currently disabled. Enable them in the Settings app.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ion-toggle ng-model="emailNotifications.value" toggle-class="toggle-balanced" ng-change="emailNotificationsChange()">
|
||||||
|
<span class="toggle-label" translate>Enable email notifications</span>
|
||||||
|
</ion-toggle>
|
||||||
|
|
||||||
|
<div ng-if="emailNotifications.value">
|
||||||
|
<div class="settings-explanation">
|
||||||
|
<div class="settings-description" translate>
|
||||||
|
You'll receive email notifications about payments sent and received from your wallets.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form name="emailForm" ng-submit="save()" novalidate>
|
||||||
|
<div class="list settings-input-group">
|
||||||
|
<label class="item item-input item-stacked-label">
|
||||||
|
<span class="input-label" translate>Email Address</span>
|
||||||
|
<input type="email" id="email" name="email" ng-model="newEmail.value" required></input>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<button type="submit"
|
||||||
|
class="button button-standard button-primary"
|
||||||
|
ng-disabled="emailForm.$invalid || (newEmail.value == latestEmail.value)" translate>Save
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ion-content>
|
</ion-content>
|
||||||
</ion-view>
|
</ion-view>
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@
|
||||||
Incomplete
|
Incomplete
|
||||||
</span>
|
</span>
|
||||||
<span ng-if="wallet.isComplete()">
|
<span ng-if="wallet.isComplete()">
|
||||||
<span ng-if="!wallet.balanceHidden">{{wallet.status.availableBalanceStr}}</span>
|
<span ng-if="!wallet.balanceHidden">{{wallet.status.pendingBalanceStr}}</span>
|
||||||
<span ng-if="wallet.balanceHidden" translate>[Balance Hidden]</span>
|
<span ng-if="wallet.balanceHidden" translate>[Balance Hidden]</span>
|
||||||
<span class="tab-home__wallet__multisig-number" ng-if="wallet.n > 1">
|
<span class="tab-home__wallet__multisig-number" ng-if="wallet.n > 1">
|
||||||
{{wallet.m}}-of-{{wallet.n}}
|
{{wallet.m}}-of-{{wallet.n}}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
|
|
||||||
<div class="item item-divider" translate>Preferences</div>
|
<div class="item item-divider" translate>Preferences</div>
|
||||||
|
|
||||||
<a class="item item-icon-left item-icon-right" ui-sref="tabs.notifications" ng-show="usePushNotifications">
|
<a class="item item-icon-left item-icon-right" ui-sref="tabs.notifications">
|
||||||
<i class="icon big-icon-svg">
|
<i class="icon big-icon-svg">
|
||||||
<img src="img/icon-notifications.svg" class="bg"/>
|
<img src="img/icon-notifications.svg" class="bg"/>
|
||||||
</i>
|
</i>
|
||||||
|
|
|
||||||
|
|
@ -38,10 +38,11 @@
|
||||||
|
|
||||||
|
|
||||||
<div ng-click='updateAll(true)' ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && !wallet.balanceHidden" on-hold="hideToggle()">
|
<div ng-click='updateAll(true)' ng-show="!updateStatusError && wallet.walletScanStatus != 'error' && !wallet.balanceHidden" on-hold="hideToggle()">
|
||||||
<strong class="size-36">{{status.totalBalanceStr}}</strong>
|
<strong ng-if="!status.pendingAmount" class="size-36">{{status.totalBalanceStr}}</strong>
|
||||||
<div class="size-14 amount-alternative" ng-if="status.totalBalanceAlternative">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</div>
|
<div ng-if="!status.pendingAmount" class="size-14 amount-alternative" ng-if="status.totalBalanceAlternative">{{status.totalBalanceAlternative}} {{status.alternativeIsoCode}}</div>
|
||||||
<div class="size-14" ng-if="status.pendingAmount">
|
<div class="size-20" ng-if="status.pendingAmount">
|
||||||
<span translate>Pending Confirmation</span>: {{status.pendingAmountStr}}
|
<div style="margin-bottom:.5rem"><span translate>Available</span>: {{status.totalBalanceStr}}</div>
|
||||||
|
<div><span translate>Confirming</span>: {{status.pendingAmountStr}}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue